web-dev-qa-db-ja.com

SmtpClientは送信時にサーバーから結果を取得します

SmtpClientsendメソッドはvoidを返します。サーバーの応答を取得する方法はありますか?例外をスローしない限り、成功したと思いますか?

私が参照しているクラス... http://msdn.Microsoft.com/en-us/library/system.net.mail.smtpclient.aspx

14
BZink

2番目のポイントに答えるには、はい、成功したと想定するだけです。つまり、例外が発生しない限り、サーバーにメッセージを受信し、サーバーがそれを受け入れました。

あなたはおそらくこれの残りをすでに知っていますが、念のために...

そこから、電子メールが失われ、さまざまな方法で配信されない可能性があります。サーバーはそれを受け入れて送信しないことを決定するか、または受け入れてクラッシュする前に電源を失う可能性があります。途中でスパムフィルターなどでブロックされる場合があります。

電子メールは、送信者と受信者の間の複数の手を通過するという点で、通常のメールに似ていると考えることができます。コードからは、送信に使用しているSMTPサーバーに到達したことを確認することしかできません。これは、郵便局の窓口に渡すのと同じです。そこからメッセージがどのようにルーティングされるかはわかりません(または知る必要があります)。空中、地上、伝書鳩のいずれかである可能性があります。あなたは方程式から外れています-あなたはそれがどのように送られるかを知る必要はありません、ただ彼らがそれを送る方法を知っているとあなたが信じているだけです。 (メールについても同じことが言えます。)

受信者が画像を開いたことを確認する必要がある場合は、サーバー上のHTMLメッセージに画像を埋め込み、その画像にアクセスしたときにログで追跡する方法などがあります(Googleメール追跡とメールオープン追跡)

一方...

サーバーがそれを拒否した場合、あなたは話す方法でサーバーの応答を受け取ります-エラーコードとエラーの説明があり、それが失敗した理由のトラブルシューティングに使用したり、エラー処理を使用したりすることができます別のルートを試すなど。

18
David

SendCompletedイベントを利用して、smtpclientが次のように正常に動作することを確認できます。

http://msdn.Microsoft.com/en-us/library/system.net.mail.smtpclient.sendcompleted.aspx

ただし、メッセージチェーン内のサーバー/フィルターでスタックしている可能性があるため、メッセージが受信者に届いたことを確認できません。

4
Dima

スローしない限り成功したと想定します...この場合の成功はメールサーバーによって受け入れられたことを意味するだけですが、それ以外はサーバー次第です...

少し制御したい場合は、SendAsyncを使用して、SendCompletedイベントをフックできます...

1
Yahia