「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>通信技術]]

*目次 [#ad818906]
#contents

*概要 [#fc9651f8]
メール送信・受信処理について

**仕組み [#u5ed5597]

***全体像 [#fff34889]
                    ┌────── (SMTP) ──────┐
                    │                                │
 MailBox ← MDA ← MTA(内) ⇔ MTA(外) ⇔ MTA(外) ⇔ MTA(内) → MDA → MailBox 
    ↓              ↑                                ↑               ↓
   MRA             MSA                               MSA              MRA
    ↓              ↑                                ↑               ↓
  (POP)           (SMTP)                            (SMTP)           (POP)
    ↓              ↑                                ↑               ↓
   MUA───────┘                                └───────MUA
                      ┌──────  (SMTP)  ──────┐
                      │                                  │
 Mail Box ← MDA ← MTA(内) ⇔ MTA(外)  ⇔  MTA(外) ⇔ MTA(内) → MDA → Mail Box 
    ↓                ↑                                  ↑                ↓
   MRA               MSA                                 MSA               MRA
    ↓                ↑                                  ↑                ↓
  (POP)             (SMTP)                              (SMTP)            (POP)
    ↓                ↑                                  ↑                ↓
   MUA  ───────┘                                  └───────  MUA

***アドレス [#na253534]

-ヘッダとエンベロープ~
仕組みとしては、BCCやML、[[大量配信時の運用>#c1b9ffd9]]等で利用されている。~
しかし、送信元詐称などで悪用されることも多くなってしまっている。
--ヘッダ → 表記上
--エンベロープ → SMTP上

-送信元・送信先アドレス
--送信元アドレス
---ヘッダFrom
---エンベロープFrom

--送信先アドレス
---ヘッダTo
---エンベロープTo

***コマンド [#b5aa8eed]
-=[[SMTPプロトコル>#nb22d905]]のコマンド

--EHLO/HELOコマンド(通信開始)
--MAIL FROMコマンド(エンベロープFromを送る)
--RCPT TOコマンド(エンベロープToを送る)
--DATAコマンド(メールメッセージ送信開始)
--QUITコマンド(通信終了)

-=[[POPプロトコル>#eb26945b]]のコマンド

***メールヘッダ [#x915ae06]

|#|>|項目|概要|h
|1|>|Return-Path: メアド|エラーメールの返信先。通常From。詐称可能。|
|2|>|Received: from MTA by MTA for メアド|転送経路をスタックする|
|2-1||from|メールを送信したMTA(※ 詐称不可)|
|2-2||by|メールを受信したMTA|
|1|>|Return-Path: メアド&br; MAIL FROMコマンド値|(送信元メアド)&br;MAIL FROMコマンド値 ≒ エンベロープFrom値(詐称可能)。&br;メールを受信したMTAがエラーメールの返信先として記録。&br;なお、Errors-To: はRFCに定義されておらず方言的。|
|2|>|Received: from MTA by MTA for メアド|以下のように転送経路をスタックする&br; Received: from MTA by MTA for メアド&br; Received: from MTA by MTA for メアド&br; Received: from MTA by MTA for メアド...|
|2-1||from&br; EHLO/HELOコマンド値&br; (逆引値 [xxx.xxx.xxx.xxx])|メールを送信したMTAのアドレス&br;・EHLO/HELOコマンド値 ≒ ヘッダFrom値(詐称可能)。&br;・逆引値(※ 詐称不可)|
|2-2||by|メールを受信したMTAのアドレス|
|2-3||for|送信先メアド|
|3|>|From: メアド|送信元メアド(※ 送信者が任意の値を設定可能)|
|3|>|From: メアド|(送信元メアド)&br;EHLO/HELOコマンド値 ≒ ヘッダFrom値(詐称可能)。|
|4|>|To: メアド|送信先メアド|

**機能 [#m3b02304]

***概略図 [#j37d1db1]
|#|>|略号|名称|ソフトウェア|h
|1|>|MUA|Mail User Agent.|OutlookなどのメーラーでMRA、MSAのクライアント|
|2|>|MTA|Mail Transfer Agent|Exchangeなどのメールサーバで、MDA、MRA、MSAを同梱|
|2-1||MDA|Mail Delivery Agent|着信メールをユーザのMailBoxにファイルする機能|
|2-1||MDA|Mail Delivery Agent|着信メールをユーザのMail Boxにファイルする機能|
|2-2||MRA|Mail Retrieval Agent|[[POP>#eb26945b]]や[[IMAP>#kf0dd961]]のメール受信の機能|
|2-3||MSA|Message Submission Agent|[[SMTP>#nb22d905]]のメール送信の機能|

***MUA [#effdda8b]
メールの送受信を行う。
-送信 : [[SMTP>#nb22d905]]
-受信 : [[POP>#eb26945b]]、[[IMAP>#kf0dd961]]

***MTA [#d71b14ae]
-メールサーバ同士、[[SMTP>#nb22d905]]でメールを転送する。
-自身のMailBoxの場合、[[MDA>#zd9ace8b]]へ引き渡す。
-自身のMail Boxの場合、[[MDA>#zd9ace8b]]へ引き渡す。

***MDA [#zd9ace8b]
着信メールをユーザのMailBoxにファイルする
着信メールをユーザのMail Boxにファイルする

***MRA [#j8d334fe]
[[POP>#eb26945b]]や[[IMAP>#kf0dd961]]で認証し、MailBoxのメールを取り出す。
[[POP>#eb26945b]]や[[IMAP>#kf0dd961]]で認証し、Mail Boxのメールを取り出す。

***MSA [#j37f281e]
送信時、SMTP-AUTHが使用される場合、MSAの機能自体は省略されている。
[[MUA>#effdda8b]]からメールを送信する際に、[[SMTP-AUTH>#wa05ce37]]を行う。

**プロトコル [#z2f8e851]
電子メールで使われるプロトコル

***SMTP [#nb22d905]
-SMTP : Simple Mail Transfer Protocol
-ポート番号 : 25 or 465(SMTP over SSL)

-ポート番号
--通常ポート番号 : 25~
(サーバ間の転送に使用)
--[[サブミッションポート番号 : 587>#wa05ce37]]~
(利用者からの送信の受付に使用)

-メール送信用プロトコル
--転送先のサーバを特定するために、DNS の MXレコードが使われる。
--IPv6、SPF(Sender Policy Framework)、DKIM(DomainKeys Identified Mail)に対応。
--[[IPv6>IPv4, v6]]、[[SPF(Sender Policy Framework)>#z3993540]]、[[DKIM(DomainKeys Identified Mail)>#t4430b9a]]に対応。

-[[また、セキュリティが強化された、>#i21462df]]
--SMTP over SSL : ポート465
--SMTP over SSH : ポート???

>などもある。

-SMTPプロトコルの

--[[コマンド>#b5aa8eed]]

--シーケンス
---クライアントからサーバのTCPポート25のコネクションを確立
---サーバがこれに応答する(SMTPのリプライコード220)。
---クライアントからサーバにEHLO/HELOコマンドで通信開始を宣言する。
---サーバがこれに応答する(...)。
---クライアントからサーバにMAIL FROMコマンドで返信先アドレス([[エンベロープFrom>#na253534]])を送る。
---サーバがこれに応答する(SMTPのリプライコード250)。
---クライアントからサーバにRCPT TOコマンドで送信先アドレス([[エンベロープTo>#na253534]])を送る。
---サーバがこれに応答する(SMTPのリプライコード250)。
---クライアントからサーバにDATAコマンドでメールメッセージ送信開始を宣言する。
---サーバがこれに応答する(SMTPのリプライコード354)。
---クライアントからサーバにメールメッセージを送る(終了まで)。
---サーバがこれに応答する(SMTPのリプライコード250)。
---クライアントからサーバにQUITコマンドを送信し、TCPコネクションを切断
---サーバがこれに応答する(SMTPのリプライコード221)。

***POP [#eb26945b]
-POP : Post Office Protocol
-ポート番号 : 110 or 995(POP over SSL)
-ポート番号 : 110
-メール受信用プロトコル
--ユーザのMailBoxから自分のメールを取り出す時に使用
--ユーザのMail Boxから自分のメールを取り出す時に使用
--現在は、改良されたPOP3 (POP Version 3) が使用される。

-[[また、セキュリティが強化された、>#i21462df]]
--POP over SSL : ポート995
--POP over SSH : ポート???

>などもある。

-POPプロトコルの

--[[コマンド>#b5aa8eed]]

--シーケンス~
...

***IMAP [#kf0dd961]
-IMAP : Internet Message Access Protocol
-ポート番号 : 143 or 993(IMAP over SSL)
-ポート番号 : 143 
-メール受信用プロトコル
--ユーザのMailBoxから自分のメールを取り出す時に使用
--ユーザのMail Boxから自分のメールを取り出す時に使用
--現在IMAPと呼ぶときにはIMAP4を指すことが通常
--POPとの最も大きな違いは、IMAPはMailBoxにメールを残すことが出来る。
--[[POP>#eb26945b]]との最も大きな違いは、IMAPはMail Boxにメールを残すことが出来る。

-[[また、セキュリティが強化された、>#i21462df]]
--IMAP over SSL : ポート993
--IMAP over SSH : ポート???

>などもある。

*認証関連 [#qd892e0b]

**クライアント認証 [#z0e713f9]

***SMTP-AUTH [#wa05ce37]
サーバとクライアントの双方が対応してなければ利用できない拡張だが、~
切り替えが進められ、近年では多くのサービスで必須となっている。

-SMTP-AUTH、SMTP Authentication、SMTP認証

-SMTP-AUTHを行うための[[MSA>#j37f281e]]をサブミッションポート(587)で実装した。

-SASL(Simple Authentication and Security Layer)機構を採用

|#|コマンド|説明|h
|1|AUTH LOGINコマンド|平文|
|2|AUTH PLAINコマンド|平文(RFCに無いので実装が異なるケースがある)|
|3|AUTH CRAM-MD5コマンド|[[チャレンジ&レスポンス認証>https://techinfoofmicrosofttech.osscons.jp/index.php?%E8%AA%8D%E8%A8%BC%E5%9F%BA%E7%9B%A4#o815c7c4]]|
|4|AUTH DIGEST-MD5コマンド|[[ダイジェスト認証>https://techinfoofmicrosofttech.osscons.jp/index.php?%E8%AA%8D%E8%A8%BC%E5%9F%BA%E7%9B%A4#o815c7c4]]|

***POP before SMTP [#a647a629]
-[[MUA>#effdda8b]]はPOP3をサポートしていたため[[SMTP-AUTH>#wa05ce37]]普及前の認証機構として利用された。
-POP3の認証結果のIPアドレスを一定時間キャッシュしておき、認証済みIPアドレスからのメール送信を受け付けた。

***Authenticated POP [#rc3b493f]
認証された[[POP>#eb26945b]]という意味。

-チャレンジ・レスポンス
--[[POP>#eb26945b]]3よりは安全性が高い。
--あまり普及してない(脆弱性)。

-メール本文は暗号化されない。

**サーバー認証 [#z6363368]
送信(元)ドメイン認証とも言い、認証された場合に次の転送処理を継続する。

***SPF(Sender Policy Framework) [#z3993540]
-送信元の[[SMTP>#nb22d905]]サーバの正当性を[[DNSのレコード>DNSサーバ#mb5fb38e]]を使用して検証する。
-[[SMTP>#nb22d905]]サーバへの設定も必要になる(ソフトウェアの設定で有効化)。
-[[エンベロープFrom>#na253534]]のドメインのTXTレコードにIPアドレスの記載がある。

***Sender ID(Sender ID Framework) [#x22267ea]
[[SPF>#z3993540]]に加え、Resent-Sender, Resent-From, Sender, Fromなどの~
メールアドレスPRA(Purported Responsible Address)の~
ドメイン部分の正当性を、[[SPF>#z3993540]]と同じ仕組みで検証する。

***DKIM(DomainKeys Identified Mail) [#t4430b9a]
DomainKeysとDKIMがある。

-DomainKeys
--[[DNSサーバ]]上にドメインに対応する公開鍵を公開する。
--送信元の[[SMTP>#nb22d905]]サーバが秘密鍵でヘッダを署名する。
--送信先の[[SMTP>#nb22d905]]サーバが
---([[エンベロープFrom>#na253534]]で?)ドメインの公開鍵を取得
---署名検証し、送信元の[[SMTP>#nb22d905]]サーバを認証する。

-DKIM
--ヘッダにユーザの公開鍵を添付する拡張でユーザ単位の認証も可能としている。
--送信元のドメインを(、[[エンベロープFrom>#na253534]]ではなく?)、DKIM-Signatureヘッダで示す。

***DMARC(Domain-based Message Authentication, Reporting, and Conformance) [#ndff05fe]

- [[SPF>#z3993540]] + [[DKIM>#t4430b9a]]
- + ポリシを[[DNSのレコード>DNSサーバ#l2935334]]を使用して表明する。

***over SSL [#i21462df]
サーバー認証+経路の暗号化(メール自体を暗号化しない)。
-[[SMTP over SSL/SSH>#nb22d905]]
-[[POP over SSL/SSH>#eb26945b]]
-[[IMAP over SSL/SSH>#kf0dd961]]

*署名・暗号化 [#nb773b23]
-送信時、電子メールに署名と暗号化
-受信時、電子メールの署名検証と復号化

**鍵の交換 [#p71a8e37]
公開鍵を交換する必要がある。

-X.500などを使用できそうだが、標準化された仕様は無さそう。

-Microsoft製品の場合、ADに公開鍵をアップロードすることで、~
ユーザによる個別鍵交換の手間を省くことができるらしい。

**鍵の利用 [#w1425017]

***署名 [#s36b728c]
-送信元の秘密鍵を使用して署名する。
-送信先で送信元の公開鍵を使用して署名検証。

***暗号化 [#vabadba9]
-送信先で共通鍵を生成する。
-共通鍵でメールを暗号化
-送信先の公開鍵を使用して共通鍵を暗号化

>-メール中に暗号化された共通鍵を同梱-

-送信先で送信先の秘密鍵を使用して共通鍵を復号化
-復号化した共通鍵を使用してメールを復号化

**プロトコル [#v04b3448]

***S/MIME [#kdf1d7fa]
-S/MIME : Secure/Multipurpose Internet Mail Extensions

-[[鍵の交換>#p71a8e37]]
--不特定多数とのやり取りで使用する。
--証明書の公開鍵暗号基盤を使用する。

-特徴
--MIMEを拡張したもので、添付ファイルなども暗号化が可能。
--仕組 : 暗号化や署名には、[[PKCS #7>PKCS#u87f1a66]]を拡張したCMSを用いる。

--バージョン
---v2 : RSAを使用して鍵交換、暗号化自体には、3DESやRC2などを使用する。
---v3 : [[PKCS]]に従うためCA(認証局)が署名された公開鍵を発行することで、正当性を保証する。

***PGP [#oe23ce1a]
-PGP : Pretty Good Privacy

-[[鍵の交換>#p71a8e37]]

--小規模なコミュニティで使用する。

--仕組

---互いに公開鍵を署名しあう~
「Web-of-trust(信用の輪)」の~
インフラを使用して正当性を保証する。

---加えて、公開鍵のフィンガープリントを確認する。~
(フィンガープリントの交換か確認ができるインフラが必要)

***STARTTLS [#g7f8685e]
-[[SMTP>#nb22d905]]や[[POP>#eb26945b]]の経路のみの暗号化
-上位層のプロトコルから見て透過的。

-TLSより上位のレイヤの設計と実装に委ねられている。
--ハンドシェイクをどう始めるか?
--交換された電子証明書をどう解釈するか?

*プログラム [#d1e8a8b5]

**送信処理 [#j68d2367]
メール送信処理は、.NETの標準的なAPIを使用して処理可能である。

***SmtpClient [#yb03c7bc]
★ Obsoleteになっている。[[MailKit>#f750610f]]が後継。

 // messageオブジェクトを生成
 System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
 
 // 送信者を設定
 message.From = new System.Net.Mail.MailAddress("xxxxx@yyyyy.co.jp", "西野 大介");
 message.Sender = new System.Net.Mail.MailAddress("xxxxx@yyyyy.co.jp", "西野 大介");
 
 // 件名を設定
 message.SubjectEncoding = Encoding.GetEncoding("UTF-8"); 
 message.Subject = "テスト メール";
 
 // メッセージボディを設定
 message.BodyEncoding = Encoding.GetEncoding("UTF-8");
 message.Body = "本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n本文\r\n";
 
 // 添付ファイルを設定 --------------------------------------------------
 message.Attachments.Add(
   new System.Net.Mail.Attachment(@"C:\新規テキスト ドキュメント.txt",
   new System.Net.Mime.ContentType("test/plain; charset=UTF-8")));
 
 message.Attachments.Add(
   new System.Net.Mail.Attachment(@"C:\新規Microsoft Word 文書.doc",
   new System.Net.Mime.ContentType("test/plain; charset=UTF-8")));
 
 message.Attachments.Add(
   new System.Net.Mail.Attachment(@"C:\新規ビットマップ イメージ.bmp",
   new System.Net.Mime.ContentType("test/plain; charset=UTF-8")));
 
 // ---------------------------------------------------------------------
 
 // addressコレクションオブジェクトを生成 -------------------------------
 message.To.Add("xxxxx@yyyyy.co.jp");
 message.CC.Add("xxxxx@yyyyy.co.jp");
 message.Bcc.Add("xxxxx@yyyyy.co.jp");
 
 // ---------------------------------------------------------------------
 
 // その他、オプション --------------------------------------------------
 
 // 優先度
 message.Priority = System.Net.Mail.MailPriority.Normal;
 
 // フォーマット
 message.IsBodyHtml = false;
 
 // 送信失敗時、レスを受信するかどうか
 message.DeliveryNotificationOptions
   = System.Net.Mail.DeliveryNotificationOptions.OnSuccess;
 
 // ---------------------------------------------------------------------
 
 // SmtpClientオブジェクトを作成
 System.Net.Mail.SmtpClient client
   = new System.Net.Mail.SmtpClient("xxx.xxx.xxx.xxx");
 
 // ネットワーク経由
 client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
 
 // タイムアウト値(ミリ秒))
 client.Timeout = 5000;
 
 // 認証(デフォルト)
 client.UseDefaultCredentials = true;
 
 //// 認証(カスタム)
 //client.Credentials = new System.Net.NetworkCredential("username", "password");
 
 // メッセージを送信
 client.Send(message);

- https://github.com/OpenTouryoProject/MultiPurposeAuthSite/blob/develop/root/programs/CommonLibrary/Notifications/CmnEmail.cs


***MailKit [#f750610f]
[[SmtpClient>#yb03c7bc]]の後継。

-次の3つのメールクライアントAPIを提供している。
--SMTPクライアント
--POP3クライアント
--IMAP4クライアント

-対応している主なプラットフォーム
--.NET Framework 4.5以降
--.NET Standard 1.3以降
---.NET Core 1.0以降
---UWP 10.0.12040以降
--Xamarin.Android/Xamarin.iOS

***SendGrid [#c1b9ffd9]
-クラウド型のメール配信サービス
-WebAPIでメール送信処理を実装可能。

-大規模なメール配送を安全に行うには特別なノウハウがあり罠も多い。~
辛い自前運用を、お金(サービス)で解決できる。

--最大送信量に合わせたインフラの確保
--IPアドレスのウォームアップ([[IPウォームアップ>#m5f50130]])が必要
--開封率やクリック率の追いかけを効率化

-その他~
Amazon SES、Mailchimp、Mandrill

**受信処理 [#j27e1c8e]
-メール受信処理は複雑なため、メール受信処理をシステム内に組み込まないようにするか、若しくは、専用の製品を使用して処理を実装する。
-ただし、Dynamicsなどの最近のパッケージでは、[[メール受信処理(メールボックスの監視サービスなど)>CRMの電子メールの管理]]も実装している。さすがという感じ。

***[[MailKit>#f750610f]] [#rd41bd23]
POP3クライアントを実装するので受信処理も実装可能。

*その他 [#c7277aad]

**携帯メールアドレス [#b8bb2d7b]
-携帯向けにメール送信する場合は、携帯メールアドレス(RFCに準拠しないメールアドレス)に対応する必要があるか確認する。

-.NETでは、RFCに準拠しないメール アドレスをMailAddressクラスに設定すると~
例外となることがある(これを利用して、RFCに準拠しないメール アドレスをチェックできる)。

-この場合、MailMessageクラスのToプロパティ(MailAddressCollectionクラス)にAddすると例外としないで処理できる。

-必要であるなら、携帯メールアドレス対応のコンポーネントを導入する

--(.NET用SMTP/POPクラスライブラリ)~
http://www.agile-tech.com/product/maillib.aspx

-当該アドレスにSMTPが対応していないケースもあるようである(Exchange 2000 Server、Server 2003)

--@ の直前にピリオドがあるなどの RFC に準拠していないアドレスを含むメッセージを送受信できない~
http://support.microsoft.com/kb/281538/ja

**IPウォームアップ [#m5f50130]
-メルマガ配信などを行う、マーケティング領域のシステムなどで一般的な用語。
-メールが確実に届くように、IPアドレスのレピュテーションを上げること。

***レピュテーション [#a7479b4e]
(IPアドレスの)レピュテーション

-メール配信の重要な評価指標、メール送信元の信頼度。
-ISPはメールの送信者の正当性を、レピュテーションで判断。
-レピュテーションが低い場合、送信したメールは~
迷惑メールであると見なされ、受信拒否さ れる可能性が高くなる。

-新しいIPアドレスにはレピュテーションがないので、
--新しいIPアドレスからメールが配信されてもISPは、~
メール送信元の正当性を判断できず、メールが確実に届かない恐れがある。
--メールを確実に届けるために、IPウォームアップで新しいIPアドレスのレピュテーションを上げる。

***参考 [#l4eb6dd0]
-[[SendGrid>#ecaefd23]]

-マーケター必見!IPウォームアップに関する基礎知識~
(メルマガ・メールマーケティング入門) | Web担当者Forum~
https://webtan.impress.co.jp/u/2015/11/04/21433

*参考 [#keeaf589]
-SmtpClient Class (System.Net.Mail) | Microsoft Docs~
https://docs.microsoft.com/en-us/dotnet/api/System.Net.Mail.SmtpClient

-メール運用がロストテクノロジーになっていく話 - Qiita~
https://qiita.com/koichiro/items/d65ac1af03b9063f0592

**MailKit [#jde8c3f6]
-MailKitが公式に.NETのSmtpClientを置き換えることを明らかにした。~
https://www.infoq.com/jp/news/2017/04/MailKit-MimeKit-Official

-電子メールを送信するには?(MailKit編)[.NET 4.5、C#/VB]:.NET TIPS - @IT~
http://www.atmarkit.co.jp/ait/articles/1811/21/news023.html

**SendGrid [#ecaefd23]

-SendGridとは~
https://sendgrid.kke.co.jp/about/

-SendGridでメール配送を始めるためのまとめ~
https://qiita.com/shiru/items/0dbc48df217ffe51b1f3

***IPウォームアップ [#m655a8a1]
-IPウォームアップとは?~
https://sendgrid.kke.co.jp/guide/ip%E3%82%A6%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A8%E3%81%AF%EF%BC%9F/

-ドキュメント
--IPウォームアップを行う~
https://sendgrid.kke.co.jp/docs/Tutorials/D_Improve_Deliverability/ip_warmup.html

-ブログ
--IPアドレスのウォームアップ~
https://sendgrid.kke.co.jp/blog/?p=326

***SlideShare [#pfb51ba0]
-IPウォームアップとは?【SendGrid】~
-SlideShare
--IPウォームアップとは?【SendGrid】~
https://www.slideshare.net/SendGrid_JP/ipsendgrid

***Qiita [#rca50716]
-SendGridでメール配送を始めるためのまとめ~
https://qiita.com/shiru/items/0dbc48df217ffe51b1f3

----
Tags: [[:インフラストラクチャ]], [[:通信技術]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS