▼ 2008/02/10(日) EmailComponentで簡単日本語メール。CakePHPメールCakePHP1.2b
CakePHP1.2bのEmailコンポーネントは、デフォルトだと若干使いづらい。マルチバイトでのメール送信には一工夫必要かと。日本では、携帯電話へメールを転送している人が多いため、CakePHPデフォルトのUTF-8では、読めない人がいるのだ(au)。
(2008/2/20追記)もっともっと、簡単高機能なSemailをぜひ使ってみて下さい。
なので、断然、JIS(ISO-2022-JP)で送りたい。しかし、EmailComponentは、$this->Email->charsetで、文字コードが指定できるものの、それはヘッダーのcontent-typeにcharsetを設定するだけであり、データはすべてこちらで JIS に変換してやらなねばならない。subjectや、from部分だけならまだしも、viewやlayoutまで、jisで作成しなくてはならない。これはケアレスミスが増えるだけである。
そこで、コーディング用で使っているUTF-8でプログラムは作成するけど、送る直前にJIS変換するような改造をしてみた。
これらの改造は、あくまでも iso-2022-jp(JIS) で送るためのものであり、他の文字コードではたぶんうまくいきません。*1
- ファイルコピー
/cake/lib/controllers/components/email.php を app/controllers/components/email.phpにコピー
- キャッシュファイルを全部消去(意外に盲点)
- 下記の「改造方法」の追加をする。
- すると下記の設定でメールを送れるようになる。
class HogemailsController extends AppController { var $components=array('Email'); function send(){ $this->Email->charset='iso-2022-jp'; $this->Email->to='example@exmaple.com'; $this->Email->from=''日本語のFROM表記.'example2@exmaple.com'; $this->Email->cc=array('日本語CC宛先'.'example3@exmaple.com'); $this->Email->bcc=array('日本語BCC宛先'.'example4@exmaple.com'); $this->Email->subject='日本語長いのOKタイトル'; $message='本文たくさん'; //配列も可 $this->Email->_lineLength=40; //日本語での1行の文字数。マルチバイト1文字で1。 $this->Email->send($message); } }
で文字化けなしの日本語メールを出すことができる。なお、これらのコードはutf-8で書いて構わない。
改造方法 app/controllers/components/email.php
1 function send($content = null, $template = null, $layout = null)
if (!empty($this->attachments)) { $this->__attachFiles(); }
を探しだし、その直前に、下記を付け加える。
##spok $enc=mb_detect_encoding($this->__message); $this->__message=mb_convert_encoding($this->__message,$this->charset,$enc); if (!empty($this->attachments)) { $this->__attachFiles(); }
これがメッセージ本文のエンコード。
2 function __createHeader()
if ($this->delivery == 'smtp') { $this->__header .= 'Subject: ' . $this->subject . $this->_newLine; }
を探しだし、その直前に、下記を付け加える。
##spok $enc=mb_detect_encoding($this->subject); $this->subject=mb_convert_encoding($this->subject,$this->charset,$enc); if ($this->delivery == 'smtp') { $this->__header .= 'Subject: ' . $this->subject . $this->_newLine; }
これが件名(subject)のエンコード
3 function __wrap($message)
$formated .= $this->wordwrap($word, $this->_lineLength, $this->_newLine, true);
を探しだし、以下に改変。
$formated .= $this->spok_wordwrap($word, $this->_lineLength, $this->_newLine, true);
4 このクラス内に以下のメンバ関数を追加
##spok function spok_wordwrap($word,$lenth,$newLine,$flag=true){ $ret=null; $enc=mb_detect_encoding($word); for($i=0;$i<mb_strlen($word);$i+=$lenth){ $ret.=mb_substr($word,$i,$lenth,$enc).$newLine; } return $ret; }
3,4はwordwrapのマルチバイト化。禁則処理はしていない簡単なもの。
5 function __encode($subject)
if (low($this->charset) !== 'iso-8859-15') {
を探しだし、その直前に、下記を付け加える。
##spok $enc=mb_detect_encoding($subject); $subject=mb_convert_encoding($subject,$this->charset,$enc); if (low($this->charset) !== 'iso-8859-15') {
これは、fromやccヘッダの日本語部分のエンコード。
以上です。
CakePHP(1.2.0.6311 beta )さくらインターネットでテスト
*1 : でも、ISO-2022-JPで送れれば、まずどの用途でも大丈夫ですよね
- TB-URL http://www.cpa-lab.com/tech/070/tb/
-
▼
EmailComponentの使い方。htmlメール&テンプレート。
CPA-LABテクニカル CakePHP1.2bのEmailコンポーネントでは、textメールはもちろん、htmlメール、添付ファイルなどを簡単に送ることができる。また、テンプレートとして、viewやlayoutが使えるので、ここでもMVCの分離ができている。なお、今回の記事は下記...
-
▼
EmailComponentの使い方。添付ファイルの送り方。
CPA-LABテクニカル CakePHP1.2bのEmailComponentでは、簡単に添付ファイルを送ることができる。なお、今回の記事は下記改造をしていることを前提にしています。EmailComponentで簡単日本語メール。CakePHP1.2b通常の設定に下記のように設定す...
-
▼
EmailComponentの使い方。Toヘッダに日本語を使う。
CPA-LABテクニカル CakePHP1.2bのEmailComponentでは、from,cc,bcc,subject,本文に日本語を使うことができます。でも、デフォルトだと、Toヘッダだけは、日本語を使うことができません。しかし、smtp方式で送付するようにすれば、Toヘッ...