ようこそゲストさん

CPA-LABテクニカル

2008/03/10(月) Semailバージョンアップ1.0.2.b(CakePHP日本語高機能メールコンポーネント)

CakePHP用高機能メールコンポーネントSemailのバージョンアップです。ご指摘のあった添付フィルの Content-Typeヘッダ(mimeタイプ)周辺を整備したほか、いくつかの改良をしています。
基本的な使い方は、CakePHP用高機能メールコンポーネントSemailをご参照下さい。

主な改良点

  1. 添付ファイルのContent-typeの自動設定
  2. 添付ファイルのContent-typeの自在設定(ユーザーによる任意設定)
  3. 添付ファイル指定方法の拡張(CakePHPならでは配列地獄形式)
  4. 自動拡張子補完機能(OFFにすることもできます。)
  5. ダイレクトモードの修正&mimetype指定
  6. mb_detect_orderのデフォルト設定は見送りました。
    (環境によって異なると考えられるため)

ダウンロード

semail1.0.2.zip


ひとつづつ解説していきます。

添付ファイルのContent-typeの自動設定

docomoのある機種に適切に画像ファイルを送れないという不具合に対処しました。(donkunさん、ご指摘ありがとうございました。)
  • サーバーに保存してあるファイル名の拡張子から、適切にMimeTypeを選び出し、添付ファイルのContent-typeヘッダに付加します。
(Emailコンポーネントのデフォルトでは、mimeのサブタイプのみの設定でしたが、本タイプについても指定するようにしました。)
例1) hogehoge.jpg → image/jpeg
例2) hogehoge.pdf → application/pdf
例3) hogehoge.doc → application/msword
例4) hogehoge.amr → video/3gpp
ただし私は au の実機( W31CA )しか持っていませんので、携帯の他のキャリア、機種の検証ができません。もし不具合等ありましたらご指摘いただければ幸いです。(ホント携帯はややこしいです。。。)


対応しているタイプの一覧は、この記事の一番下に書いておきます*1

添付ファイルのContent-typeの自在設定(ユーザーによる任意設定)

自分で、「添付ファイルのContent-type」を指定したい人は、以下の方法で指定できます。
なお、当該Content-typeを自分で設定したい方は、新しい添付ファイルの指定方法でなければなりません*2

$attach_1 = array(
    'serverName' => 'hogehoge.txt' , 
    'CType' => 'plain/txt' ,   //お好きなタイプをどうぞ。 
);

$attach = array( $attach_1 );

$this-> Semail -> send( $content , $template , $layout , $attach );

ようは、sendメソッドに渡す第4引数が、array(array()) の形になっていて、キーが、'CType' であれば、いいです。添付ファイルは複数それぞれ指定できます。
(CとTは大文字なので気をつけて下さい。)

ダイレクトモードの場合
$attach_1 = array(
    'directMode'=>true,
    'attachName' => 'hogehoge.txt' , 
    'content' => 'コンテンツだべ~。ようはファイルの中身だべ~。' , 
    'CType' => 'plain/txt' ,   //お好きなタイプをどうぞ。 
);

$attach = array( $attach_1 );

$this-> Semail -> send( $content , $template , $layout , $attach );

添付ファイル指定方法の拡張(CakePHPならでは配列地獄形式)

これまで添付ファイルは、$attach= array( '日本語ファイル名' => 'サーバーファイル名' )という形式でしたが、新たに下記の方式でも指定できるようにしました。
添付ファイルは配列にして渡すことでいくつでも指定できます。

なお、従前の指定方式を easy タイプ。今回の方式を normal タイプと勝手に称しました。


ノーマルタイプの指定方法( not Directモード )

array(
    array(
        'severName' => 'hogehoge.txt',   // サーバー上でのファイル名---必須(not Directの場合)
        'attachName' => '添付ファイル名(日本語OK)',   //省略可能
        'CType' => 'type/subtype',  // 指定したいmimeタイプ(COntent-typeヘッダ) 省略可能
    ),
 )

ノーマルタイプの指定方法( Directモード )
array(
    array(
        'directMode'=>true,
        'attachName' => '添付ファイル名(日本語OK)',   //必須( Directモード時 )
        'content' => 'ファイルの中身だべ~',   //必須( Directモード時 )
        'CType' => 'type/subtype',  // 指定したいmimeタイプ(COntent-typeヘッダ) 省略可能
    ),
 )

こうした配列 (例えば $attach) に代入して、以下のように sendメソッドの第4引数に指定してください。
$this-> Semail -> send( $content , $template , $layout , $attach );
従前からのeasyタイプの指定方法は、こちらをご参考ください。
Easyタイプ 添付ファイル指定

自動拡張子補完機能(OFFにすることもできます。)


添付ファイル名に拡張子がなかった場合、サーバーファイル名についている拡張子を、自動的に添付ファイルにも付加します。

例)
ノーマルタイプ& not Directモード

array(
    array(
        'serverName' => 'cat.gif',   
        'attachName' => 'ネコのサンプル画像',   
    ),
 )
とすると以下のようになります。
添付ファイル名 : ネコのサンプル画像.gif
(Content-typeも image/gif でセットされます)


もちろん、attachName に拡張子をつけて指定した場合は、この機能は働きません。ユーザーのつけた拡張子を優先します。


こんな機能は余計なお世話だよ!という方
この機能をkillするには
          $this -> Semail -> spok_auto_filetype = false ;
としてください。

ダイレクトモードの修正&mimetype指定

果たして需要があったのかなかったのか、自己満足のダイレクトモードですが、若干の修正をしました。
directPrefix() の固定化
これまで、このメソッドは実行されるごとに異なる値を返していましたが、
$pre=$this->Semail->directPrefix();
一度発行した値は変えないようにしました。従って、いったん $pre 変数などに代入しなくても大丈夫です。
以前は、エラーとなった以下の指定方法 でも 大丈夫になりました。
unset($attach);
$attach[$this->Semail->directPrefix().'添付ファイル名1(日本語OK)'] = "送りたいファイルの中身データ1";
$attach[$this->Semail->directPrefix().'添付ファイル名2(日本語OK)'] = "送りたいファイルの中身データ2";
$attach['添付ファイル名3(日本語OK)'] = 'filename(ディスク上のファイル名)3' ;
$this->Semail->send( 'メール本文' , NULL , NULL , $attach );

もちろん、これまでの指定方法でも大丈夫です。
ダイレクトモードであっても、添付ファイルの拡張子が設定されていれば、そこから適切なmimeタイプをContent-typeヘッダに付加します。

 ダイレクトモード指定

easyタイプの指定方法は従前通りですが、ノーマルタイプ(新タイプ)の指定方法(配列地獄形式)の場合は、 'directMode'=>true, が必要となりますので、ご留意ください。
(serverNameがなければダイレクトモードでもよかったのだけど。。。。)

新タイプの場合は、 $this->Semail->directPrefix() を呼び出す必要はありません。

(ダイレクトモードとは、サーバー上に保存されているファイルを添付するのでなく、変数の中身を直接、添付ファイルにする方法です)

その他

  • ダイレクトモード、ノーマルタイプ、イージータイプをごちゃまぜにして、複数の添付ファイルを指定しても大丈夫なようにしてあります(したつもりです)。
  • mb_detect_order の デフォルト設定については、見送りました。自分として確証のある順番が見いだせなかったからです。現在は、ユーザーの設定に従います。
  • なぜか文字コード変換がうまくいかない方は、Semailで、どうもうまく文字コード変換をしない時の対処法をご参照下さい。

*1 : どのファイルタイプをデフォルトで持っておくかは相当悩みましたが、こうなりました。もっと少なくてもよかったかも

*2 : さらに下で詳しく解説しています。

携帯に 着うたファイルなどを送る場合の注意点

例えば、.amc という拡張子のファイルは、音楽のみの場合と、動画も込みの場合があるようです。その場合、同じ .amc という拡張子でも以下のように使い分けるべきです。
音楽のみ:audio/3gpp2
動画もあり:video/3gpp2
しかし、Semailでは、拡張子からしか判断できませんので、audioとvideoの両方が指定可能な拡張子については、 video を指定するようにしています。


したがって、音楽のみのファイルを添付ファイルで送る場合などは、ご自分で、Mimetype(Content-type)を設定したほうがいいかと思います。

この拡張子だけでなく、amr (docomo) なども同じです。他にもあると思います。

付録 対応した 拡張子 - Mimeタイプ(Content-type)

他にも対応しておいた方がいいタイプがあったら、ぜひご指摘ください。

'txt'=>'text/plain',
'csv'=>'text/csv',
'xml'=>'text/xml',
'htm'=>'text/html',
'html'=>'text/html',
'gif'=>'image/gif',
'jpg'=>'image/jpeg',
'jpeg'=>'image/jpeg',
'png'=>'image/png',
'tif'=>'image/tiff',
'tiff'=>'image/tiff',
'bmp'=>'image/x-bmp',
'ps'=>'appilcation/postscript',
'eps'=>'appilcation/postscript',
'epsf'=>'appilcation/postscript',
'ai'=>'application/postscript',
'zip'=>'application/zip',
'lzh'=>'application/x-lzh',
'tar'=>'application/x-tar',
'gzip'=>'application/x-tar',
'cpt'=>'application/mac-compactpro',
'doc'=>'application/msword',
'xls'=>'application/vnd.ms-excel',
'ppt'=>'application/vnd.ms-powerpoint',
'rtf'=>'application/rtf',
'pdf'=>'application/pdf',
'css'=>'application/css',
'au'=>'audio/basic',
'rpm'=>'audio/x-pn-realaudio-plugin',
'swa'=>'application/x-director',
'mp3'=>'audio/mpeg',
'mp4'=>'audio/mp4',
'wav'=>'audio/x-wav',
'midi'=>'audio/midi',
'avi'=>'vide/x-msvideo',
'mpeg'=>'video/mpeg',
'mpg'=>'video/mpeg',
'wmv'=>'video/x-ms-wmv',
'flash'=>'application/x-shockwave-flash',
'mmf'=>'application/x-smaf ',    //softbank chakumero
'smaf'=>'application/x-smaf',    //softbank chakumero
'hdml'=>'text/x-hdml',           // HDML au,docomo
'3gpp2'=>'video/3gpp2',          // au chaku-uta,ez-movie
'3g2'=>'video/3gpp2',            // au chaku-uta,ez-movie
'amc'=>'video/3gpp2',            // au chaku-uta,ez-movie
'kjx'=>'application/x-kjx',      // au ez-apri
'3gpp'=>'video/3gpp',            // docomo chaku-uta,movie
'3gp'=>'video/3gpp',             // docomo chaku-uta,movie
'amr'=>'video/3gpp',             // docomo chaku-uta,movie
'asf'=>'video/3gpp',             // docomo chaku-uta,movie
'jam'=>'application/x-jam',      // docomo i-apri
'jar'=>'application/java-archive',             // java apri
'jad'=>'text/vnd.sun.j2me.app-descriptor',    // java apri
'exe'=>'application/octet-stream',
これらのmimeTypeについては、以下のサイトを参考にさせていただきました。
MIME Media Types
perl の CGI や PHP でよく出力する Content-type ヘッダ一覧 (MIME-type) | perl/CGI | 阿部辰也のブログ――人生はひまつぶし。
情報センター/MIME Content-Type 表
content-type一覧
携帯サイトのSMAF着メロ、着うた、ムービー、iモーション、着モーションなどのデータのMIMEタイプ
着信メロディのファイルの拡張子

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/0107/tb/
  • Openid.ne.jpに登録しなかった理由 CPA-LABテクニカル spok
    OpenIDを取得しようとして、OpenID.ne.jpというサイトに登録しようと登録手続を行った。ら、驚愕の事実がっ!登録確認メールとして、文字化けメールが来た。Subject: 縲唇penID.ne.jp驕句霧莠句漁螻€縲代€€隱崎ィシURL繧偵け繝ェ...