2016-08-24 240 views
1

Mailkitを使用してSMTP経由で電子メールを送信する方法については、ネット上でいくつかの素晴らしい例があります。Mailkit非同期SMTPを送信して確認する方法

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.SendAsync(emailMessage); 
client.Disconnect(true); 

しかし、私が知りたいのですがどのような非同期送信が完了したとき、または場合:通常で終わる

:非同期が必要な場合は

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.Send(emailMessage); 
client.Disconnect(true); 

しかし、これは無意味ですそれは成功しません。 .Netネイティブライブラリでは、これはコールバック(イベントハンドラ)によって実現されます。

MailKit SendAsyncに対して 'Completed'コールバックハンドラを定義することは可能ですか?それが成功したかどうかを検出するためのベストプラクティスではありません。あなたはこのようなコードを持っている必要はありません

おかげ

答えて

2

client.Authenticate(theSMTPUsername,theSMTPPassword); 
client.SendAsync(emailMessage); 
client.Disconnect(true); 

非同期送信操作が完了する前にこれが切断されます。そこに、言ったあなたは非同期タスクを待っていたら、もちろん

client.Authenticate(theSMTPUsername,theSMTPPassword); 
await client.SendAsync(emailMessage); 
client.Disconnect(true); 

...今、あなたは完成したイベントを必要としない:)

代わりに、あなたがこれをやりたいですステア用

http://www.mimekit.org/docs/html/E_MailKit_MailTransport_MessageSent.htm

+0

ありがとう:あなたがに接続することができMessageSentイベントがあります。コールバックがよかったです。 – Hughgo

+0

これをもう少し見ると、私は解決策がうまくいくとは思っていません。非同期呼び出しを待つのは、非同期部分が戻るのを待つだけです。これは、メッセージが送信されるのを待つことはありません。上記のコードは競合する可能性があり、作業が完了する前に切断されます。それを実行するより良い方法は、* synchronous * APIを待つことです。これは、各段階が進行する前に完了することを保証する。 – Hughgo

+0

'client.Send()'が返るとき、メッセージは送られています。同様に、 'await client.SendAsync()'の後にコントロールが再開すると、メッセージが送信されます。レースはありません。同期APIを '待つ'ことはできません。 – jstedfast

関連する問題