end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

Email::Stuffer for perlによるメール送信でReturn-Pathをセット

http://end0tknr.hateblo.jp/entry/20150819/1439950536 http://end0tknr.hateblo.jp/entry/20170205/1486293131

Email::Stuffer シリーズ?の第3弾?

メールソフト(MUA)に表示されるアドレスとは、別のアドレスにエラーメールを返送したい為、メモ。 まぁ、ググれば、分かるんですけどね

envelope from と header from の違い?

fromのtype 説明(例)
envelope from 封筒に書かれる差出人. 宛先不明時はこちらへ返送
header from 便箋に書かれる差出人

envelope from と Return-Pathの関係

宛先不明メールは、Return-Path宛に返送されます。 しかし、メールヘッダのReturn-Pathはメールサーバ経由時に書換えられる為、 単純にメールヘッダにReturn-Pathを設定しても意味がありません。

envelope fromこそが、メールサーガ経由時にReturn-Pathに設定される為、 envelope fromにエラーメールの返送先を設定する必要があります。

Email::Stuffer for perlによるメール送信でReturn-Pathをセット

するには、次のように書きます。

ただし、試した範囲では、smtp.gmail.com での送信では、 好みのReturn-Path(envelop from)は設定できませんでした。

#!/usr/local/bin/perl
use strict;
use warnings;
use utf8;
use Email::Stuffer;
use Email::Sender::Transport::SMTP;
use Email::Sender::Transport::SMTP::TLS;
use Data::Dumper;

my $FROM =     'ないしょ@ないしょ.com'; ## HEADER  FROM
my $REPLY_TO = 'ひみつ@ないしょ.com';   ## ENVELOP FROM
my $SUBJECT = 'TEST MAIL';
# auth smtpの場合
my $SMTP_CONF = {host => 'xxx.yyy.zzz.co.jp',
                 port => 587,
                 sasl_username => 'ないしょ',
                 sasl_password => 'ないしょ',
                 debug=>1};
# 素の場合
# my $SMTP_CONF = {host => 'ないしょ.co.jp', port => 25};
# auth smtp(tls)の場合
my $SMTP_TLS_CONF = {host => 'smtp.gmail.com',
                     port => 587,
                     username=>'ないしょ@gmail.com',
                     password=>'ないしょ', # APPのパスワード
                     debug=>1 };


main( @ARGV);

sub main {
    my ($mailto) = @_;
    
    my $email = Email::Stuffer->new();

    my $smtp = get_smtp_obj();
#    my $smtp = get_smtp_obj_tls();
    $email->transport( $smtp );

    $email->subject($SUBJECT);
    $email->from($FROM);            ## HEADER FROM
    $email->to($mailto);
    $email->header('Reply-To' => $REPLY_TO);

    my $txt_mime =  get_txt_mime();  ## 代替text part
    my $html_mime = get_html_mime(); ## html part

    push(@{$email->{parts}}, $txt_mime);
    push(@{$email->{parts}}, $html_mime);

    $email->send_or_die({from=>$REPLY_TO});  ## ENVELOP FROM
}

sub get_smtp_obj_tls {
    my $smtp = Email::Sender::Transport::SMTP::TLS->new($SMTP_TLS_CONF);
    return $smtp;
}

sub get_smtp_obj {
    my $smtp = Email::Sender::Transport::SMTP->new($SMTP_CONF);
    return $smtp;
}

sub get_txt_mime {

    my $attr = {content_type => 'text/plain',
                charset      => 'utf-8',
                encoding     => 'quoted-printable',
                format       => 'flowed'};
    my $body =<<EOF;
これは、テキストメールのテストです。
EOF

    my $mime = Email::MIME->create(attributes => $attr,
                                   body_str   => $body);
    return $mime;
}

sub get_html_mime {
    my $attr = {content_type => 'text/html',
                charset      => 'utf-8',
                encoding     => 'quoted-printable'};
    my $body =<<EOF;
<html>
<head></head>
<body>
これは、<b>HTML</b>メールのテストです。
</body>
</html>
EOF
    my $mime = Email::MIME->create(attributes => $attr,
                                   body_str   => $body);
    return $mime;
}

1;