ふそうごむ。by扶桑ゴム産業

扶桑ゴム産業の最新情報とうぇぶますたあ「TKYK」の個人的日記。

Mail::SenderのFrom欄に日本語があると送信できなかったりする件

お手軽メール送信モジュールMail::SenderのFrom欄にて、日本語文字列が長いとエラーになってしまう件。色々やってなかなか分からなかったがようやく解けた。理由は、「改行」にあった。
my $sender = new Mail::Sender{    ...    debug=> '/webroot/debug-mail.txt',    ... };
と、デバッグモードでSMTPに送信している内容を確認してみた。 すると、
<< MAIL FROM:
などとなっているべき部分がやはりおかしくなっていて、
<< MAIL FROM: <?ISO-2022-JP?B?GyRCPHc4Qkw1PHc4Qkw1OGU4dyROJD?= hoge@hoge.com>
のようになっていた。つまり、純粋なメールアドレスを送るべき部分がきちんと送られていないということになる。 そこで、Mail::SenderモジュールSender.pmを実際に覗いてみると(880,887行目)、
$self->{'fromaddr'} = $self->{'from'}; $self->{'fromaddr'} =~ s/.*<([^¥s]*?)>/$1/ if ($self->{'fromaddr'}); # get from email address
のようになっていた。$self->{'fromaddr'}が実際のアドレスで、$self->{'from'}が、"テスト株式会社 <info@hogehoge.co.jp>"といった文字列にあたる部分(もちろん実際はエンコード必要)である。 テストプログラムでは、
my $from = jcode($config{mailfrom})->mime_encode;
のようにJcodeに投げてMIMEエンコードしているため、一定文字数で改行コードが入る。すると、
s/.*<([^¥s]*?)>/$1/
は、不完全な処理となってしまうので、上のような現象が起きてしまっていた。 解決するには、この部分などを、
s/.*<([^¥s]*?)>/$1/s
として、「.*」(任意の文字列)に改行コードを含めるようにすればいいが、モジュールをいじるのはあまり良くないので、テストプログラム側で、
my $from = jcode($config{mailfrom})->mime_encode; $from =~ s/¥n//g; #改行が悪影響を及ぼすため消去
として、改行コードを除去してから渡すようにした。これにより、無事に長い文字列でもメール送信することができることを確認できた。 それにしても、Subjectはともかく、FromやTo欄の場合は、MIMEエンコードに改行を入れるのはやはりNGなのだろうか。まともに守られていない(ように思える)仕様を守るのは結構面倒なので適当になっちゃってますが…。