裏紙に書く程度の内容

CodeIgniter でメール送付時に文字化けする

CodeIgniter の email ライブラリを使ってメール送付する際の文字化けについて。

事象

CodeIgniter の email でメール送信すると本文が文字化けすることがあった。

「することがあった」というのは、文字化けしない場合もあったため。

具体例で言うと、以下のようなかんじ。

実行したプログラムはこちら。

$body = "[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。\r\n";
$body .= "[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。\r\n";

$this->load->library('email');
$this->email
    ->from('****@***', '****')
    ->to('****@***')
    ->subject('test')
    ->message($body)
    ->send();

で、届いたメールの本文。

[テスト]メッセージのテスト。メッセージのテスト。メ�
��セージのテスト。
[テスト]メッセージのテスト。メッセージのテスト。メ�
��セージのテスト。

改行されるあたりで文字化けしています。

そもそもプログラムでは改行入れていないので、勝手に改行されています。

修正方法

CodeIgniterのemailライブラリが親切に改行しているのですが、これを無効にしてしまいます。

そのための設定メソッドも準備されていて、set_wordwrap(false)を実行すればいいだけ。

$body = "[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。\r\n";
$body .= "[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。\r\n";

$this->load->library('email');
$this->email
    ->from('****@***', '****')
    ->to('****@***')
    ->subject('test')
    ->message($body)
    ->set_wordwrap(false)
    ->send();

すると文字化けはなくなります。

[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。
[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。

特定の行だけ自動改行させない

もうひとつ、特定の行のみ自動改行の対象外にしたい場合。

{unwrap}というタグで文章を囲みます。

$body = "{unwrap}[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。{/unwrap}\r\n";
$body .= "[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。\r\n";

$this->load->library('email');
$this->email
    ->from('****@***', '****')
    ->to('****@***')
    ->subject('test')
    ->message($body)
    ->send();
[テスト]メッセージのテスト。メッセージのテスト。メッセージのテスト。
[テスト]メッセージのテスト。メッセージのテスト。メ�
��セージのテスト。

指定した1行目は自動改行されずにそのまま、2行目は{unwrap}しなかったので自動改行して文字化けしました。

{unwrap}タグ自体は文字化け云々のための機能ではないと思いますが、まあこういう方法もあったよ。ということで。

URABLO
広告
Index
広告