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

C# 使用C确认发送电子邮件#,c#,winforms,email,C#,Winforms,Email,当我在C#中使用STMP发送电子邮件时,虽然我使用了SendCompleted事件处理程序,但无法确保电子邮件已发送。这是我的代码: private void btnLogin1_Click(object sender, EventArgs e) { try { MailAddress FromAddress = new MailAddress("*******", "*******"); MailA

当我在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");
    }
}
private void btnLogin1\u单击(对象发送者,事件参数e)
{
尝试
{
MailAddress FromAddress=新邮件地址(“*******”,“*******”);
MailAddress ToAddress=新的邮寄地址(“****”);
字符串FromPassword=“*******”;
SmtpClient SMTP=新SmtpClient();
SMTP.Host=“SMTP.yandex.com”;
SMTP.Port=587;
SMTP.EnableSsl=true;
SMTP.DeliveryMethod=SmtpDeliveryMethod.Network;
SMTP.UseDefaultCredentials=false;
SMTP.Credentials=新网络凭据(FromAddress.Address,FromPassword);
SMTP.SendCompleted+=SMTP_SendCompleted;
MailMessage=新的MailMessage();
Message.From=FromAddress;
Message.To.Add(ToAddress);
Message.Subject=“欢迎”;
Message.SubjectEncoding=Encoding.UTF8;
Message.Priority=MailPriority.High;
Message.IsBodyHtml=true;
Message.Body=“测试邮件”;
Message.BodyEncoding=Encoding.UTF8;
SMTP.Send(Message);
}
捕获{}
}
私有无效SMTP_SendCompleted(对象发件人,AsyncCompletedEventArgs e)
{
MessageBox.Show(“已发送”);
}
}

提前感谢。

您需要在其中添加一些错误处理代码

Catch {...}
否则,您只是捕获一个错误并忽略它。
如果catch块没有触发,那么只要您能够合理地确定(不检查送达收据),那么您就可以假定电子邮件已成功发送。

您需要在其中添加一些错误处理代码

Catch {...}
否则,您只是捕获一个错误并忽略它。
如果catch块未触发,则只要您能够合理确定(无需检查送达回执),则可以假定电子邮件已成功发送。

如果您使用的是
sendpleted
事件,则需要使用
sendsync
异步发送电子邮件。否则,在电子邮件发送或失败之前,该方法不会返回控制

在您发布的示例中,空捕获正在吞咽可能发生的任何错误,甚至可以确定多少错误


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

如果您使用的是
SendCompleted
事件,则需要使用
SendAsync
异步发送电子邮件。否则,在电子邮件发送或失败之前,该方法不会返回控制

在您发布的示例中,空捕获正在吞咽可能发生的任何错误,甚至可以确定多少错误



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

只有异步发送时才会触发该事件。当您的代码通过
SMPT.Send(消息)时您应该假设邮件已发送。我说“假设”,因为你永远无法真正确定电子邮件是否会到达。那不是SMTP.SendAsync()吗?是的,这就是为什么我说“当你异步发送邮件时”?你应该能够删除你自己的问题。也许那只是在还没有答案的情况下?当然,具有足够高代表性的人无论如何都可以看到已删除的问题。最好找一个mod来修复历史记录并更改您的密码。@AhmedAlayat我将其标记为mod attention来删除它,但您肯定应该更改密码该事件只有在异步发送时才会触发。当您的代码通过
SMPT.Send(消息)时您应该假设邮件已发送。我说“假设”,因为你永远无法真正确定电子邮件是否会到达。那不是SMTP.SendAsync()吗?是的,这就是为什么我说“当你异步发送邮件时”?你应该能够删除你自己的问题。也许那只是在还没有答案的情况下?当然,具有足够高代表性的人无论如何都可以看到已删除的问题。最好找一个mod来修复历史记录并更改您的密码。@AhmedAlayat我将其标记为mod attention来删除它,但您肯定应该更改密码您关于接受异常的观点是有效的;但在编写代码时,应该避免做出假设。特别是在OP的情况下,他订阅的事件只有在异步发送电子邮件时才会引发,但没有调用。但是他没有使用SMTP.SendAsync()正确。这就是问题所在。同意,除非他想同步发送,这是并列假设…:-我正在使用STMP。。。但不知道如何使用SendAsync,你关于接受异常的观点是正确的;但在编写代码时,应该避免做出假设。特别是在OP的情况下,他订阅的事件只有在异步发送电子邮件时才会引发,但没有调用。但是他没有使用SMTP.SendAsync()正确。这就是问题所在。同意,除非他想同步发送,这是并列假设…:-我正在使用STMP。。。但是不知道如何使用SendAsync如何使用SendAsync与
Send
非常相似。可以从查看MSDN上的文档开始。。。如果您仍然有问题,这里有已回答的问题供参考。如何使用SendAsync与
Send
基本相同。可以从查看MSDN上的文档开始。。。如果您仍然有问题,这里有回答的问题供参考