Semail Componentとは
現在はもっと高機能なQdmailがありますのでよかったら、Qdmailの方をお使い下さい。日本語メール&CakePHPのためのメールコンポーネントです。
Semailは更新停止しています。
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.3にバージョンアップ
特徴
- 初心者には簡単に、上級者には複雑な設定も可能な構成
- CakePHP1.2のEmailComponentの改造版なので、基礎的信頼性抜群!(笑)
なので、基本的な使い方はCakePHP1.2EmailCOmponentと同じです。
- to,cc,bccに日本語の宛先使用可能。エンコードの複雑な設定不要。
- cc,bccはもちろん、to にも、複数人を日本語で指定可能
- コーディング文字コードに係わらず動作可能(のはず)
- 文字化けが最小のデフォルト設定
iso-2022-jpがデフォルト
- utf-8,SJIS,その他任意の文字コードのメールを作成可能こちら
- 本文のbase64エンコード対応こちら
- ヘッダーと本文のエンコード分離可能こちら
- htmlメールをCakePHPのView機能で簡単に作成可能
(これはCakePHP1.2EmailComponentの機能です)
- 添付ファイルも簡単に添付可能
- 日本語の添付ファイル名が簡単に作成可能
- 文字列変数をファイルに落とさなくてもそのまま日本語ファイル名で、簡単添付可能
- 添付ファイル名エンコードは、通常のmime方式 と RFC2231 の両方式に対応こちら
- 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.ctpLayoutは、それぞれ
view/elements/email/html/hoge_view.ctp
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='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 『semail使わせてもらっています。 画像の添付ファイル送信が、904系数台と、p704i、AU、ソフトバンクでは添付画像の送...』 (2008/03/08 11:31)
2: spok 『ご指摘ありがとうございます。というか、使っていただいてありがとうございます。大変はげみになります。 content-typeに...』 (2008/03/09 23:00)
3: donkun 『わざわざありがとうございます。 サイトのコンテンツなんかもわかりやすく為になってます。 これからもがんばってください。』 (2008/03/10 21:11)