「[[マイクロソフト系技術情報 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 ***メールヘッダ [#x915ae06] |#|>|項目|概要|h |1|>|Return-Path: メアド|エラーメールの返信先。通常From。詐称可能。| |2|>|Received: from MTA by MTA for メアド|転送経路をスタックする| |2-1||from|メールを送信したMTA(※ 詐称不可)| |2-2||by|メールを受信したMTA| |2-3||for|送信先メアド| |3|>|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-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]]へ引き渡す。 ***MDA [#zd9ace8b] 着信メールをユーザのMailBoxにファイルする ***MRA [#j8d334fe] [[POP>#eb26945b]]や[[IMAP>#kf0dd961]]で認証し、MailBoxのメールを取り出す。 ***MSA [#j37f281e] 送信時、SMTP-AUTHが使用される場合、MSAの機能自体は省略されている。 **プロトコル [#z2f8e851] 電子メールで使われるプロトコル ***SMTP [#nb22d905] -SMTP : Simple Mail Transfer Protocol -ポート番号 : 25 or 465(SMTP over SSL) -メール送信用プロトコル --転送先のサーバを特定するために、DNS の MXレコードが使われる。 --IPv6、SPF(Sender Policy Framework)、DKIM(DomainKeys Identified Mail)に対応。 ***POP [#eb26945b] -POP : Post Office Protocol -ポート番号 : 110 or 995(POP over SSL) -メール受信用プロトコル --ユーザのMailBoxから自分のメールを取り出す時に使用 --現在は、改良されたPOP3 (POP Version 3) が使用される。 ***IMAP [#kf0dd961] -IMAP : Internet Message Access Protocol -ポート番号 : 143 or 993(IMAP over SSL) -メール受信用プロトコル --ユーザのMailBoxから自分のメールを取り出す時に使用 --現在IMAPと呼ぶときにはIMAP4を指すことが通常 --POPとの最も大きな違いは、IMAPはMailBoxにメールを残すことが出来る。 *プログラム [#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: [[:インフラストラクチャ]], [[:通信技術]]