Mail | Network
メール
運用例1 example.comの例
- ドメイン レジストラ:お名前.com
- DNS ゾーン管理:AWS Route 53
- メールサービス: Mailgun
お名前.com
お名前.comからAWS Route 53にゾーンを委譲する。
※ 実際の設定画面のスクリーンショットは省略
AWS Route 53
Mailgunが発行する情報をRoute 53のゾーンに追加する。
- MXレコードに
mxa.mailgun.org、mxb.mailgun.orgを設定 - SPFを指定
- DKIMを指定
※ 実際の設定画面のスクリーンショットは省略
Mailgun
送信
※ 実際の設定画面のスクリーンショットは省略
ref. DKIMとは?
受信
※ 実際の設定画面のスクリーンショットは省略
Mailgunで受けるものは info@forward.example.com に転送。
送信プログラム
以下コードは分かりやすさのためにセキュリティをまったく考慮していない。
実運用で使用しないこと。
<?php
# Include the Autoloader (see "Libraries" for install instructions)
require '../vendor/autoload.php';
use Mailgun\Mailgun;
$name = $_POST['name'];
$email = $_POST['email'];
$content = $_POST['content'];
$template = <<<EOF
名前:%s
メールアドレス:%s
お問合せ内容:
%s
EOF;
$text = sprintf($template, $name, $email, $content);
# Instantiate the client.
# @see https://documentation.mailgun.com/en/latest/user_manual.html#sending-via-api
$mg = Mailgun::create('`mailgun key`');
$mg->messages()->send('mg.example.com', [ // SMTPサーバとしてmg.example.com、つまりmxa.mailgun.orgが使用される。
'from' => 'info@example.com',
'to' => 'info@example.com',
'subject' => 'example.comからお問い合わせがありました',
'text' => $text,
]);
header('Location: https://example.com/thanks.html');
exit;
MXレコード
MXレコードは、メールサーバーのアドレスをドメイン名に関連づけるもので、メールを配信するメールサーバーを決定するために使われます。メールを送信するとき、送信元のメールサーバーは宛先のドメイン名を見てDNSサーバーに問い合わせを行い、MXレコードを取得します。つまり、MXレコードに記載されているホスト名に対応するIPアドレスのメールサーバーに対し、SMTPプロトコルを使用してメールを送信します。
増井 敏克. 実務で使える メール技術の教科書 基本のしくみからプロトコル・サーバー構築・送信ドメイン認証・添付ファイル・暗号化・セキュリティ対策まで (p.167). Kindle 版.
MX は(外部からの)メールを配信するサーバ。
複数のMXレコードを使用する例
MXレコードの優先度
MX レコードでは、複数記述したときにアクセス先の優先順位が決められます。 優先度の数字によってある程度分散することができます。 数字が低いほど優先度が高く、数字が高いほど優先度が低くなります。
例1)
mg.example.com MX 5 mxa.mailgun.com
10 mxb.mailgun.com
mxa.mailgun.comの優先度が高くなるのでこちらを使用する。
mxa.mailgun.comが使用できない場合はmxb.mailgun.comを使用する。
例2)
example.com MX 10 mail.example.com
mg.example.com MX 5 mxa.mailgun.com
10 mxb.mailgun.com
推測
- サブドメインなしMXレコード(example.com)に設定されたmail.example.comが優先して使用
- mail.example.comが使用できない場合はサブドメインありのMXレコード(mg.example.com)に設定されたmxa.mailgun.comを使用
- mxa.mailgun.comが使用できない場合はmxb.mailgun.comを使用
ref. 複数の MX レコードを使用する例
例3)
推測
MXレコードがない場合。
Aレコードに配信される。
運用例2
- 受信はさくらのメールボックスを使用
- 送信はMailgunを使用
※ 実際の構成図は省略
送信コード
以下コードは分かりやすさのためにセキュリティをまったく考慮していない。
実運用で使用しないこと。
<?php
# Include the Autoloader (see "Libraries" for install instructions)
require '../vendor/autoload.php';
use Mailgun\Mailgun;
$name = $_POST['name'];
$email = $_POST['email'];
$content = $_POST['content'];
$template = <<<EOF
名前:%s
メールアドレス:%s
お問合せ内容:
%s
EOF;
$text = sprintf($template, $name, $email, $content);
# Instantiate the client.
# @see https://documentation.mailgun.com/en/latest/user_manual.html#sending-via-api
$mg = Mailgun::create('`mailgun key`');
$mg->messages()->send('mg.example.com', [ // SMTPサーバとしてmg.example.com、つまりmxa.mailgun.orgが使用される。
'from' => 'info@example.com',
'to' => 'info@hoge.com',
'subject' => 'example.comからお問い合わせがありました',
'text' => $text,
]);
header('Location: https://example.com/thanks.html');
exit;
エンベロープとヘッダ
https://baremail.jp/blog/2021/05/25/1377/?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAxvGfBhB-EiwAMPakqqxhQJs1WXBtrRSxwXiMtPTswKQGjZlif4ApuKTZ2BfwRlNhUjbcPBoCiC4QAvD_BwE
- エンベロープ To:「メールでは送信先のアドレスにあたります。メールの配送にあたっては、この宛先が正しく存在してさえいれば送信することができます。」
ref. https://baremail.jp/blog/2021/05/25/1377/?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAxvGfBhB-EiwAMPakqqxhQJs1WXBtrRSxwXiMtPTswKQGjZlif4ApuKTZ2BfwRlNhUjbcPBoCiC4QAvD_BwE - エンベロープ From:「実際に送信した差出人(送信元)」 宛先が存在しなかったときのエラーメールの送信先 ref. https://baremail.jp/blog/2021/05/25/1377/?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAxvGfBhB-EiwAMPakqqxhQJs1WXBtrRSxwXiMtPTswKQGjZlif4ApuKTZ2BfwRlNhUjbcPBoCiC4QAvD_BwE
- ヘッダ To:「メールではメールソフト上で確認できる宛先にあたります。「To」および「CC」の欄に入るアドレスです。」 ref. https://baremail.jp/blog/2021/05/25/1377/?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAxvGfBhB-EiwAMPakqqxhQJs1WXBtrRSxwXiMtPTswKQGjZlif4ApuKTZ2BfwRlNhUjbcPBoCiC4QAvD_BwE
- ヘッダ From:メールではメールソフト上で表示される差出人(Fromアドレス)にあたります。 ref. https://baremail.jp/blog/2021/05/25/1377/?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAxvGfBhB-EiwAMPakqqxhQJs1WXBtrRSxwXiMtPTswKQGjZlif4ApuKTZ2BfwRlNhUjbcPBoCiC4QAvD_BwE
実際の送信もとはエンベロープ Fromだが、メールソフトに表示される差出人はヘッダ From。
なりすまし
ヘッダFromとエンベロープFromの情報が異なっていてもメールを送ることができる仕組みを悪用したのが「なりすましメール」です。
ref. https://baremail.jp/blog/2021/05/25/1377/?utm_source=google&utm_medium=cpc&utm_campaign=dsa&gclid=CjwKCAiAxvGfBhB-EiwAMPakqqxhQJs1WXBtrRSxwXiMtPTswKQGjZlif4ApuKTZ2BfwRlNhUjbcPBoCiC4QAvD_BwE
加えてエンベロープ Fromも簡単に偽装できる。
送信元IP
送信元IPはメールソースで以下のように確認するメールヘッダの情報の中で、特に重要なのがReceivedの情報です。
Received はメールが送信されてきたサーバーの経路を示します。
経路は下から上に読んでいきます(基本的に一番下が送信元、一番上が宛先)。
よって、送信元を確認する場合は、一番下のReceived fromの情報を見ます。
※一番下を見てもよく分からない際は、下から二番目、三番目を見ると分かる場合があります。 ref.https://www.kitasato-u.ac.jp/knc/mail/download/info_mail_header_v2.pdfSPFは送信元IPが偽装されていないことを前提にする送信元IPはエンベロープFrom/ヘッダ Fromとは異なる(こちらはドメイン) 👈👈👈👈👈
SPF
ref. https://www.nic.ad.jp/ja/basics/terms/spf.html
SPF(Sender Policy Framework)は送信元の正当性をDNSを使って証明する仕組み。
エンベロープ Fromもヘッダ Fromも簡単に偽装できる。SPFはエンベロープ Fromの偽装を見抜く技術。具体的には送信元ドメイン(エンベロープ FromのドメインとHELOドメイン1)のDNSからSPFレコードを取得して、送信元IPがレコードに含まれているかをチェックする(送信元IPは偽装が難しいことを前提にしている)。
foo.example.com TXT v=spf1 +ip4:xxx.xxx.xxx.xxx/24 +a:foo.example.com +mx ~all
上記はIPアドレスがxxx.xxx.xxx.xxx/24またはAレコードと等しい場合またはMXレコードのドメインのIPは許可、それ以外は不正メールとして処理されるて配信される。
SPFはSMTPセッション中、エンベロープFromを用いてメール本文(ペイロード)が送信される前の段階でチェックされるため、スパム判定を早期に行うことができる(送信元IPの偽装がTCPの仕組み上困難であることを前提としている)。
ref.
- https://baremail.jp/blog/2021/03/16/1124/
- SPFレコードの書き方とは? 記述例を総まとめ
- SPF(Sender Policy Framework)
- 送信ドメインを認証するためのSPFレコードに詳しくなろう
- DNS configuration tips and tricks for Pardot
- 間違いから学ぶSPFレコードの正しい書き方
+、-、~、?の意味。
・「+」⇒正常なメールとして処理
・「⁻」⇒不正メールとして処理され、配信拒否の可能性あり
・「~」⇒不正メールとして処理されるが、配信される
・「?」⇒SPF指定なしとして処理される
省略した場合は+として処理される。
省略した場合は全て「+」(正常なメール)として処理されます。
ref. https://baremail.jp/blog/2020/02/28/579/
ref.
- https://sendgrid.kke.co.jp/blog/?p=3509&utm_source=google&utm_medium=cpc&utm_content=text&utm_campaign=dsa&gclid=Cj0KCQiAxoiQBhCRARIsAPsvo-y6P1r8PAGf-h18Q_Rq2yHUSeaI7SJiiqeZY6YsnlotbRBgCS7heroaAoMYEALw_wcB
- https://help.salesforce.com/s/articleView?id=000313465&type=1
-all:SPFレコードで定義されていないアドレスからのメール送信を許可しない旨を受信側のサーバーに伝えるもの(またそのようなアドレスを拒否するように指示)
ref. https://kinsta.com/jp/knowledgebase/spf-record/
末尾の-allは、「SPFレコードのリストにないアドレスはメール送信を許可されておらず、拒否すべき」であることをサーバーに伝えています。 この部分は~allでもよいのですが、その場合は「リストにないメールはセキュアでない、もしくはスパムであると表示されるが、受信はすべき」という意味になります。
https://www.cloudflare.com/ja-jp/learning/dns/dns-records/dns-spf-record/
サブドメインと SPF
SPFのポリシーは、サブドメインには自動的に継承されません。 SPFを使用してメールを認証するとき、サブドメインを使用してメールを送信する場合は、DNSエントリに変更を加え、これらのサブドメインに個別にSPFレコードを設定する必要があります。
ref. https://maildata.jp/blog/blog-2023-02-09.html
用語
NDR 【Non-Delivery Receipt】 配信不能レポート / バウンスメール / bounce mail
NDRとは、電子メールが宛先へ送達できない場合に、メールサーバが送信者にその旨報告するメールのこと。
https://e-words.jp/w/NDR.html
-
HELOドメイン:SMTPのHELOコマンドで使用されたドメイン名) ref. https://www.nic.ad.jp/ja/basics/terms/spf.html ↩