ようこそゲストさん

CPA-LABテクニカル

2008/02/10(日) EmailComponentで簡単日本語メール。CakePHPメールCakePHP1.2b

CakePHP1.2bのEmailコンポーネントは、デフォルトだと若干使いづらい。マルチバイトでのメール送信には一工夫必要かと。日本では、携帯電話へメールを転送している人が多いため、CakePHPデフォルトのUTF-8では、読めない人がいるのだ(au)。


(2008/2/20追記)もっともっと、簡単高機能なSemailをぜひ使ってみて下さい。

CakePHPの日本語高機能メールコンポーネントSemai



なので、断然、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



  1. ファイルコピー

    /cake/lib/controllers/components/email.php を app/controllers/components/email.phpにコピー

  2. キャッシュファイルを全部消去(意外に盲点)
  3. 下記の「改造方法」の追加をする。
  4. すると下記の設定でメールを送れるようになる。

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テクニカル spok
    CakePHP1.2bのEmailコンポーネントでは、textメールはもちろん、htmlメール、添付ファイルなどを簡単に送ることができる。また、テンプレートとして、viewやlayoutが使えるので、ここでもMVCの分離ができている。なお、今回の記事は下記...
  • EmailComponentの使い方。添付ファイルの送り方。 CPA-LABテクニカル spok
    CakePHP1.2bのEmailComponentでは、簡単に添付ファイルを送ることができる。なお、今回の記事は下記改造をしていることを前提にしています。EmailComponentで簡単日本語メール。CakePHP1.2b通常の設定に下記のように設定す...
  • EmailComponentの使い方。Toヘッダに日本語を使う。 CPA-LABテクニカル spok
    CakePHP1.2bのEmailComponentでは、from,cc,bcc,subject,本文に日本語を使うことができます。でも、デフォルトだと、Toヘッダだけは、日本語を使うことができません。しかし、smtp方式で送付するようにすれば、Toヘッ...