ようこそゲストさん

CPA-LABテクニカル

2008/02/20(水) CakePHPの日本語高機能メールコンポーネントSemail

Semail Componentとは

現在はもっと高機能なQdmailがありますのでよかったら、Qdmailの方をお使い下さい。

Semailは更新停止しています。
日本語メール&CakePHPのためのメールコンポーネントです。
CakePHP1.2のEmailComponentは、それなりに高機能だけど、やはりマルチバイト(日本語)に若干弱い。なので、日本人のためのEmailComponent(改)として、 SemailComponentを作ってみた。日本語機能の強化だけでなく、簡単に添付ファイルを送れるなど若干の機能向上も図っている。ただし、もともとのEmailComponentがなければ、ここまでのものはできませんでした。オリジナル制作者の方々に敬意を表します。
ただし私の職業をみればわかるように、ITの専門家ではありません。
あくまでも人柱として覚悟のある方がご利用ください。Spokの頭文字をつけさせていただきました。
  • (2008/2/27 バージョン1.0.1に上がりました)
  • (2008/3/10 バージョン1.0.2に上がりました)
  • (2008/3/19 バージョン1.0.3に上がりました)
参照Semail ver1.0.2にバージョンアップ(新しい使い方も掲載しているので見て下さい。)
参照Semail ver1.0.3にバージョンアップ

特徴

  1. 初心者には簡単に、上級者には複雑な設定も可能な構成
  2. CakePHP1.2のEmailComponentの改造版なので、基礎的信頼性抜群!(笑)
    なので、基本的な使い方はCakePHP1.2EmailCOmponentと同じです。
  3. to,cc,bccに日本語の宛先使用可能。エンコードの複雑な設定不要。
  4. cc,bccはもちろん、to にも、複数人を日本語で指定可能
  5. コーディング文字コードに係わらず動作可能(のはず)
  6. 文字化けが最小のデフォルト設定
    iso-2022-jpがデフォルト
  7. utf-8,SJIS,その他任意の文字コードのメールを作成可能こちら
  8. 本文のbase64エンコード対応こちら
  9. ヘッダーと本文のエンコード分離可能こちら
  10. htmlメールをCakePHPのView機能で簡単に作成可能
    (これはCakePHP1.2EmailComponentの機能です)
  11. 添付ファイルも簡単に添付可能
  12. 日本語の添付ファイル名が簡単に作成可能
  13. 文字列変数をファイルに落とさなくてもそのまま日本語ファイル名で、簡単添付可能
  14. 添付ファイル名エンコードは、通常のmime方式 と RFC2231 の両方式に対応こちら
  15. mail関数、smtp送信のどちらもできます。
    (これはEmailComponentの機能)

ダウンロード

は下の方にあります。

必要なもの

マルチバイト関数 mb_ が使える必要があります。

設置方法

ダウンロードしたファイルを解凍して app/controllers/components/ フォルダにコピーしてください。
それだけ。

初期設定

使いたいコントローラーで、
 var $components=array( 'Semail' );
これだけ。

使い方

最も簡単な使い方(初心者向け)
$this->Semail->to[ 'ほげほげさま(日本語OK)' ] = 'hogehoge@example.com' ;
$this->Semail->from[ 'スポック(日本語OK)' ] = 'watasi@example.com' ;
$this->Semail->subject="日本語の長い長いタイトルもOKですよ~";

$this->Semail->send( 'メールの中身だよ~ん');
コーディングの文字コードに係わらず、デフォルトでは強制的に iso-2022-jp に変換して送付します。
(iso-2022-jpは日本語で問題が最も起こりにくい方法です。私が受け取るメールの90%以上は、iso-2022-jpエンコードです。)

もちろん
$this->Semail->to = array( 'ほげほげさま(日本語OK)'  => 'hogehoge@example.com' );
というような形式でもOKです。
ccやbccは、
$this->Semail->cc = array( 'ほげほげさま(日本語OK)'  => 'hogehoge@example.com' );
$this->Semail->bcc = array( 'ほげほげさま(日本語OK)'  => 'hogehoge@example.com' );
とするだけ。配列でいくらでも追加してください。
toも、いくらでも追加できます。

replyToも
$this->Semail->replyTo['返信先']=''hensin@examaple.com;
で指定できます。
(エラーメールのリターン先 は、$this->Semail->return )

from,replyTo
from,replyToで、メールアドレスだけでいい場合は配列でなく、以下の形式で指定しても大丈夫です。
$this->Semail->from="hoge@example.com";
制限事項( to , cc , bcc )
array('名前'=>''メールアドレス)  このような指定方式なので、同姓同名の人がいると、前の人のキーが上書きされるので、その人にはメールが送られないことになります。ご注意ください。

―――>その場合は、
array( '日本語名前' . '<' . 'hoge@example' . '>'  , ・・・・・・・);
という形式にすれば、同姓同名でも大丈夫です。
(この形式がCakePHP EmailComponentの本来のデフォルト)

機種依存文字を送りたい

本来は使うべきでない機種依存文字ですが、どうしても送りたいときもあることでしょう。
丸数字①②とか(株)とか。
それはSemailで機種依存文字を送るをご参照下さい。

どうも、うまく文字コード変換していないような気がするとき。

Semailで、どうもうまく文字コード変換をしない時の対処法を試してみて下さい。

view , Layout 機能の使い方

テキストメールのview 、htmlメール用のview はそれぞれ以下に置いて下さい。
view/elements/email/text/hoge_view.ctp
view/elements/email/html/hoge_view.ctp
Layoutは、それぞれ
view/layouts/email/text/hoge_layout.ctp
view/layouts/email/html/hoge_layout.ctp
に置いて下さい。

「email」の部分は変更することができます。
$this->Semail->spok_view_dir='hoge';
$this->Semail->spok_layout_dir='hoge';


文字コードは何でもいいです。Semailが自動的に判別して、指定の文字コードに置き換えます。
公式Cake1.2 EmailComponentのview , layout が参考になるでしょう。


htmlメールで、view,layout を使う場合
$this->Semail->sendAs='html';((htmlは必ず小文字で指定))
$this->Semail->to[ 'ほげほげさま(日本語OK)' ] = 'hogehoge@example.com' ;
$this->Semail->from[ 'スポック(日本語OK)' ] = 'watasi@example.com' ;
$this->Semail->send( 'メールの中身だよ~ん' , 'hoge_view.ctp' ,'hoge_layout.ctp');

テキストメールで、view lyaout 機能を使いたい時は
$this->Semail->sendAs='text';
とするだけです。

なお、もともとの EmailComponent の機能ですが、
$this->Semail->sendAs='html';
$this->Semail->sendAs='both';
とすると、マルチパート(1通のメール)で、htmlメールとテキストメールを送ることができます。
(もちろん、view layoutは使い分けることができる)

添付ファイルの送り方 その1 (通常モード)

もっとも簡単な送り方
添付ファイルの置き場所
app/attachments/
(フォルダを作って下さい。変更することもできます。)
$attach=array( '添付ファイル名(日本語OK)' => 'filename(サーバー上のファイル名)' );
$this->Semail->send( 'メール本文' , NULL , NULL , $attach );
(toの設定などは省略しています。もちろん、view layoutの指定可能です。)


添付ファイルは、いくつでも(とはいえ常識的に)指定することができます。

添付ファイルの置き場所は
$this->Semail->filePaths=array('paths','paths','paths','paths',・・・・);
とサーチ用のパスの設定をすることで変更することができます。
相対パスを指定すると、webrootからの相対パスになります。

添付ファイルの送り方 その2 (ダイレクトモード)

変数の中身をそのまま添付ファイルとして送ることが出来ます。
例えば、csvファイルをプログラムで加工したときなどは、これまではいったんディスクに書き込む必要がありましたが、writeしなくても、そのまま添付ファイルとして送ることができます。
画像でもエクセルファイルでもワードでもPDFでも何でも大丈夫(のはず)。

$content = "送りたいファイルの中身データ";
$pre=$this->Semail->directPrefix();
$attach=array( $pre.'添付ファイル名(日本語OK)' => $content );
$this->Semail->send( 'メール本文' , NULL , NULL , $attach );
添付ファイルはいくつでも指定でき、それぞれについて、通常モードとダイレクトモードを選択することができます。つまり、その1の通常モードと混ぜることができます。
例えば、
unset($attach);
$pre=$this->Semail->directPrefix();
$attach[$pre.'添付ファイル名1(日本語OK)'] =  "送りたいファイルの中身データ1";
$attach[$pre.'添付ファイル名2(日本語OK)'] =  "送りたいファイルの中身データ2";
$attach['添付ファイル名3(日本語OK)'] =  'filename(ディスク上のファイル名)3' ;
$this->Semail->send( 'メール本文' , NULL , NULL , $attach );
なお、$this->Semail->directPrefix() は、実行するごとに異なる prefix を返しますので、何度も実行させてはいけません。
これはmd5で、通常はあり得ないファイル名を作り出して、それをプリフィックスとして持っているファイルは、ダイレクトモード、というロジックで判定しています。
つまり、以下のようにしてしまうとエラーになります。
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 );
なお、$this->Semail->directPrefix()のデフォルト値は、「_spokDirect_」なので、
$this->Semail->directPrefix()を呼び出さなくても
unset($attach);
$attach['_spokDirect_'.'添付ファイル名1(日本語OK)'] =  "送りたいファイルの中身データ1";
$attach['_spokDirect_'.'添付ファイル名2(日本語OK)'] =  "送りたいファイルの中身データ2";
$attach['添付ファイル名3(日本語OK)'] =  'filename(ディスク上のファイル名)3' ;
$this->Semail->send( 'メール本文' , NULL , NULL , $attach );
でも、正常動作します。

ダウンロード

ご指摘があり修正しました。
修正箇所:日本語ワードラップでエンコードミス&行が短い場合の処理ミス
rks様、ありがとうございました。というわけでバーション 1.0.1 にあがりました!
(というか前はバージョンさえつけてなかったのだけど。不慣れですいません。というか一番肝心なところミスっていたのに気づかなくてすいません。)
最新バージョン
semail1.0.2.zip
Semail ver1.0.2にバージョンアップに追加の使い方も掲載しています。


これは古いやつ。
semail1.0.1.zip
semail.zip

ちょいとうれしい

参考にしてくれた人がいらっしゃったようです。
第2回 CakePHP 勉強会に参加してきた

1: donkun 2008年03月08日(土) 午前11時31分

semail使わせてもらっています。

画像の添付ファイル送信が、904系数台と、p704i、AU、ソフトバンクでは添付画像の送信が出来ましたが、
ドコモの902(端末不明)と、sh700isの機種で"添付ファイル削除"となってしまいました。

添付ファイルの、ファイルタイプの部分をきちんとしないとだめみたく、630行目あたりを
if ($filetype == 'jpg') $filetype = 'image/jpeg';
if ($filetype == 'gif') $filetype = 'image/gif';

このように追加すると、うまく送信出来ましたので、報告しておきます。
携帯はややこしいですね。。

2: spok 2008年03月09日(日) 午後11時00分

ご指摘ありがとうございます。というか、使っていただいてありがとうございます。大変はげみになります。

content-typeについては、気になっていたものの、当初のEmailコンポーネントのままいじらずにいたのですが、次のバージョンアップで以下の事をしようかと思います。

1 ユーザーから設定がない場合に、拡張子から適切なものを設定する
  (初心者は簡単に、の思想)
2 添付ファイルのcontent-type の任意設定。
  (上級者には自在に、の思想)

他にも若干の修正をしようかと思っていますので、今しばらくお待ち下さい。
(若干の修正予定:適切な mb_detect_encodeing 設定をsemailでやってしまう。添付ファイルダイレクトモードのプリフィックスの固定化等)

3: donkun 2008年03月10日(月) 午後9時11分

わざわざありがとうございます。
サイトのコンテンツなんかもわかりやすく為になってます。
これからもがんばってください。


名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/086/tb/
  • Semail機種依存文字について CPA-LABテクニカル spok
    機種依存文字についてのメールは難しい。できることなら、使わないのがいいのだけど、どうしても使いたい場合の覚書。CakePHPの日本語メールコンポーネントが大前提。■機種依存文字をメールで送るsjis-win で送る (sjis では×)PCであれば、安心で...
  • Semailでのutf-8,SHIFT-JISメールの送り方 CPA-LABテクニカル spok
    Semailはデフォルトでは、iso-2022-jpですが、UTF-8、SJISのメールも送ることが出来ます。CakePHPの日本語メールコンポーネントのお話。 もっとも簡単な送り方utf-8の場合$this->Semail->charset=...
  • Semailで、どうもうまく文字コード変換をしない時の対処法 CPA-LABテクニカル spok
    CakePHPの日本語高機能メールコンポーネントSemailでは、まず受け取った文字列の文字コードを自動判別して、ターゲットの文字コードにエンコードします。使っているのは、 mb_detect_encoding関数です。しかし、PHPの設定によっては、自動...
  • Semail 1.0.1 にバージョンアップ CPA-LABテクニカル spok
    日本語ワードラップの処理がおかしかったので修正いたしました。文字列が指定の文字数にならなかったり、文字列が短い場合に不要な改行が入ってたのを修正しました。興味ある方はこちらより。CakePHPの日本語高機能メールコンポーネントSemail
  • Semailでの添付ファイルで、「別に日本語の添付ファイル名いらないんだけど」の設定 CPA-LABテクニカル spok
    CakePHP1.2用高機能メールコンポーネント Semail では、日本語の添付ファイル名を簡単につけることができます。が、改造前のEmailコンポーネントのように、(日本語でなくアルファベットで) 保存ファイル名でそのまま送りたい場合は、次の2つの方法...
  • Semailバージョンアップ1.0.2.b(CakePHP日本語高機能メールコンポーネント) CPA-LABテクニカル spok
    CakePHP用高機能メールコンポーネントSemailのバージョンアップです。ご指摘のあった添付フィルの Content-Typeヘッダ(mimeタイプ)周辺を整備したほか、いくつかの改良をしています。基本的な使い方は、CakePHP用高機能メールコンポー...
  • PHPで簡単にメールを送りたいだけなのに。 CPA-LABテクニカル spok
    ユーザーからのアクションをきっかけにちょっとしたメールを送りたいことがある。それは、ユーザー登録の認証だったり、サンクスメールだったり、確認メールだったり。しかし、PHPの mb_send_mail は、toヘッダへの日本語がうまく通らなかったり(上手にや...
  • PHP日本語高機能メールライブラリ-Qdmail-デコメ対応 CPA-LABテクニカル spok
    ■QdmailとはQdmailとは、PHPのマルチバイト環境(特に日本語)にて、簡単に"デコメ"やHTMLメール等の電子メールを送ることができるメールクラスライブラリです。「初心者には簡単に、上級者には多彩に」のポリシーのもとに開発しました。設定次第では、...
  • CakePHP高機能メールコンポーネント-Qdmail CPA-LABテクニカル spok
    QdmailをCakePHP対応にしてみました。特徴 CakePHP1.1 & 1.2 の両方に対応 ひとつのファイルで、通常の使い方もCakePHPのコンポーネントとしても動作可能 CakePHPのビュー機構を利用可能 CakePHP1.2デフォルトのe...