我使用以下工具類發送電子郵件,如果接收者[email protected]不存在或者電子郵件從未以某種原因到達他,我希望我的應用程序能夠被通知。
它只適用於當smtp客戶端無法連接到smtp服務器時,我在這種情況下得到一個異常,否則,唯一的方法來知道電子郵件無法達到客戶端是通過檢查客戶端帳戶。如何知道電子郵件是否未能到達其接收者
public static class EmailUtil
{
/// <summary>
/// Fires exception if string is null or empty
/// </summary>
/// <param name="param">param value</param>
/// <param name="paramName">is the parameter name to be shown in the exception message</param>
private static void CheckStringParam(string parameter, string paramName)
{
if (String.IsNullOrEmpty(parameter))
{
throw new ArgumentException(String.Format("{0} can't be null or empty", paramName));
}
}
public static void SendEmail(EmailArgument emailArg)
{
CheckStringParam(emailArg.FromEmail, "emailArg.FromEmail");
CheckStringParam(emailArg.Subject, "emailArg.Subject");
CheckStringParam(emailArg.Body, "emailArg.Body");
string body = emailArg.Body;
MailMessage mailMsg = new MailMessage();
mailMsg.From = new MailAddress(emailArg.FromEmail);
foreach(string recipient in emailArg.ToEmails)
{
if (String.IsNullOrEmpty(recipient))
{
throw new ArgumentException("One of the values in the emailArg.ToEmails array is null or empty");
}
mailMsg.To.Add(new MailAddress(recipient));
}
mailMsg.IsBodyHtml = emailArg.IsHtml;
if (emailArg.PutHtmlTags)
{
body = String.Format("{0}" + body + "{1}", "<HTML><Body>", "</Body></HTML>");
}
mailMsg.Body = body;
mailMsg.BodyEncoding = emailArg.BodyEncoding;
// Get client info from the config file , it is tested with Web.config, need to be tested with App.config
SMTPConfiguration smtpConfig = (SMTPConfiguration)System.Configuration.ConfigurationManager.GetSection("SMTPConfigurationGroup/SMTPServer");
SmtpClient client = new SmtpClient(smtpConfig.Host, smtpConfig.Port);
client.EnableSsl = smtpConfig.EnableSSL;
client.Credentials = new System.Net.NetworkCredential(smtpConfig.Username, smtpConfig.Password);
// The notifications of failure are sent only to the client email.
// Exceptions are not guranteed to fire if the Receiver is invalid; for example gmail smtp server will fire exception only when [email protected] is not there.
// Exceptions will be fired if the server itself timeout or does not responding (due to connection or port problem, extra).
mailMsg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
client.Send(mailMsg);
}
}
我不知道是否有某種方式可以使用該協議至少返回一個基於現有地址的錯誤代碼? – IrishChieftain 2010-01-24 19:39:04
@IrishChieftain:有可能您連接的服務器不知道。爲了有機會了解它,您必須連接到SMTP服務器才能訪問該電子郵件地址所在的域。即使如此,也不能保證服務器知道該地址是否有效。 SMTP被設計爲在服務器不知道目的地的所有信息的情況下工作 - 它只需要知道足夠的信息就可以將其傳遞給更應該瞭解的內容。 – 2010-01-24 19:45:09
即使已知地址在特定的SMTP服務器上無效,大多數服務器現在都會返回「OK」。這也是對付垃圾郵件的有限對策。 – JasonTrue 2010-01-25 05:24:22