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

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

*目次 [#ad818906]
#contents

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

**仕組み [#u5ed5597]

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

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

|#|>|項目|概要|h
|1|>|Return-Path: メアド|エラーメールの返信先。&br;通常From。詐称可能。|
|2|>|Received: from MTA by MTA for メアド|転送経路をスタックする|
|2-1||from&br; HELO コマンド値&br; (逆引値 [xxx.xxx.xxx.xxx])|メールを送信したMTA&br;・HELO コマンド値(※ 詐称可)&br;・逆引値(※ 詐称不可)|
|2-2||by|メールを受信したMTA|
|2-3||for|送信先メアド|
|3|>|From: メアド|送信元メアド(HELO コマンド値 ※ 詐称可)|
|4|>|To: メアド|送信先メアド|

**機能 [#m3b02304]

|#|>|略号|名称|ソフトウェア|h
|1|>|MUA|Mail User Agent.|OutlookなどのメーラーでMRA、MSAのクライアント|
|2|>|MTA|Mail Transfer Agent|Exchangeなどのメールサーバで、MDA、MRA、MSAを同梱|
|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]]でメールを転送する。
-自身のMail Boxの場合、[[MDA>#zd9ace8b]]へ引き渡す。

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

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

***MSA [#j37f281e]
[[MUA>#effdda8b]]からメールを送信する際に、[[SMTP-AUTH>#wa05ce37]]を行う。

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

***SMTP [#nb22d905]
-SMTP : Simple Mail Transfer Protocol
-ポート番号 : 25 or 465(SMTP over SSL)
-メール送信用プロトコル
--転送先のサーバを特定するために、DNS の MXレコードが使われる。
--[[IPv6>IPv4, v6]]、[[SPF(Sender Policy Framework)>#z3993540]]、[[DKIM(DomainKeys Identified Mail)>#t4430b9a]]に対応。

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

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

*認証関連 [#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アドレスからのメール送信を受け付けた。

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

***[[SPF(Sender Policy Framework)>DNSサーバ#mb5fb38e]] [#z3993540]

***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は、SMTPサーバが秘密鍵でヘッダを署名、DNSサーバ上に公開鍵を公開し、SMTPサーバを認証。
-DKIMは、ヘッダにユーザの公開鍵を添付する拡張でユーザ単位の認証も可能としている。

**S/MIME [#kdf1d7fa]

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

***鍵 [#w1425017]
**鍵の利用 [#w1425017]

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

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

***鍵交換 [#c329e5d2]
...。
>-メール中に暗号化された共通鍵を同梱-

-DNSは使用しないらしい。
-事前に鍵交換しておくと書かれている。
-認証局などのインフラを使用するとも書かれている。
-送信先で送信先の秘密鍵を使用して共通鍵を復号化
-復号化した共通鍵を使用してメールを復号化

**鍵の交換 [#p71a8e37]
-X.500な度を使用できそうだが、標準化された仕様は無さそう。

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

***S/MIME [#kdf1d7fa]
(Secure/Multipurpose Internet Mail Extensions)

不特定多数とのやり取りで使用する。

-CA(認証局)が署名することで、正当性を保証する。

***PGP [#oe23ce1a]
(Pretty Good Privacy)

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

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

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

*プログラム [#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/
-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】~
https://www.slideshare.net/SendGrid_JP/ipsendgrid

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

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


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