Email::Sender を使う上での罠

Email::Send で使われている Return::Value の最新版が読み込むだけで死ぬようになっていて、Moose から Moo に変わったしいよいよ Email::Sender に移行しなきゃと思い作業したのだけどその際にちょっとはまったのでメモ。

bcc が送信できない

理由と対応策が POD に載っている。ぼくは一つ目の例に倣って bcc が指定されていたら to にセットして送るようにしました。

RFC に違反するアドレスに送信できない

オプションで宛先を明示しないと $email のヘッダの中から to をパースしてくれるのだけど、その時に使われる Email::AddressRFC 違反のメールアドレスが取り除かれてしまう。これは2引数目(envelope)で以下のように宛先を明示すると回避できる。

sendmail(
    $email,
    +{ to => 'really-bad-address.....@example.com' },
);

to だけ指定すると cc が送信されない

to をパースする時に cc も同時にパースしているので、to を指定していると cc のパースも行なわれないので cc には送信されない。上でも示した部分の近く。これも Email::Address によるパースを回避したいならちゃんと指定する。

sendmail(
    $email,
    +{
        to => 'really-bad-address.....@example.com',
        cc => 'ccccccc@example.com',
    },
);

で、こうしてみるわけですがこれだと送信されない。envelope を指定していない場合に to をパースする時に同時に cc をパースして to に含めているのと同様に cc も envelope の to に入れなきゃだめ。

sendmail(
    $email,
    +{
        to => ['really-bad-address.....@example.com', 'ccccccc@example.com'],
    },
);

これでいけた。