Ubuntu+PerlでWebシステム開発 環境構築

  • Ubuntu20
  • Ubuntu18
  • Ubuntu16

クラウドメール配信SendGridとPostfixとの連携

SendGridは、メール配信のためのクラウドメール配信サービスです。

SendGridを使う理由

SendGridを使う理由です。SendGridは、メール配信のためのクラウドサービスで、月に1万2000通を超えると、月額の料金がかかります。

無料でメール配信しようとする場合、postfixを使って、SMTPサーバーを立てて、sendmailを使って送信する方法が考えられます。

ただし、クラウドサーバーでポート25番のSMTPでメールを送れなかったり、メールの配信数が増えてきたり、ブラックリストに登録されたくない、という課題に突き当たります。

クラウドサーバーでポート25番のSMTPでメールを送れない

パブリックなクラウドサーバーの構成として、外部に対して、動的にIPアドレスを見せている場合、もし選択されたIPアドレスが、ブラックリストに登録されていたら、メールは到着しません。

このような予期しな不具合があるため、デフォルトで、25番ポートからのメール送信を禁止しているという場合があります。

このような場合は、SendGridとメールのWeb API、あるいは、postfixのリレー機能を使って、SengGridに接続するという方法があります。

既存のシステムから移行する場合は、リレー機能を使うと、アプリケーションの修正なしで、移行できるようです。

メールの通数が増えて処理に時間がかかる

メールの通数が増えてきて処理に時間がかかる場合は、SendGridを使うと、処理が速く終わるようです。

「メール送信にかかっていた時間を大幅に短縮できました。それまで8時間近くかかっていた宛先約16万件のメルマガ送信が、SendGridを利用するようになってからは3~4分で完了するようになりました。」

という体験談が書かれています。

ブラックリストに登録されたくない

もし、メール送信元のIPアドレスがブラックリストに登録されてしまった場合、メールが到達しなくなります。

SendGridを使うと、そのようなことが、もしSendGrid内で起こったとしても、SendGrid側で、解決してくれて、高い到達率を実現してくれるようです。

SendGridの価格

価格は以下のようになっています。

SendGrid価格(2020年5月21日現在)

SendGridの申し込み

トップページから、メールアドレスを入力して申し込みます。

SendGrid申し込み

審査の後、本承認のメールが届きます。

Web APIやリレーメールを送るために必要なSendGridの情報

Web APIやリレーメールを送るために必要なSendGridの情報は、ユーザー名とパスワードです。

ユーザー名は、登録メールアドレスとは異なるので注意しましょう。

SendGridとPostfixを連携する

SendGridはWeb APIを持っていますが、Postfixと連携して、sendmailコマンドからのメール送信をSendGridに接続することもできます。

この方法の利点は、SendGridを使う使わないの選択で、メールを送信するアプリケーションに変更を加える必要がないことです。アプリケーションを抽象化できます。

デメリットは、Postfixのインストールと設定が必要なことです。

(UbuntuのPostfixのインストールは、GUI画面が登場するので、インストール自動化が可能なのかは、今の僕にはまだわからない。)

SendGridの公式ドキュメント

手順の詳細についてはSendGridのドキュメントが詳しいです。

基本的なドキュメント。新規に始める場合は「SendGridドキュメント - Postfix」の手順を実行しましょう。

SendGridドキュメント - Postfix

以下では、メール配信に当たって、応用的な情報が記載されています。

PostfixからSendGridへのリレーをカスタマイズする - SendGridブログ

SendGridとPostfixを連携する手順

Postfixの設定ファイルを編集します。

sudo vi /etc/postfix/main.cf

以下の設定を追加します。SMTP-Authプロトコルを使って、Postfixは、SendGridにメールの配信を依頼します。

上記の公式ドキュメントから引用して、手順をここに書き出してみます。(以下引用、2020年6月2日現在)

Postfixの設定ファイルを開いてください。通常、 /etc/postfix/main.cf です。そして、以下に書き換えてください。他の内容は削除して大丈夫です。

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tls_security_level = encrypt
header_size_limit = 4096000
relayhost = [smtp.sendgrid.net]:587

ここで上で設定に記述したパスワードファイルを作成します。

sudo vi /etc/postfix/sasl_passwd

SendGridのユーザー名とパスワードを指定します。

[smtp.sendgrid.net]:587 sg1idy2t@kke.com:aitoseigi1A

次に、このファイルがrootアカウントでのみ読み書きができるよう制限されていることを確認して、postmap コマンドを使用してPostfixがこの新しいファイルを使用するようハッシュテーブルを更新します:

sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/sasl_passwd

最後にPostfixをsystemctlで、再起動してください:

sudo systemctl restart postfix

sendmailコマンドでメール送信

sendmailコマンドでメール送信してみましょう。送信元がなかった場合は、メールをはじかれる経験があるので、「-f」で送信元メールアドレスを指定しています。

echo Hello | sendmail -f kimoto.example@foo.com kimoto.example@foo.com

メール送信できれば、正しく設定できています。

送信できていなければ、mailqコマンドで、まずメールのキューを見てみましょう。

mailq

キューに送信失敗と書かれていれば失敗しています。

Postfixのsystemdのログを見るにはjournalctlコマンドを使います。「-u」オプションでユニット「postfix」を指定します。sudoで実行しないとPostfixのログが見れないので注意してください。ログの最後の部分だけ見たい場合は「-r」オプションを組み合わせます。

sudo journalctl -r -u postfix

Postfixのログのサンプルです。

-- Logs begin at Mon 2020-06-01 15:51:16 JST, end at Thu 2020-07-23 14:44:11 JST. --
Jul 22 13:24:35 shinshina-development-app-00000001 systemd[1]: Started Postfix Mail Transport Agent.
Jul 22 13:24:35 shinshina-development-app-00000001 systemd[1]: Starting Postfix Mail Transport Agent...
-- Reboot --
Jul 22 13:13:47 shinshina-development-app-00000001 systemd[1]: Stopped Postfix Mail Transport Agent.