ことの経緯は http://togetter.com/li/6431 を。 Email::MIME->create() のところうまく書けば良いよ、というお話。

ところが今度は Email::Send 。Email::Send の POD には

WAIT! ACHTUNG!

Email::Send is going away... well, not really going away, but it's being officially marked "out of favor." It has API design problems that make it hard to usefully extend and rather than try to deprecate features and slowly ease in a new interface, we've released Email::Sender which fixes these problems and others. As of today, 2008-12-19, Email::Sender is young, but it's fairly well-tested. Please consider using it instead for any new work.

とある。よって Email::Sender を使うのがよろしいみたい。

経緯に関しては http://gihyo.jp/dev/serial/01/modern-perl/0020 が詳しい。

サンプルコード

sendmail の -f オプションを明示して指定できるようにしているが、普通に使う分には $contents->{from} と $contents->{envelope_sender} は同一で良い(らしい)。エラーメール収集アドレスを別にしたい人は別にするとよい(らしい)。

モバイルでも文字化けせずに送信可。(Docomoのみ確認済み、他キャリアの動作報告あればお願いします) 詳しい方はツッコミお願いします。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;
use Email::MIME::Creator;
use Email::Sender::Simple qw/sendmail/;

my $contents = {
    from    => 'from@example.com',
    to      => 'to@example.com',
    subject => '電子メール',
    body    => 'サンプル',
    envelope_sender => 'envelope_sender@example.com',
};

my $mail = Email::MIME->create(
    header => [
        From    => $contents->{from},
        To      => $contents->{to},
        Subject => encode('MIME-Header-ISO_2022_JP', $contents->{subject}),
    ],
    attributes => { 
        content_type => 'text/plain',
        charset  => 'ISO-2022-JP',
        encoding => '7bit',
    },
    body_str => $contents->{body},
);

sendmail($mail, {from => $contents->{envelope_sender}});

exit;
__END__