Mastodon(マストドン)のインスタンスをCentOS7で立ててみるの続きです。
ローカルのpostfixで、確認メールなどを送信できるようにします。
メール送信ができなくて止まっていたのですが、コメントでアドバイス貰ったり(rinmon様、ありがとうございます!)Postfixの設定などを見直してみたりしてなんとか送ることが出来たのでまとめてみました。
※本記事では、セキュリティ的なところはいったん置いておいて、MastodonからPostfixを通してメールを送信できるところを試しています。本番運用として推奨できる構成ではありませんので、ご注意下さい。
目次
Postfixが起動していることを確認する
ひとまずはCentOS7のデフォルトで入っていた、Postfixを使用して送信をしてみます。
# systemctl status postfix
として、active(running)になっていればOK。
メールの送信は、mastodon (rails)からPostfixに依頼する形になるので、Postfix側の設定も絡んできます。上手くいかない場合はこちらも見直してみて下さい。
Mastodonのメール送信設定を行う
Mastodonのメール関連で行う点は2つです。.env.productionの修正と、config/environments/production.rbの修正です。
.env.productionを変更する
.evn.productionの次の項目を修正します。
# Leaving them blank is not enough for authentication method 'none'. SMTP_SERVER=localhost SMTP_PORT=25 SMTP_LOGIN= SMTP_PASSWORD= SMTP_FROM_ADDRESS=admin@scriptlife.jp #SMTP_DOMAIN= # defaults to LOCAL_DOMAIN SMTP_DELIVERY_METHOD=smtp # delivery method can also be sendmail SMTP_AUTH_METHOD=plain SMTP_OPENSSL_VERIFY_MODE=none SMTP_ENABLE_STARTTLS_AUTO=true
SMTP_SERVERをlocalhost (postfixの起動しているサーバー)に、SMTP_PORTを25 (Postfixが受け付けているポート)にします。
SMTP_FROM_ADDRESSは、確認メールなどの送信者となるアドレスを指定します。
あとは、下の方のいくつかの項目のコメントを外して値を変更します。
CentOS7のPostfixは、標準でlocalhostのみを受け付ける状態で、ポート25の待ち受けで起動していました。なのでSMTP_PORTは587ではなく25を指定します。
メール送信用のポート番号は、昔は25でした。しかしスパム対策の関係で、外部から受け付けるポートは587(サブミッションポート)へ変更された経緯があります。(そのときに、認証も必須化されました)
ただこれは、外部から送られてくるスパムの踏み台にならないように、との対策でして。ローカルからのメール送信は、従来通りポート25を通して行っています。
production.rbを修正する
mastodonのソースコードを変更します。
config/environments/production.rbを開いて、
:user_name => ENV['SMTP_LOGIN'], :password => ENV['SMTP_PASSWORD'],
の行をコメントアウトします。
どうもポート587の認証を前提としているためか、これがあると認証しようとして失敗してしまっていました。
mastodon-sidekiqを再起動する
修正が終わったらサービスを再起動します。
# systemctl restart mastodon-sidekiq
として、メールを送信しているサービスを再起動します。
メールはsidekiqサービスで配信されているようなので、webやstreamingを再起動しても変更は反映されません。
送信されるかを確認してみる
メールが送信されるかのテストは、登録時の確認メール再送で行いました。
ログイン画面の下にある、「確認メールを受信できませんか?」から進んだ先のページでメールアドレスを入力すると、登録時の確認メールが再送されます。
まず適当なメールアドレスでアカウントを登録して、次回以降はそのアドレスから確認メールを再送していました。
で、再送を実行してみると…
届きました! デフォルトメールですが!
あと、鍵が赤くなっていることから分かるように、暗号化されていません。
ひとまずmastodonからメールが送信できるところまでやりました。
ここまででメール周りをなんとなく理解できたかな、といった感触ではあります。
しかし本番運用するにはメールの暗号化(TLS対応)と、ポート587で送信してソースコードを修正しなくてもよくする対応が必要でしょうか。(このあたりの記事が参考になるかなと思います)
接続周りについても、RailsやSidekiqに慣れていればそんな苦労しないものかもしれないって感じはしました。関連フレームワークを調べていくのが、Mastodonを理解する道かもしれません。
自前メールサーバーだと、そちらの運用も必要になりますから、面倒だったらmailgunに登録してしまうほうが簡単かもしれません。
すでに社内にあるメールサーバーや、プロバイダのメールサーバーなど、稼働しているものが利用できるならそれでも良いかも。
メールサービスも数年ぶりにまともに触った気がします…
以下、トラブルシューティング。
トラブルシューティング
遭遇したトラブルをメモしておきます。
設定を変更しても反映されない
.env.productionなどを変更しても、変更しただけでは反映されません。mastodon-sidekiqサービスの再起動が必要です。
確認メールが送られてこない
確認メールは、「確認前のアカウント」にしか送られてこないようです。そしてアカウントを確認前に戻す方法は見当たらなかった。
なので新しく登録してテストしていました。
gmailであれば、アカウントの後ろに「+~」で文字を追加すると、別のアドレスとして使えて、かつ受信は元アカウントでまとめられるのでお手軽。
(例えばhoge@gmail.comが本アカウントとしたとき、hoge+sub@gmail.comのメールアドレスにメールを送ると、hoge@gmail.comでそのメールも受信できるってわけ)
Postfixのログに何も出ない
/var/log/maillogを見張っていたのですが何も出ませんでした…
そもそも最初は、ポート587でやっていて接続できてなかった。
送信エラーについては、管理ツールのSidekiqから確認します。
管理アカウントであればMastodonの「設定」画面に「管理」タブが出てきます。そこに「Sidekiq」なるリンクがあるので、それを開きます。
別ページにSidekiqの管理サイトが開きますので、上部メニューより「再試行」を開いてみて下さい。
エラーで再送予定のものが残っているはずです。
送信に失敗したときはこんな感じで、「Errno::ECONNREFUSED: Connection refused - connect(2) for "localhost" port 587」とログが残っていました。
ちなみにproduction.rbを修正前の、ユーザー認証でこけてたときは「Net::SMTPAuthenticationError: 503 5.5.1 Error: authentication not enabled」でした。
SMTP_FROM_ADDRESSにgmailを使うとおこられる
最初、とりあえず自分のgmailアドレスを設定しておいたところ、到着したメールに「このメッセージは次のアドレスから送信されたものではない可能性があります:」なる警告が表示されました。
Gmail以外から送信されたgmailアカウントがFromになっていると警告してくれるみたいですね…注意しないと。
IPアドレスをlocalhostから変更すると上手くいく場合について
前の記事でアドバイスいただいたこちらの投稿についてです。
この話で思い出したのが、Mastodonとは別の話になりますが、以前私がphpでDBへ接続を試みたときに遭遇した現象です。
接続先の指定をlocalhostで行った場合はUNIXソケット、127.0.0.1の場合は接続元IPが127.0.0.1のTCP、ローカルのIPアドレス(192.168.1.10など)の場合は接続元IPがそのIPのTCPで接続しにいっていたことがありました。
同様のことがPostfixにも当てはまるとするなら、サービス側の受け入れ設定で、例えば接続許可を192.168.1.10のみとしていれば、同じマシンを示していても、localhostや127.0.0.1は拒否される結果となることが予想されます。
調査していないので未確定情報扱いですが、このような流れなのかな、と思いました。
だとすると環境によっては発生すると思いますので、見直すポイントとして抑えておくと良いかもしれません。
また、結果として私がひっかかっていたポイントは別のところでしたが、Postfixの設定のほうに目を向けるきっかけになりました。ありがとうございました!
コメント
[…] ◆mastodonからのメールを自サーバの Postfix から送る http://scriptlife.hacca.jp/contents/programming/2017/04/26/post-2278/ […]
はじめまして、このサイトの記事をもとにインスタンスを作成することができました。
しかし、この手順通りやったのですが確認メールの送信がうまくいきません・・・。
ターミナルからPostfixのsendmailを使うことで送信はできるのですが、
Sidekiqでエラーのログを吐き出します。
Errno::ENETUNREACH: Network unreachable – connect(2) for “localhost” port 25
と出るのですが、どうすればよいでしょうか?
初めまして。コメントありがとうございます。
エラーメッセージから推察することしかできませんが、ターミナルからメールは送信できるがlocalhostのポート25に接続できていないとのことで、Postfix側で拒否されているのではないでしょうか。
まずPostfixは動作していると思うのですが、まず念のため待ち受けを行っているかを、
netstat -an | grep 25
として確認してみるとよいと思います。
ポートを待ち受けていれば、
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
と出てくるはずです。
また telnet localhost 25 とすると、
Trying ::1…
Connected to localhost.
Escape character is ‘^]’.
220 mastdon.localdomain ESMTP Postfix
といった反応が返ってくるはずですが、
Trying ::1…
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1…
telnet: connect to address 127.0.0.1: Connection refused
となってしまった場合には、Postfixの設定などを見直す必要があります。
Postfixの設定/etc/postfix/main.cfにおいて、localhostが許可されているかも見直してみると良いと思います。
ここでinet_interfacesとmydestinationの設定項目が
inet_interfaces = localhost
mydestination = $myhostname, localhost.$mydomain, localhost
となっていれば、localhostからの送信は許可されていると思います。(この状態がCentOS7のデフォルトだったと思います)
これらPostfixの設定でlocalhostが許可されているか(127.0.0.1などではないか)についても確認してみるところです。
その他は、Postfix側の設定で変更しているところをチェックしていく、/var/log/maillogなどにエラーログが出ていればそれを手がかりに見ていくなどでしょうか。
ファイアウォールやSELinuxなどのセキュリティソフトがブロックしてしまっていることも考えられるので、それらのログを確認したり、可能であれば一端オフにしてみるなども必要かもしれません。
(ただしセキュリティを緩める操作を行うことについては、特に自己責任でお願いいたします)
また以前にいただいたコメントで、Mastodonの設定がlocalhostではうまくいかず、IPアドレスに変更したら送信できたというものがありました。こちらも試してみてはいかがでしょうか。
http://scriptlife.hacca.jp/contents/programming/2017/04/23/post-2268/#comment-49
ありがとうございます
おかげさまでポートに拒否されるという状況は改善されました。
しかし、Relay access deniedと出てしまいまだマストドンからの送信はできていない状況です・・・。
うーん…メッセージからすると、「Postfixは起動しているがメール送信が拒否されている」状態ではないかと思います。
main.cfの送信許可設定を見直してみるとよいのではないでしょうか。
または「postfix relay access denied」あたりで検索してみると、何かヒントになるかもしれません。