SendGrid 新人成長記 第九回 メールサーバを立ててメール送信してみた

新人成長記

最近はGmailなどのWebメールが一般的になり、インフラを意識せずともメールが送れてしまう世の中です。かくいう私もご多分に洩れず、メールの仕組みに無頓着なまま二十余年が過ぎていました。しかし、SendGridチームで働くうち、メール送信に必要な手順を学んでおきたいと思うようになり、今回チャレンジしてみることにしました。

直接SendGridの機能に関わる話ではないので(いいんでしょうか)、設定等の詳細な説明はせずに、メールが送れるようになるまでの流れをよく知らない人にもわかりやすく書けたらと思います。

メールが送れるようになるまで (1) : インフラの構築

住む家や住所がなければ手紙の受け渡しができないのと同じように、メールの場合にもまず最低限の基盤=インフラを準備しなければなりません。

サーバを用意する

まずは、メール送信を実際に行うコンピュータ(サーバ)がないと始まりません。
今回は、Amazon Web Services (AWS) が提供するクラウド上の仮想サーバ Amazon Elastic Compute Cloud (Amazon EC2; 以後EC2)を利用しました。物理的なサーバを用意しなくても、Webページから簡単な操作で自分専用のサーバを持つことができて便利です。AWSはユーザ登録後1年間は無料利用枠があり、今回もその範囲内でEC2を利用することができました。

サーバを用意したら、メールを取り扱えるようにメールサーバ用のソフトウェアをインストールします(これはMail Transfer Agentと呼ばれています)。代表的なものとしてPostfixが知られていて、今回はこれを使いました。ありがたいことに、EC2には最初からインストールされていました。

実は、メール送信自体はもうすでに可能です。EC2のサーバに接続して、以下のコマンドで送信できてしまいます。

$ sendmail atesaki@toaddress.example	#宛先のメールアドレスを指定
From:sasidasi@fromaddress.example		#差出人 (Fromヘッダ) を指定
To:atesaki@toaddress.example			#宛先 (Toヘッダ) を指定
Subject:test						  #件名 (Subjectヘッダ) を指定
This is test.						  #本文を入力
.								    #ピリオドで終了

ここで、宛先はメールが確認できるアドレス、差出人は適当なアドレスを指定します(上では、例として宛先ドメインにtoaddress.example、差出人のドメインにfromaddress.exampleを使いました)。
しかし、実際に自分のメールアドレスに送ってみると、迷惑メールフォルダにすら届きませんでした。このメールは正当なメールとはとても言えないのです。

独自ドメインを用意する

上のメールが正当でないポイントの一つは、差出人アドレスが適当で、身元をきちんと明らかにしていないところです。そこでまずは、メールの差出人、つまりメールアドレスのドメインを決めます。Gmailの場合には”gmail.com”、Yahoo! JAPANのメールの場合は”yahoo.co.jp”というように予めドメインが決まっていますが、本来はそれも自分で用意しなければなりません。「お名前.com」やAmazon Route53などからドメインを購入することができます。本記事では、以後”fromaddress.example”ドメインを取得したとして話を進めます。
実際に自分のドメインを用意して差出人として指定し、Gmailのアカウント宛てにメールの送信を試してみましたが、それでも届きませんでした。ドメインを用意しただけでは、正当なメールだという証明にはならなかったようです。受信者側にスパムメールでないと認めてもらうために、やらなければならないことはまだあります。

メールが送れるようになるまで (2) : スパムメール対策

固定IPアドレスを用意する

身元情報は差出人の他にもあります。それは、サーバの住所(=IPアドレス)です。EC2ではIPアドレスがはじめから紐付けられていますが、変動する可能性があります。この後の設定をしやすくするよう、固定IPアドレスを割り当てました。AWSの場合、固定IPアドレスはElastic IPと呼ばれています。
固定IPアドレスを用意したら、差出人ドメインのAレコードに記載しておきます。

送信ドメイン認証を設定する 1. SPF

スパムメールの判別のために確立された技術が送信ドメイン認証です。その中でもSPF (Sender Policy Framework) は、送信者のドメインと送信元IPアドレスを照合する仕組みです。送信者はドメインのDNSレコードにどのIPアドレスからメールを送るか明記します。受信者はメールアドレスのドメインのDNSレコードに記載されたIPアドレスから正しくメールが送られたかチェックします。
自分で設定するときには、以下の二つを設定しました。

  • ドメインのTXTレコードに送信元IPアドレスを記載(以下は例)
$ dig fromaddress.example txt
fromaddress.example IN TXT "v=spf1 ip4:198.51.100.255 -all"
  • メールのReturn-Pathに自分のドメインを設定

これで、差出人ドメインとIPアドレスが対応付き、スパムと見なされにくくなります。自分で試してみたときには、SPFを設定したところGmailのアカウントにメールが届くようになりました!
ただこれで充分とはまだ言えないので、他にもやってみた設定を以下で紹介します。

送信ドメイン認証を設定する 2. DKIM

DKIM (DomainKeys Identified Mail) は、電子署名を用いた送信ドメイン認証です。送信者は電子署名をメールヘッダに記載し、受信者は送信者のドメインのDNSレコードに記載された公開鍵を使ってそれを照合します。必要な作業は以下です。

  • 公開鍵と秘密鍵のペアを生成
  • DNSに公開鍵を記載したDKIMのレコードを追加(以下は例)
$ dig s1._domainkey.fromaddress.example txt
s1._domainkey.fromaddress.example IN TXT "v=DKIM1; k=rsa; p=XXXXX"
  • 秘密鍵を用いて作成した電子署名をメールのDKIM-Signatureヘッダに記載するよう設定

これで、メールが指定したドメインからきちんと届き、かつ改ざんされていないことが証明できます。

送信ドメイン認証を設定する 3. DMARC

これは上二つと少しアプローチが異なります。SPFとDKIMは自分が送ったメールがなりすましでないことを証明するものであったのに対し、DMARC (Domain-based Message Authentication, Reporting, and Conformance) は自分になりすましたメールを受信者がどう処理すべきか宣言するものです。
行った作業は、_dmarc.fromaddress.exampleへのTXTレコード追加です。

$ dig _dmarc.fromaddress.example txt
_dmarc.fromaddress.example. IN TXT "v=DMARC1;p=none;rua=mailto:dmarc@fromaddress.example;ruf=mailto:dmarc@fromaddress.example;rf=afrf;pct=100"
DMARC

3つの送信ドメイン認証を設定して、Gmailで確認したところ

Reverse DNSを設定する

IPアドレスからドメインを調べることを逆引き (Reverse DNS lookup) と呼びます。送信元IPアドレスからドメインを逆引きできない場合、受信者によっては受け取りが拒否されてしまうことがあるので、設定したほうがよいでしょう。EC2の場合にはフォームが用意されていて、IPアドレスとドメインを知らせるとReverse DNSを設定してくれます。

メールが送れるようになるまで (3) : セキュリティ

自分が送るメールやメールサーバを悪意のあるユーザから守る設定も必要です。

TLSで暗号化する

Gmailのアカウント宛に送ったメールを見てみると、斜線付きの赤い錠前マークが表示されていました。これはメールがTLS (Transport Layer Security) というセキュリティプロトコルで暗号化されていないことを示すものです。このままだとメールが盗み見られるリスクがあるので、きちんと暗号化したほうがいいでしょう。Postfixの設定ファイルを少し編集することで設定が可能です。設定が完了すると、錠前マークが赤から灰色に変わり、TLS暗号化ができたことがわかります。

TLSで暗号化する

TLS暗号化設定ビフォーアフター(モザイク部分はドメイン)

SMTP認証を設定する

これは、メールの送信時にアカウント名やパスワードなどの認証を設けて、メールサーバの不正利用を防ぐものです。Postfixでは汎用的な認証のフレームワークであるSASL (Simple Authentication and Security Layler) ライブラリを利用するので、これをインストールして、Postfixの設定ファイルを編集することで設定できました。

EC2送信制限の解除を申請する

自分のメールサーバから送信が可能となり、何通かテストメールを送っていたら、”Connection timed out”というエラーが頻出するようになり、最終的に全く送れなくなってしまいました。これは、EC2を用いたスパムメールの送信を防ぐためにAWSが設定している送信制限に抵触したものと思われます。AWSのEC2でメールサーバを立てたい場合、この送信制限を解除してもらわなければなりません。申請はReverse DNSと同じフォームから可能です。申請を行ったところ、数営業日後に制限解除された旨の返信が来て、無事にまたメールを送れるようになりました。

不正中継に利用されないようにする

セキュリティをしっかり設けないと、自分のメールサーバを踏み台にしてスパムメールが送られてしまいます。EC2にメール送信制限があるのもこのためです。送信制限を解除したからには、悪意のあるユーザに使われないように自分で対策をしなければなりません。Postfixでは中継を許可するサーバを指定することができ、例えば自分自身(ローカルホスト)だけを指定すれば、外部からのメールの中継を禁止できます。

メール送信をイチからやってみて

ここまでメール送信に最低限必要なことを概観してみました。実際やってみると、AWSなどのクラウドサービスを使えば簡単にサーバを立てることができ、メールを「ただ送る」のは難しくないとわかりました。それよりもずっと大変なのは、メールを「きちんと届ける」ことです。自分で試してみて、セキュリティを担保することや、スパムと勘違いされないようにメールを送ることの大切さを実感できました。SendGridを使えば、大量送信の管理まで含めた、メールを正しく届けるためのノウハウを誰でも活用できます。そんな手軽さ、便利さを改めて知ることができました!

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。