「mail」カテゴリーアーカイブ

OS X Lion で postfixを設定する

ローカル開発環境用に Mac OS X Lion に postfix を設定する。
Mac OS X には最初からpostfixが入っているので、まず Lion でそのままの設定で postfix を起動してみる。

$ sudo postfix start

メール送信すると、以下のエラー。
/var/log/mail.log

postfix/smtpd[3475]: fatal: open /etc/postfix/submit.cred: No such file or directory
postfix/master[3282]: warning: process /usr/libexec/postfix/smtpd pid 3475 exit status 1
postfix/master[3282]: warning: /usr/libexec/postfix/smtpd: bad command startup -- throttling

ログを見ると、/etc/postfix/submit.cred が存在しないというエラー。
OS X Lion postfix smtpd problems: Apple Support Communities
/etc/postfix/submit.cred を作成し、パーミッションを設定。

$ sudo touch /etc/postfix/submit.cred
$ sudo chmod 600 submit.cred

/etc/postfix/submit.cred

submitcred version 1
hostname|user|password

※ hostname、user、passwordは、実際の送信したいユーザのものに置き換える。
※ submit.credは、空行が含まれていると、
warning: syntax error on line 2 of /etc/postfix/submit.cred
という警告が出るようなので、空行は入れない。

/etc/postfix/main.cf

$myhostname = macbook-pro.local
$mydomain = macbook-pro.local
myorigin = $mydomain
inet_interfaces = all
# 以下の行があったらコメントアウト
#inet_interfaces = loopback-only

自動起動の設定

/System/Library/LaunchDaemons/org.postfix.master.plist

  • -e オプション(プロセスが終了するまでの時間)をコメントアウト。
  • OnDemand を false に設定。
<plist version="1.0">
<dict>
        <key>Label</key>
        <string>org.postfix.master</string>
        <key>Program</key>
        <string>/usr/libexec/postfix/master</string>
        <key>ProgramArguments</key>
        <array>
                <string>master</string>
<!--
                <string>-e</string>
                <string>60</string>
-->
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/Library/Server/Mail/Data/spool/maildrop</string>
        </array>
        <key>AbandonProcessGroup</key>
        <true/>
        <key>OnDemand</key>
        <false/>
</dict>
</plist>
$ sudo launchctl unload /System/Library/LaunchDaemons/org.postfix.master.plist 
$ sudo launchctl load /System/Library/LaunchDaemons/org.postfix.master.plist

Rails3のActionMailerでOpenSSL::SSL::SSLError (hostname was not match with the server certificate)

Rails3でメールを送信したところ、送信できなかった。
ActionMailerの設定は、
config/initializers/02_action_mailer.rb

ActionMailer::Base.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
  :address        => "mail.example.com",
  :port           => "587",
  :domain         => "example.com",
  :user_name      => "username",
  :password       => "password",
  :authentication => :cram_md5
}

のようにしている。
同じ設定で、Rails2では送信できている。

原因

ActionMailer::Base.raise_delivery_errors = true

を追加して実行したところ、

OpenSSL::SSL::SSLError (hostname was not match with the server certificate)

となり、SSL証明書の検証で例外が発生しているらしいことが分かった。
また、メールサーバのログでも、

connect from xxxxx
setting up TLS connection from xxxxx
TLS connection established from xxxxx
lost connection after STARTTLS from xxxxx
disconnect from xxxxx

という状態だった。
このメールサーバはテスト用のpostfixで、
smtpd_tls_security_level = may
にしており、
smtpd_tls_cert_file、smtpd_tls_key_file には、自己署名証明書を設定していた。
Rails3では、STARTTLSがデフォルトで有効になっているためTLSで接続しようとするが、このメールサーバの証明書がテスト用の自己証明書だったので検証に失敗していたのが原因らしい。

解決方法

証明書を正当なものにすればよいと思われるが、テスト環境なのでとりあえず今は自己署名証明書を使いたい。
そのためには、ActionMailer::Base.smtp_settingsの設定で、STARTTLSを無効にするか証明書の検証を無効にする。

ActionMailer::Base.smtp_settings = {
  :address        => "mail.example.com",
  :port           => "587",
  :domain         => "example.com",
  :user_name      => "username",
  :password       => "password",
  :authentication => :cram_md5,
  :enable_starttls_auto => true,  # STARTTLSを無効にする場合はfalseにする
  :openssl_verify_mode => 'none'  # STARTTLSを有効にしつつ、不正な証明書もOKにしたい場合は、証明書の検証を無効にする
}

証明書の検証を無効にするのは本当はよくないけど、テスト環境等で自己署名証明書でもOKにしたい場合は、とりあえず上記のようにすれば、TLSでメールが送信できます。
OpenWebOps
email - Postfix & Rails 3.0 ActionMailer: lost connection after STARTTLS - Stack Overflow

Postfixで転送失敗時にエラーメールが送信者に送信されないようにする

Postfixで、aliasesや.forwardで転送設定した場合に、転送がエラーになると、元の送信者にエラーメールがいってしまう。
これを防ぐ一番簡単な方法は、転送先をsendmailコマンドへのリダイレクトにして、-fオプションでエンベロープ送信者を変更すること。

| /usr/sbin/sendmail -f <エンベーロープ送信者> <転送先アドレス>

のように設定する。

例:

/etc/aliases

foo: foo, "| /usr/sbin/sendmail -f forward xxx@example.com"

sendmailコマンドの-fオプションは、エンベロープ送信者の指定。
エラーメールはエンベロープ送信者に送信されるので、これで元の送信者にエラーメールはいかなくなる。

エラーメールの送信がループしないよう注意は必要。
上記の例ではforwardの転送先が最終的にfooにならないようにする。

[postfix-jp:01469] Re: [Q] .forward で転送失敗のメールを送信者に知らせたくない

postfixで「-」で始まっているメールアドレスへ配送できない

Postfix は「-」で始まっているメールアドレスへの配送をデフォルトで拒否してしまう。
メールログを見ると、

status=bounced (bad address syntax)

となっている。
「-」で始まっているメールアドレスへの配送を許可するには、main.cfに

allow_min_user = yes

を設定する。

Postfix チュートリアル - Postfixの罠

UW IMAP Server をMac OSX Snow Leopard にインストール

■ PAMの設定

$ cd /etc/pam.d
$ sudo cp ftpd pop
$ sudo cp ftpd imap

■ UW IMAPのインストール
http://www.washington.edu/imap/ からUW IMAP toolkit source distributionをダウンロードして適当なディレクトリに展開する。
展開したディレクトリで、

$ make osx SSLTYPE=none PASSWDTYPE=pam

実行ファイルを/usr/local/libexec/にコピー。

$ sudo mkdir -p /usr/local/libexec
$ sudo cp imapd/imapd /usr/local/libexec/
$ sudo cp ipopd/ipop3d /usr/local/libexec/

■ 自動起動の設定
自動起動のためのplistを2つ作成する。
/Library/LaunchDaemons/imap.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>edu.washington.imap</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/libexec/imapd</string>
	</array>
	<key>Sockets</key>
	<dict>
		<key>Listeners</key>
		<dict>
			<key>Bonjour</key>
			<false/>
			<key>SockServiceName</key>
			<string>imap</string>
			<key>SockType</key>
			<string>stream</string>
		</dict>
	</dict>
	<key>inetdCompatibility</key>
	<dict>
		<key>Wait</key>
		<false/>
	</dict>
</dict>
</plist>

/Library/LaunchDaemons/pop3.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>edu.washington.pop3</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/libexec/ipop3d</string>
	</array>
	<key>Sockets</key>
	<dict>
		<key>Listeners</key>
		<dict>
			<key>Bonjour</key>
			<false/>
			<key>SockServiceName</key>
			<string>pop3</string>
			<key>SockType</key>
			<string>stream</string>
		</dict>
	</dict>
	<key>inetdCompatibility</key>
	<dict>
		<key>Wait</key>
		<false/>
	</dict>
</dict>
</plist>

作成したplistをロード。

$ sudo launchctl load /Library/LaunchDaemons/pop3.plist
$ sudo launchctl load /Library/LaunchDaemons/imap.plist