ヘッダ、本文に別々のCharsetを指定する

2008/04/17 未分類 spok
かなり特殊な状況ですが、本文とヘッダーに別々の文字コードを使用したいときがあります。
その時は次のようにします。

ユーザーソースコードで対応する方法

ヘッダISO-2022-JP7bit
本文UTF-8base64
$mail = & Qdmail();

$mail -> charsetHeader( 'iso-2022-jp' , '7bit' ) ;
$mail -> charsetBody( 'utf-8' , 'base64' ) ;
Qdmailは、iso-2022-jpがデフォルトなので、上記の例でいうと$mail -> charsetHeaderはなくても、意図の通りに動作しますが、説明のために明示しています。

Qdmailのソースコード改変で対応する方法(UTF-8,BASE64)

$charset_content と$content_transfer_enc_text、$content_transfer_enc_htmlを定義している以下の部分をテキストエディタなどで検索して、以下のように修正してください。
var $charset_content = 'utf-8';
var $content_transfer_enc_text	= 'base64';
var $content_transfer_enc_html	= 'base64';

改版履歴

2008/04/17 更新情報 spok
Qdmaiのダウンロードページはこちら
  • 2008-08-20
    • 1.0.5b , qdmail.0.9.4.002
      添付ファイル送信時の不具合を修正
      Content-Disposition: attachment; とすべきところを、Content-Disposition: attachement;となっていた。
  • 2008-08-18
    • 1.0.4b
      qd_send_mail での第1引数が配列でない場合にエラーが出るバグの修正
  • 2008-08-13
    • 1.0.3b
      sizeメソッド新設
      smtpDataメソッド新設
      render_mode 新設
  • 2008-08-09
    • 0.9.4.001
      mime_stringメソッドの修正(1系と同じにした)
  • 2008-08-08
    • 1.0.2b , 0.9.4
      decoJudgeメソッド不具合の修正。d.vodafone.ne.jpなどが正しく判定できなかった点を修正。
      thanks to nnnnnnさん!
  • 2008-08-05
    • 1.0.1b , 0.9.3
      デコメのディズニー携帯への仮対応(テストしていないので、正しく送信できるかどうか不明)
  • 2008-08-02
    • 1.0.0b
      1.0.0のベータ版公開。前より高機能、前より軽め
  • 2008-07-26
    • 0.9.2
      アルファー版からベータ版を飛び越えて、正式版へ移行
      gmail.comにデコメを送信する時はDocomoバージョンとした。
      attach()の一部変更。
  • 2008-07-24
    • 0.9.1a
      CakePHPでのSMTP送信時にエラーがでていた点の修正
      Special Thanks to Sさん!
  • 2008-07-19
    • 0.9.0a
      setSmtpObject()メソッドの追加
      Qdsmtpとの連携関係を修正(smtpObject()他)
  • 2008-06-28
    • 0.8.9a
      addHeaderメソッドのバグ修正
      $this->other_headerプロパティ追加
  • 2008-06-25
    • 0.8.8a
      mb_convert_kana の Vオプション追加
      easyモードで、$this->body_build_onceがtrueになっていたのをfalseになるよう変更。
      デコメールのauto_decoモード時に、PCアドレスに対してはMHTML形式で送るように変更。
  • 2008-06-23
    • 0.8.7a
      メンバ変数 language = 'ja' 追加
      メンバ変数 kana = false 追加
      半角カナを全角カナに変換するルーチンを追加(mime_string , makeContent )
  • 2008-06-18
    • 0.8.6a
      qmailを自動判定し、その場合には、改行コードをLFのみにするようにした。
      isQmail(),lineFeed()関数の増設。
  • 2008-06-16
    • 0.8.5a
      ISO-2022-JP時のMIMEエンコーディングの不具合修正。エスケープシーケンスが2重になってたのを回避するようにした。
      Thanks to kei さん!
  • 2008-06-01-2
    • 0.8.4a
      インテリジェントワードラップの不具合を修正。
      0.8.0aにバージョンアップした際の修正ミスでした。
      (mail関数に渡す時には本文LFなのに、その後の処理をCRLF前提で行っていた)
      その他、デバッグルーチン一部変更。
  • 2008-06-01
    • 0.8.3a
      ライセンスをMIT Liceseに変更。(CakePHPと同じです。)
      AGPLv3に比べ緩いライセンスにしました。もちろん、個人、企業、商用、すべて無料です。
  • 2008-05-27
    • 0.8.2a
      base64エンコード + textメールの時に htmlメールになってしまう不具合を修正。
      thanks Kumaさん!
  • 2008-05-15
    • 0.8.1a
      MIMEエンコーディングの不具合を修正。
      (マルチバイト文字単位&エンコード)
  • 2008-5-08
    • 0.8.0a
      添付ファイル名(日本語)が処理されない不具合を修正。
      本文の改行コードにつき、mail関数の時はLFコード、SMTP送信の時はシステム設定に従うように変更
  • 2008-4-28
    • 0.7.9a
      ウィルコム(Willcom)のデコメ(デコラティブメール)にも対応しました。
  • 2008-4-28
    • 0.7.8a
      CakePHPでレイアウト、エレメントを指定しても、正しく動作しなかった不具合を修正。
      (Thanks to 通りすがりさん!)
  • 2008-4-25
    • 0.7.7a
      分割送信時に不要な際ビルド(添付ファイル)をしないように修正(速度対策)。
      分割送信時に、本文をキャッシュする機能追加(デフォルトはOFF)
      一般関数 qd_send_mail を追加(ベタ書き対処)(CakePHPオプション付き)
  • 2008-4-24
    • 0.7.6a
      CakePHP対応 1.1 & 1.2 (コンポーネントとして動作)
      SMTP送信のための布石をいくつか
      Noticeエラー修正。$this->contentを初期化から配列型に変更
      文末の改行は削除するように仕様変更
  • 2008-4-23
    • 0.7.5a
      Noticeエラーがでていた部分の修正
  • 2008-4-23
    • 0.7.4a
      連続してメールを送信した場合に、ヘッダーとボディが更新されない問題を修正
      連続してメール送信した場合に、ログがおかしくなる問題を修正
      SMTP送信へ向けてのソース整理
  • 2008-4-21
    • 0.7.3a 
      ワードラップユーザーインタフェイスのバグ修正
      ワードラップの改行処理修正
      ユーザーが入れた改行が削除されてしまう不具合を修正
      禁則処理の追加
  • 2008-4-16
    • 0.7.2a 
      inlineMode()メソッド追加
      OOPでのデコメ指定時の不具合を修正
  • 2008-4-16
    • 0.7.1a 
      本文最初に余分の改行が入っていたのを修正。
      charsetAttach()を追加。
  • 2008-4-16
    • 0.7.0a 初版アップロード

文字コードについて

2008/04/17 文字コード spok
日本語メールでもっとも文字化けが少ない文字コードは、
キャラクタセット:ISO-2022-JP
エンコード   :7bit
です。

Qdmailは、Quicklyにメールを作成するために、ユーザーから特に指示がない限り、iso-2022-jp,7bitに変換して送ります。

ただし、Qdmailは、Dteiledに指定を変えることができます。
例えば、以下のような組み合わせも、日本語メールでよく使われます。
キャラクタセットエンコードメリットデメリット
UTF-8Base64多言語対応。丸数字など多彩な文字を送付可能base64に対応していないWEBメールなどでは文字化けすることもある。base64は、通常エンコードに比べて、約1.3倍に容量が増える
Shift-JIS7bit機種依存文字を送付可能。日本語以外対応できない。文字化けがでることもある
UTF-8Qauted-Printableんーどうなんでしょ。ヨーロッパではQPエンコードが多いそうだ対応していないメーラーも多い
他にも様々な組み合わせが考えられます。
今後はUTF-8のメールが増えると私は予想しています。
ここでは、文字コードに関係する様々なQdmailのオプションの設定方法をみてみましょう。

添付ファイルの指定(OOP)

2008/04/17 未分類 spok
添付ファイルのOOP的指定方法です。

オブジェクトの生成や他のアドレスの指定は省略します。それらは、基本的な使い方-OOP編をみてください。
Qdmailでは、いくつでもファイルを添付することが出来ます。

簡単な指定方法

$mail -> attach( 'test.jpg' );
ファイル名は、呼びだしもとのスクリプトからの相対パスでしていします。
絶対パスでも指定できます。

例)
/home/hogehoge/images/test.jpg //絶対パス方式
./images/test.jpg //相対パス方式

簡単な指定方法2(日本語ファイル名)

$mail -> attach( array('test.jpg' , '添付ファイル名(日本語OK)' ) );

複数ファイルの指定方法(その1)

現在、この方法は指定できません。
$attachPath = array( 'test.jpg' , 'test2.gif' );
$attachName = array( '添付ファイル名1' , '添付ファイル名2' );

$mail -> attach ( $attachPath , $attachName );

1.1.0bより復活させました。ただし、制限事項があります。
$attachPath = array( 'test.jpg' , 'test2.gif' );
$mail -> attach ( $attachPath , $attachName );
この方式で添付ファイル名は指定できません。

この指定ができるのは、インラインモードtrue or シンプルアタッチモードtrueの時だけです。
インラインモードは、
$mail ->inlineMode(true);
ただし、qd_send_mailでデコメ送信時は自動的にインラインモードになります。

シンプルアタッチモードは、
$mail->simpleAttach(true);
です。

シンプルアタッチモード、インラインモードであっても、他の指定方法を併用できます。
ただし、 $attach = array( filename , attach_name );だけは併用できませんので、その場合は、$attach = array( array(filename , attach_name) );と入れ子にしてください。

複数ファイルの指定方法(その2)

$attach[] = array( 'test.jpg' , '添付ファイル名1' );
$attach[] = array( 'test2.gif' , '添付ファイル名2' );

$mail -> attach ( $attach );

複雑な添付ファイルの指定方法(MIMEタイプとContent-IDを独自指定)

$attach = array(
    'PATH' => 'test.jpg' ,
    'NAME' => '添付ファイル名1',
    'CONTENT-TYPE'=>'anything/mimetype',
    'CONTENT-ID'=>'image_0001',
 );

$mail -> attach ( $attach );

キャラクタセット、エンコードの指定方法UTF-8,BASE64等

2008/04/17 文字コード spok
通常、日本語はISO-2022-JPで送ることがもっとも安全ですが、UTF-8 + base64 もよく使われます。ここでは、ユーザーが自分でキャラクタセットやエンコード方法を指定する方法をみてみましょう。
$mail = & new Qdmail( 'UTF-8' , 'base64' );
これで、ヘッダー、本文、添付ファイルの添付名のすべてが、UTF-8になります。
特殊ですが、Quoteod-Printableで設定したい人は、base64の代わりに、「Quoteod-Printable」または「QP」と指定してください。

$mail = new Qdmail(); としてあとに、次のような指定もできます。
$mail -> charset( 'UTF-8' , 'base64' );
簡単ですね。

Qdmailは、自在にcharsetを変更することができるのです。

ちなみに、引数は配列にして
$mail -> charset( array('UTF-8' , 'base64') );
と書くこともできます。