Captain Kenpachi
Captain Kenpachi

Reputation: 7215

Hooking into SMTP client events

Intro: I am supporting a piece of code that sends a welcome/confirm mail upon successful registration to a site.

The SMTP client times out before sending can complete. According to our Ops department, I am using the correct credentials and SMTP server IP address.

What I want to do is hook into any handshaking, connection, sending, etc events so that I can figure out exactly why the process times out. I've set Server.ScriptTimeOut to 500 seconds on that page, so it can't just be a busy server problem.

My question is this: what events can I handle during this process. The only one I see exposed in SMTPClient is SendCompleted. But I imagine there must be a way to get access to something more low-level?

For reference, here's the code:

//Create and send email
MailMessage mm = new MailMessage();
try
{
    mm.From = new MailAddress("[email protected]");
    mm.To.Add(new MailAddress(Recipient));
    mm.Subject = Subject;
    mm.Body = MailBody;
    mm.IsBodyHtml = true;

    var c = new NetworkCredential("[email protected]", "YeOlePassword");

    SmtpClient smtp = new SmtpClient("127.0.0.1");//not really, just hiding our SMTP IP from StackOverflow

    smtp.UseDefaultCredentials = false;
    smtp.Credentials = c;
    smtp.Send(mm);

}
catch (Exception x)
{
    DateTime CurrentDateTime = DateTime.Now;
    String appDateTime = CurrentDateTime.ToString();

    String transactionLogEntry = "To: " + Recipient + " " + appDateTime + " " + x.Message;
    StreamWriter streamwriter = new StreamWriter(File.Open(MapPath("~/TransactionLog.txt"), FileMode.Append, FileAccess.Write, FileShare.Write));

    //Append to file
    streamwriter.WriteLine(transactionLogEntry);
    //Close file
    streamwriter.Close();
}

The error that's logged is simply that a timeout occured while sending a mail to the supplied email address.

Upvotes: 0

Views: 491

Answers (1)

Vincent James
Vincent James

Reputation: 1148

I use this to get the buried SMTP messages out.

String transactionLogEntry = "To: " + Recipient + " " + appDateTime + " " + GetFullErrorMessage(x);

.
.
.

private string GetFullErrorMessage(Exception e)
    {
        string strErrorMessage = "";
        Exception excpCurrentException = e;

        while (excpCurrentException != null)
        {
            strErrorMessage += "\"" + excpCurrentException.Message + "\"";
            excpCurrentException = excpCurrentException.InnerException;
            if (excpCurrentException != null)
            {
                strErrorMessage += "->";
            }
        }

        strErrorMessage = strErrorMessage.Replace("\n", "");

        return strErrorMessage;
    }

In my experience, from what you are describing it is related to your SMTP port being blocked by and ISP or your server/web host. Good luck!

Upvotes: 1

Related Questions