ようこそゲストさん

CPA-LABテクニカル

2008/02/10(日) EmailComponentの使い方。Toヘッダに日本語を使う。CakePHPメール

CakePHP1.2bのEmailComponentでは、from,cc,bcc,subject,本文に日本語を使うことができます。やはりメールヘッダーがアルファベットだけなのと日本語が入っているのとでは安心感がちがいますよね。

でも、デフォルトだと、Toヘッダだけは、日本語を使うことができません。


しかし、smtp方式で送付するようにすれば、Toヘッダに日本語が使えます。
例) To: ほげほげさん<hoge@example.com>
というやつですね。

SMTPでの送り方は、
EmailComponentの使い方。mail関数を使わず、smtpで送る。

また、この改造を前提にしています。
EmailComponentで簡単日本語メール。CakePHP1.2b


あとは
$this->Email->to='日本語宛先'.'<hoge@example.com>';

とするだけ。
(追記)
もっと簡単に日本語メールを送るコンポーネントがあります。

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

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/074/tb/

2008/02/10(日) EmailComponentの使い方。mail関数を使わず、smtpで送る。CakePHPメール

CakePHP1.2bのEmailcomponetでは、PHP内部のmail関数を使ってメールを送るのが、デフォルトですが、外部のsmtpファイルを使って送ることもできます。
ウィンドウズ環境で、以前渡しはsendまね~る、というsendmailをウィンドウズ上でエミュレートするソフトを使っていましたが、最近はすっかりこの方法になっています。



通常の設定に加えて下記を加えるだけです。
$this->Email->smtpOptions=array('port'=>'25',
    'host'=>'smtp.example.com',
    'timeout'=>'30',
    'username'=>'・・・・',
    'password'=>'・・・・'
  );

$this->Email->delivery='smtp';
なお、
$this->Email->smtpOptions=array('port'=>'25','host'=>'localhost','timeout'=>'30');
の部分はデフォルトで設定済みなので、変更の必要がなければ、
$this->Email->smtpOptions['host']='・・・';$this->Email->smtpOptions['username']='・・・';$this->Email->smtpOptions['password']='・・・';
でもいいと思います。(たぶん)

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/073/tb/
  • EmailComponentの使い方。Toヘッダに日本語を使う。 CPA-LABテクニカル spok
    CakePHP1.2bのEmailComponentでは、from,cc,bcc,subject,本文に日本語を使うことができます。でも、デフォルトだと、Toヘッダだけは、日本語を使うことができません。しかし、smtp方式で送付するようにすれば、Toヘッ...

2008/02/10(日) EmailComponentの使い方。添付ファイルの送り方。CakePHPメール

CakePHP1.2bのEmailComponentでは、簡単な設定で添付ファイルをメールで送ることができる。


なお、今回の記事は下記改造をしていることを前提にしています。
EmailComponentで簡単日本語メール。CakePHP1.2b


通常の設定に下記のように設定するだけで、添付ファイルが送れます。

$this->Email->filePaths=array('path1','path2'・・・・);
$this->Email->attachments=array('filename1','filename2',・・・・);

$this->Email->filePathsで設定されたパスの中から、filenameを探し出して添付します。添付ファイル名は、当該ファイル名になります。(ので、日本語添付ファイル名は若干難しいかも)


なお、pathはwebrootからのパスです。前にも後ろにもDS(スラッシュ)は必要ありません。
例)
http;//example.com/cake/がwebrootだとして
http;//example.com/cake/tenpu/ver1/hoge.xls
を添付したい場合は、

$this->Email->filePaths=array('tenpu/ver1');
$this->Email->attachments=array('hoge.xls');

となります。

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/072/tb/

2008/02/10(日) EmailComponentの使い方。htmlメール&テンプレート。CakePHPメール

CakePHP1.2bのEmailコンポーネントでは、textメールはもちろん、htmlメール、添付ファイルなどを簡単に送ることができる。また、テンプレートとして、viewやlayoutが使えるので、ここでもMVCの分離ができている。
CakePHPの高機能メールコンポーネントQdmailもよろしくです。。emailコンポーネントよりも簡単に日本語メール送信ができます。CakePHP対応。
なお、今回の記事は下記改造をしていることを前提にしています。
EmailComponentで簡単日本語メール。CakePHP1.2b

htmlメールの送り方

普通のテキストメールの送り方は、
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);
 
  }
}
でした。CC,BCCはなくてもOK.

これに
$this->Email->sendAs='html';
を付け加えるだけ。
中身は、$messageにでも書きましょう。

なお、テンプレートを使うと、htmlメールももっと簡単に作れます。

テンプレートの使い方


  • /app/views/layouts/email/html/default.ctp
を参考に、hoge.ctpでレイアウトファイルを作成し(上記改造をしてれば、UTF-8でOK)、

  • /app/views/elements/email/html/default.ctp

を参考に、hogeview.ctpを作っておく。

で呼び出しを、$this->Email->send($message);の代わりに
$this->Email->send($message, 'hogeview' , 'hoge' );
としてやれば、renderしてくれます。
なお、hogeviewの中では、$contentという変数に$messageの中身が入っています。

名前:  非公開コメント   

  • TB-URL  http://www.cpa-lab.com/tech/071/tb/

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ヘッ...