2017-12-19 8 views
0

MVC5アプリケーションを使用して電子メールを送信しようとしています。これを行うには、NuGetパッケージマネージャーを使用してMailkit v 1.22.0をインストールしました。間違った受信者のメールアドレスが入力された場合を除いて正常に動作しますMVC5メールキットが正しくないメールアドレスを送信します

var FromAddress = "[email protected]"; 
    var FromAddressTitle = "My Org"; 
    var connection = ConfigurationManager.ConnectionStrings["SmtpServer"].ConnectionString; 

    var Email = new MimeMessage(); 
    Email.From.Add(new MailboxAddress(FromAddressTitle, FromAddress)); 

    var AddressArray = value.SentTo.Split(';'); 
    foreach (var item in AddressArray) 
    { 
     Email.To.Add(new MailboxAddress(item)); 
    } 

    Email.Subject = value.Subject;   
    Email.Body = new TextPart("html") 
    { 
     Text = value.Content 
    }; 

    using (var client = new SmtpClient()) 
    { 
     client.Connect(connection); 
     client.Send(Email); 
    } 

    return "Email Successfully Sent"; 

メールが実際に(client.Send(電子メール)が送信されたかどうか、アプリケーションが検出されません。そして、これは私のコードがどのように見えるかですvoidを返します。それが実際に受信者に送られるかどうかを知る方法はありますか? Mailkitで可能でない場合は、これを行うことができる他のNuGetパッケージがありますか?

+0

ここに行く最善の方法は、[SendGrid](https://sendgrid.com)などの外部サービスを使用することです。このサービスには、バウンスを処理し処理する機能があります。 –

答えて

1

SmtpClient.Send()がvoidを返す理由は、SMTPプロトコルがメッセージが正常に配信されるかどうかを指定しないためです。クライアントから、メッセージがサーバーによって受け入れられたかどうかを伝えることができます(MailKitは例外をスローします)。

メッセージが正常に配信されたかどうかを知る必要がある場合は、送信されたバウンスメッセージが数分または数時間かかる可能性があるかどうかを確認する必要があります。

最初に行うべきことはサブクラスSmtpClientで、GetEnvelopeIdGetDeliveryStatusNotificationsメソッドをオーバーライドします。

次に、バウンスメッセージを受信すると、トップレベルのMIME部分は通常multipart/report(MimeKitを使用する場合はMultipartReportオブジェクトで表されます)になります。このmultipart/reportには、message/delivery-status MIME部分(およびその他の部分)が含まれ、1人以上の受信者の配信状況に関する詳細を指定するヘッダーのようなフィールドのリストが含まれます。

MimeKitは、例えば、それはあなたが使用したいと思うでしょうStatusGroupsプロパティが含まれているMessageDeliveryStatusクラスを持っている(あなたのためにこれの多くを解析します。しかし、何MimeKitはないをするのかは、個々のフィールド値を解析する(しかし、彼らであります)あなたがするのは難しいが、典型的には数Split(';')年代にはいくつかの簡単な&汚い構文解析のための十分なIIRCでなければならないことではありません。

あなたはhttps://tools.ietf.org/html/rfc3464

でMimeKitを、このための仕様を読みたくなります上記にリンクされているドキュメントは、表示するセクションを指定します私は2.2と2.3と思う。

具体的には、Original-RecipientActionフィールドを調べることをおすすめします。

original-recipient-field = 
     "Original-Recipient" ":" address-type ";" generic-address 

    generic-address = *text 

    action-field = "Action" ":" action-value 

    action-value = 
     "failed"/"delayed"/"delivered"/"relayed"/"expanded" 

また、上で報告されているメッセージを把握するOriginal-Envelope-Idフィールドが必要になります。

original-envelope-id-field = 
       "Original-Envelope-Id" ":" envelope-id 

    envelope-id = *text 

envelope-idテキストがSmtpClientクラスであなたのGetEnvelopeId実装によって返された文字列と同じ文字列になります。

関連する問題