开发者

How to know if Email failed to reach its receivers

I am sending email using the following utility class, if receiver foo@foo.com is not exist or the email never reach him for one reason or another, I want my application to be notified.

It works only when the smtp client failed to connect to the smtp server, I got an exception in this case, otherwise, the only way to know if email fail to reach the client is by checking client account.

 public static class EmailUtil
    {
        /// <summary>开发者_如何学Go
        /// 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 receiver@gmail.com 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);            
        }


    }


SMTP is a 'best effort' transport. Once you send the message to the SMTP server, you can't really know if it got to the destination or not (which may take days if there are connectivity problems along the way). You might get an email back (like I said - possibly days later) from some SMTP server along the way that that the delivery failed.

Note that even if you add a header to the message indicating that you want positive acknowledgment that the message was received, clients can be configured or instructed not to send such notification.


Web beacon is the most common tool for e-mail tracking. It usually is a small transparent image 1px x 1px embeded in the html of an e-mail message. By embeded I mean an img tag - here is an example: <img src="www.somedomainhere.com/someimge.gif?[tracking_code]" />. Then you can log every request to that image. This method works only if the user is able to read HTML formated messages.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜