読者です 読者をやめる 読者になる 読者になる

Macで開発用SMTPサーバを立てたい

どうすればよいか?

postfixをスタート
$ sudo postfix start

ログはここ
$ tail -f /var/log/mail.log

これで無事、SMTPサーバが起動した。(今回はSMTPサーバが動けばよいので詳しくは調べていない)
macのスタート時にSMTPサーバを起動するには「/etc/hostconfig」を以下のように編集すればよいらしい。(確かめていないので間違っているかも)

/etc/hostconfig に 「MAILSERVER=-YES-」を追加
$ sudo vim /etc/hostconfig
...
MAILSERVER=-YES-
...

参考ページ:
guess what?: Macで開発用SMTPサーバをたてたい!:情報源。
OS X ハッキング! (19) システム環境設定と/etc/hostconfigの関係 | マイナビニュース:/etc/hostconfig について




localホスト宛に送信テスト(perlスクリプト):

$ vi email_send.pl
use MIME::Lite;
use Jcode;

$email      = 'hoge@localhost';

$content    = <<"EOF";
Hello!!!!!!!!!!
MIME::Lite test.

EOF

my $msg = MIME::Lite->new(
    From        => 'sample@example.com',
    To          => $email,
    Subject     => 'Email Send Test',
    Type        => 'text/plain; charset=utf-8',
    Encoding    => '7bit',
    Data        => Jcode->new($content)->utf8,
);
$msg->send_by_smtp('localhost');


$ perl email_send.pl

早速ログを見てみると…

Sep 12 22:42:34 macbook postfix/smtpd[4519]: warning: database /etc/aliases.db is older than source file /etc/aliases
Sep 12 22:42:34 macbook postfix/smtpd[4519]: connect from localhost[127.0.0.1]
Sep 12 22:42:34 macbook postfix/smtpd[4519]: NOQUEUE: reject: RCPT from localhost[127.0.0.1]: 550 5.1.1 <hoge@localhost>: Recipient address rejected: User unknown in local recipient table; from=<sample@example.com> to=<hoge@localhost> proto=ESMTP helo=<localhost.localdomain>
Sep 12 22:42:34 macbook postfix/smtpd[4519]: lost connection after RCPT from localhost[127.0.0.1]
Sep 12 22:42:34 macbook postfix/smtpd[4519]: disconnect from localhost[127.0.0.1]

送れてないみたい。。


調べてみると、Postfix の設定で

ローカルユーザ名またはアドレスが $local_recipient_maps にリストアップされていないと、
Postfix SMTP サーバはアドレスを "User unknown in local recipient table" で拒否します。
 デフォルトの設定では、以下に示すように、受信者が UNIX アカウントもしくはローカルエイリアスである、
ローカル配送にデフォルトの Postfix local(8) 配送エージェントを使うことを想定しています:

    /etc/postfix/main.cf:
        local_recipient_maps = proxy:unix:passwd.byname $alias_maps

とある。
情報源:Postfix で知らないローカルユーザを拒否する



それじゃあ受信者を自分のunixアカウントにしてしまえってことで、上に示したコードの「$email = 'hoge@localhost';」を「$email = '<自分のunixアカウント>@localhost';」にしたらうまく行った。

もう一回実行
$ perl email_send.pl


ログを確認。「delivered to mailbox」と出力されているので送信された模様
$ less /var/log/mail.log
...
Sep 12 23:09:36 macbook postfix/local[4590]: 72C62E4B50B: to=<your_account@localhost.localhost>, orig_to=<your_account@localhost>, relay=local, delay=0.02, delays=0.01/0.01/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
...


ログだけでなく、ちゃんと届いているか、メールボックスを確認
$ less /var/mail/<自分のunixアカウント名>
...
Hello!!!!!!!!!!
MIME::Lite test.


※ 実際はメールボックスを「tail -f」しておいてから送信したほうが分かり易いが、説明し易くするため「less」を使用した

届いた!


今回はテストなのでlocalhost宛に送信したが、gmail宛に送信する場合は、postfixの設定やらヘッダのFromやらをvalidな値にしないとgmail側で弾かれてしまうので注意。
参考:MacのマシンからPostfixでGmailに送信できるようにする - F.Ko-Jiの「一秒後は未来」