确认使用C#发送电子邮件

时间:2018-07-09 19:28:49

标签: c# winforms email

当我在C#中使用STMP发送电子邮件时,尽管我已经使用SendCompleted事件处理程序,但不能确保已发送电子邮件。这是我的代码:

    private void btnLogin1_Click(object sender, EventArgs e)
    {
        try
        {
            MailAddress FromAddress = new MailAddress("*******", "*******");
            MailAddress ToAddress = new MailAddress("*****");
            String FromPassword = "******";

            SmtpClient SMTP = new SmtpClient();
            SMTP.Host = "smtp.yandex.com";
            SMTP.Port = 587;
            SMTP.EnableSsl = true;
            SMTP.DeliveryMethod = SmtpDeliveryMethod.Network;
            SMTP.UseDefaultCredentials = false;
            SMTP.Credentials = new NetworkCredential(FromAddress.Address, FromPassword);
            SMTP.SendCompleted += SMTP_SendCompleted;

            MailMessage Message = new MailMessage();
            Message.From = FromAddress;
            Message.To.Add(ToAddress);
            Message.Subject = "Welcome";
            Message.SubjectEncoding = Encoding.UTF8;
            Message.Priority = MailPriority.High;
            Message.IsBodyHtml = true;
            Message.Body = "<b>Test Mail</b>";
            Message.BodyEncoding = Encoding.UTF8;

            SMTP.Send(Message);
        }
        catch { }
    }

    private void SMTP_SendCompleted(object sender, AsyncCompletedEventArgs e)
    {
        MessageBox.Show("Sent");
    }
}

谢谢。

2 个答案:

答案 0 :(得分:3)

您需要在其中放入一些错误处理代码

Catch {...}

否则,您只是捕获一个错误而忽略了它。 如果catch块没有触发,则在您可以合理确定的范围内(无需检查送达回执),就可以假定电子邮件已成功发送。

答案 1 :(得分:2)

如果您正在使用SendCompleted事件,则需要使用SendAsync异步发送电子邮件。否则,直到发送电子邮件或发送电子邮件失败后,该方法才会返回控制。

在您发布的示例中,空捕获捕获了可能发生的所有错误,甚至确定了很多错误。

因此,可以使用SendAsync来触发事件,或者实际查看是否捕获了任何异常。在几乎每种情况下,甚至都没有捕获到任何特定异常的空捕获块是可怕的想法。它们会导致各种各样的问题。