Blog

さくらのVPSでPostfixからSendGridへのメールのリレーをAnsibleで設定する方法

onagatani 技術ブログ

こんにちわ。onagataniことながたにです。
先日さくらのVPSをAnsibleでセットアップする記事を書いたのですが、今回はその続きになります。

image
Blog
さくらのVPSに手軽にセキュアで高速なMovable Type用サーバをAnsibleで自動で構築する方法

皆さんはサーバからのメール配信設定をどのように設定していますでしょうか?
各社IaaSなどはOP25B対策でサーバ自身から直接メール配信できるサーバは少ないのかと思います。

AWS EC2 -> 制限解除を行うことでEC2からの送信は可能
さくらのVPS -> 本登録に移行すると送信可能
GCP -> NG
Alibaba Cloud -> ほぼNG
Azure -> NG

さくらでは一応可能なようですが、 今回はSendGridを利用してメールを送信する設定を行います。一応、前回の記事の続きという位置づけですが、Postfixの設定変更の自動化なので さくらのVPS以外でも適用可能です。

今回のポイント

  • VPS/VMから直接メール配信を行わずにSendGridへメールをリレーして送信する
  • Postfixのリレー設定はAnsibleで自動で行う
  • Postfixからリレー送信するのでMTなどにSMTPの設定をする必要はありません
  • メールの受信設定については行わない(メールサーバはGmailなどをご利用下さい)

ステップ1:SendGridのアカウントを取得する

既にSendGridのアカウントを持っている方はSKIPして頂いて大丈夫です。
さくらのVPSのコンパネからSendGridのアカウント登録を行います。

sendgrid1.png

左メニューのSendGrid申込をクリックして申込画面に遷移します。

sendgrid2.png

SendGridの申込画面に遷移したら登録用のメールアドレスを入力して次の画面に進みます。
メールが届いていていると思いますのでメールからSendGridの詳細登録画面に遷移し申込を完了させます。

sendgrid3.png

SendGridは代理店からの申込などは行なえませんので受託業務の場合はお客様に直接SendGridへ申し込んで頂きましょう。
今回はさくらのVPSから申し込んでいるので無料版のSendGridでも通常より多くメール送信が可能です。

ステップ2:SendGridからAPIキーを発行する

SendGridは申し込んでから認証登録までに数日かかるようです。登録が済みましたら こちらからログインします。
Postfixからリレーを行う場合にはSendGridの認証を通す必要がありますのでダッシュボードからAPIキーを発行します。

SendGrid4.png

Create API Keyをクリックして画面遷移するとAPIキー発行画面になります。さらに画面下にある権限を調整します。

SendGrid5.png

APIキーの識別用の名称(例えば送信元サーバ名など)を入力し、Restricted AccessとMail Sendの権限付与を行い最下部のCreate & Viewで確定します。

SendGrid7.png

API キーが発行されますので、キーをクリックしてCOPYします。(どこかにメモしておきましょう)
こちらの作業でSendGrid管理画面の操作は完了です。

ステップ3:Ansibleの設定を行う

AnsibleにSendGridの設定を行うため前回のステップ5のファイルを調整します。

/path/to/IZANAMI/group_vars/all/vault.yml

以下のように内容を修正します

vault:
  mysql:
    root:
      password: 1234@Password456
  ssh:
    users:
      - { name: onagatani,  group: "wheel", password: "vault@passwd" }
  postfix:
    smtp:
      from: test.colsis.com
      user: apikey
      pass: XXXXXXXXXXXXXXXXXXXXXX
      server: smtp.sendgrid.net
      port: 587
  mt:
    db:
      user: movabletype
      passwd: 1234@Password456

postfixの設定値だけfrom以下に次のように追加しています
※ AWS SESを利用する場合はAWS SES用のSMTPユーザ名、SMTPパスワード、SMTPサーバ名に変更する事で利用可能です

user:固定でapikeyになります
pass:先程コピーしたAPIキーを貼り付けます
server:固定になります
port:587 固定になります

Ansibleをrelay設定に切り替えるために前回のステップ3のファイルを調整します。

postfix:
  relay: True
   smtp:
     from: "{{ vault.postfix.smtp.from }}"
     user: "{{ vault.postfix.smtp.user }}"
     pass: "{{ vault.postfix.smtp.pass }}"
     server: "{{ vault.postfix.smtp.server }}"
     port: "{{ vault.postfix.smtp.port }}"

relay:FalseをTrueに変更しsmtp以下は固定で追加します。
以上でAnsible側の設定変更も完了しました。それでは実際にプロビジョニングを行います。

ステップ4:Ansibleを実行しサーバの設定を変更する

前回VPSサーバ側のsshdを公開鍵認証に変更していますので秘密鍵を指定してプロビジョニングを実施します。
IZANAMIディレクトリ以下でコマンドを実行してAnsibleを実行します。

$ ansible-playbook -i hosts site.yml --private-key=~/.ssh/onagatani.pem -u onagatani -l development -K --tags=postfix

--private-keyの箇所は前回作成した秘密鍵のパスに変更してください
-u onagataniの箇所は前回作成したユーザ名に変更して下さい
--tags=postfixを追加する事でpostfixの設定のみ行います

ステップ5:メール送信のテストを行う

それでは実際にサーバーからメール送信を行ってみます。
前回と同じようにSSHでサーバへログインし、コマンドでメールを送信テストします。SSHでログインし以下のコマンドでメール送信を行ってください。

$echo "mail body" | mail -s "sendgrid test" -r noreply@test.colsis.jp yourname@example.com

-r:メールの送信元アドレスになります。前回postfox.smtp.fromに設定したドメイン名(DNSを割り当てたドメイン)にするとよいでしょう noreply@ドメイン名など
yourname@example.com : ご自身で受信できるメールアドレスを指定して下さい

正常に動作するとsendgrid testという件名のメールがyourname@example.comで受信出来ているはずです。
届かない場合は以下のようにサーバ内でメールの送信ログを確認します。

$ sudo tail -f /var/log/maillog

to=<yourname@example.com>の送信ログが250 OKであれば問題ありませんが、それ以外であればなんらかの問題が発生しているかと思います。
認証エラーなどがある場合はAPIキーの設定などを確認して下さい。SendGridを利用している形跡がない場合はpostfixを再起動すると良いでしょう。

まとめ

如何でしたでしょうか。PostfixからSendGridやSESを使う場合にはいくつか設定変更などが必要になりますが、Ansibleは一度設定すると次回から他のサーバにも利用する事が可能です。
とはいえ、メール送信ではSPFやDKIMを設定していないと到達率が下がる可能性があります。送信元ドメインのDNSでSPFなどを設定している場合はSendGridをSPFに登録してあげないと許可されないサーバからの送信とみなされて迷惑メールになってしまう可能性がありますのでSendGridのマニュアルに沿ってDNSへの登録作業を行って下さい。

サポート | SendGrid【日本公式サイト】

一覧にもどる