やりたかったこと
Codeigniter の email ライブラリを使って、メールを送る機能を付けたかった。しかし、デフォルトのライブラリだと、 Outlook などのメーラーで件名または本文が文字化けしてしまう、という事象が生じました。ここでは、失敗しないメール送信の実装方法を紹介します。
①独自email ライブラリを作成
デフォルトのemail ライブラリにある次のコードが問題のようです。
system/libraries/email.php
$subject = $this->_prep_q_encoding($subject);
$this->_body = stripslashes(rtrim(str_replace("\r", "", $body)));
```
なので、email.php をコピーしてライブラリファイルを作成し、
問題の箇所だけ次のように変更します。
```application/libraries/Myemail.php
public function subject($subject)
{
//$subject = $this->_prep_q_encoding($subject);
$this->_set_header('Subject', $subject);
return $this;
}
public function message($body)
{
if (strtolower($this->charset) == 'iso-2022-jp')
{
$this->_body = rtrim(str_replace("\r", "", $body));
}
else
{
//$this->_body = stripslashes(rtrim(str_replace("\r", "", $body)));
$this->_body = rtrim(str_replace("\r", "", $body));
}
return $this;
}
```
# ②エンコーディングを変換
メール送信部分は、こんな風に書きます。
ポイントは、件名と本文は mb_convert_encoding で、送信者名は mb_encode_mimeheader でエンコーディングすることです。
```application/models/mail.php
function mail_send($to,$from,$from_name,$sbj,$body){
$this->load->library('myemail');//独自email libraryを読み出し
//メール初期化
$config['protocol'] = 'sendmail';
$config['mailpath'] = '/usr/sbin/sendmail';
$config['_encoding'] = '7bit';
$config['charset'] = 'ISO-2022-JP';
$config['wordwrap'] = FALSE;
$this->myemail->initialize($config);
$sbj = mb_convert_encoding($sbj, "ISO-2022-JP", "UTF-8,EUC-JP,auto");
$from_name = mb_encode_mimeheader($from_name, "ISO-2022-JP", "UTF-8,EUC-JP,auto");
$body = mb_convert_encoding($body, "ISO-2022-JP", "UTF-8,EUC-JP,auto");
$this->myemail->from($from, $from_name);
$this->myemail->to($to);
$this->myemail->subject($sbj);
$this->myemail->message($body);
$this->myemail->send();
}
```
これで一旦、文字化けはなくなるはずです!
# 補足:機種依存文字・半角カタカナの文字化けもなんとかしたい
以前に記事を書いたので、こちらを参照してください。
[【PHP】半角カタカナがメールで文字化けしたときの対処法](http://qiita.com/seihowlow24/items/2332dfbc04452f022155)
[【PHP】機種依存文字を変換する最低限のコード](
http://qiita.com/seihowlow24/items/f9147a0f7c44810ead1c)
#参考サイト
http://blog.livedoor.jp/lax34volvic/archives/1062690.html
http://ameblo.jp/dropshipping-dojyo/entry-11165249875.html