Mail::Mailer 1.77 における Return-Path
メール送信用にPerl Cookbookおすすめの、CPANモジュールMail::Mailerを使ってみたんですが、SoftBank携帯のメールサーバは Return-Path ヘッダ(というか実際は Envelope From)のアドレスのlocal-part(ドメイン部分)が逆引きできないと受信してくれないようで、553 xxxxxxx.xxxx.xxxx.com does not exist が返ってきます。いくら指定受信許可でそのアドレスに許可をしていてもだめなようで・・・ちなみにEZweb、i-modeは問題なさそう。(i-modeはSPF許可のみ受信にしていても、ドメイン指定すれば受信可能)
my $mailer = Mail::Mailer->new( 'sendmail' ); $mailer->open({ 'From' => $from_address, 'To' => $to_address, 'Subject' => $subject, 'MIME-Version' => $mime_version, 'Content-Type' => $content_type, 'Content-Transfer-Encoding' => $tran_enc, }) or die "Can't open: $!\n"; print $mailer $body; $mailer->close();
sendmailを使わないでSMTPサーバを指定すればいけるようなんですが、そもそもコマンドプロンプトから
sendmail -f from@example.com to@example.com
で送れば、Return-Pathはfrom@example.comに置き換わるんですよね。
さらにMIME::Liteなら、こんな感じで FromSender パラメータを渡して処理すれば問題ないようで・・・
Mail::Mailer のソースを見てみたんですが、sendmail にパラメータを与えている部分がよくわからず、さてどうしたものか・・・。
Mail::Mailerをあきらめておとなしく sendmail を直接パイプで処理しますかね。
※追記 解決法?
Mail::Mailerのパラメータの処理が適当なため・・・
package Mail::Mailer; sub new($@) { my ($class, $type, @args) = @_; $type ||= $MailerType || croak "No MailerType specified"; my $exe = $Mailers{$type}; if(defined $exe) { $exe = is_exe $exe if defined $type; $exe ||= $MailerBinary || croak "No mailer type specified (and no default available), thus can not find executable program."; } $class = "Mail::Mailer::$type"; eval "require $class" or die $@; my $glob = $class->SUPER::new; # object is a GLOB! %{*$glob} = (Exe => $exe, Args => [ @args ]); $glob; } package Mail::Mailer::sendmail; sub exec($$$$) { my($self, $exe, $args, $to, $sender) = @_; # Fork and exec the mailer (no shell involved to avoid risks) # We should always use a -t on sendmail so that Cc: and Bcc: work # Rumor: some sendmails may ignore or break with -t (AIX?) # Chopped out the @$to arguments, because -t means # they are sent in the body, and postfix complains if they # are also given on comand line. exec( $exe, '-t', @$args ); }
それを逆手にとってこうした。
my $mailer = Mail::Mailer->new( 'sendmail', '-f', $from_address, '-t', $to_address );
my $mailer = Mail::Mailer->new( 'sendmail', '-f', $from_address );