C# SendMail SendAsync

C# SendMail SendAsync,c#,.net,asynchronous,sendmail,sendasync,C#,.net,Asynchronous,Sendmail,Sendasync,我对C#和sendmail异步有一个奇怪的问题。 当我使用正常的发送方法时,一切正常,我的电子邮件正在发送到正确的SMTP服务器。但是当我使用SendAsync方法时,它不起作用 mailClient.SendCompleted += SendCompleted; private static void SendCompleted (object sender, AsyncCompletedEventArgs e) { string token = (string) e.UserState

我对C#和sendmail异步有一个奇怪的问题。 当我使用正常的发送方法时,一切正常,我的电子邮件正在发送到正确的SMTP服务器。但是当我使用SendAsync方法时,它不起作用

mailClient.SendCompleted += SendCompleted;

private static void SendCompleted (object sender, AsyncCompletedEventArgs e)
{
  string token = (string) e.UserState;

  if (e.Cancelled)
  {
    MessageBox.Show (string.Format ("{0}\n\"{1}\"", Application.Current.FindResource ("MailCannotSend"), token), LogFile.MSGBOX_ERROR, MessageBoxButton.OK, MessageBoxImage.Error);
    return;
  }

  MessageBox.Show (e.Error != null ? string.Format ("{0}\n\"{1}\"", e.Error, token) : "Complete!", LogFile.MSGBOX_ERROR, MessageBoxButton.OK, MessageBoxImage.Error);
}
SendAsync方法始终在e.Cancelled中运行,没有任何异常或错误。我真的不知道为什么

有人给你提示吗?谢谢

更新

以下是完整的代码:

public void InitClient ()
{
  try
  {
    mailClient = new SmtpClient (SettingsHelper.TailSettings.AlertSettings.SmtpSettings.SmtpServerName, SettingsHelper.TailSettings.AlertSettings.SmtpSettings.SmtpPort)
    {
      UseDefaultCredentials = false,
      Timeout = 30000,
      DeliveryMethod = SmtpDeliveryMethod.Network
    };
    string decryptPassword = StringEncryption.Decrypt (SettingsHelper.TailSettings.AlertSettings.SmtpSettings.Password, LogFile.ENCRYPT_PASSPHRASE);
    NetworkCredential authInfo = new NetworkCredential (SettingsHelper.TailSettings.AlertSettings.SmtpSettings.LoginName, decryptPassword);
    mailClient.Credentials = authInfo;
    mailClient.SendCompleted += SendCompleted;

    if (SettingsHelper.TailSettings.AlertSettings.SmtpSettings.SSL)
      mailClient.EnableSsl = true;
    if (SettingsHelper.TailSettings.AlertSettings.SmtpSettings.TLS)
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

    MailAddress from = new MailAddress (SettingsHelper.TailSettings.AlertSettings.SmtpSettings.FromAddress);
    MailAddress to = new MailAddress (SettingsHelper.TailSettings.AlertSettings.EMailAddress);

    mailMessage = new MailMessage (from, to)
    {
      Subject = SettingsHelper.TailSettings.AlertSettings.SmtpSettings.Subject,
      SubjectEncoding = System.Text.Encoding.UTF8,
      BodyEncoding = System.Text.Encoding.UTF8,
      IsBodyHtml = false
    };
}
  catch (Exception ex)
  {
    ErrorLog.WriteLog (ErrorFlags.Error, GetType ( ).Name, string.Format ("{1}, exception: {0}", ex, System.Reflection.MethodBase.GetCurrentMethod ( ).Name));
  }
}

/// <summary>
/// Send E-Mail
/// </summary>
/// <param name="userToken">User token</param>
/// <param name="bodyMessage">Message to be send</param>
public void SendMail (string userToken, string bodyMessage = null)
{
  try
  {
    string userState = userToken;

    if (bodyMessage != null)
      mailMessage.Body = bodyMessage;

    if (String.Compare (userState, "testMessage", StringComparison.Ordinal) == 0)
      mailMessage.Body = string.Format ("Testmail from {0}", LogFile.APPLICATION_CAPTION);

    mailClient.SendAsync (mailMessage, userToken);

    if (String.Compare (userState, "testMessage", StringComparison.Ordinal) == 0)
      return;
}
  catch (Exception ex)
  {
    ErrorLog.WriteLog (ErrorFlags.Error, GetType ( ).Name, string.Format ("{1}, exception: {0}", ex, System.Reflection.MethodBase.GetCurrentMethod ( ).Name));
  }
}
public void InitClient()
{
尝试
{
mailClient=新SmtpClient(SettingsHelper.TailSettings.AlertSettings.SmtpSettings.SmtpServerName,SettingsHelper.TailSettings.AlertSettings.SmtpSettings.SmtpPort)
{
UseDefaultCredentials=false,
超时=30000,
DeliveryMethod=SmtpDeliveryMethod.Network
};
string decryptPassword=StringEncryption.Decrypt(SettingsHelper.TailSettings.AlertSettings.SmtpSettings.Password,LogFile.ENCRYPT\u密码);
NetworkCredential authInfo=新的NetworkCredential(SettingsHelper.TailSettings.AlertSettings.SmtpSettings.LoginName,解密密码);
mailClient.Credentials=authInfo;
mailClient.SendCompleted+=SendCompleted;
if(SettingsHelper.TailSettings.AlertSettings.SmtpSettings.SSL)
mailClient.EnableSsl=true;
如果(设置Shelper.TailSettings.AlertSettings.SmtpSettings.TLS)
ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls;
MailAddress from=新邮件地址(setingShelper.TailSettings.AlertSettings.SmtpSettings.FromAddress);
MailAddress to=新邮件地址(SettingsHelper.TailSettings.AlertSettings.EMailAddress);
mailMessage=新的mailMessage(从,到)
{
主题=设置Shelper.TailSettings.AlertSettings.SmtpSettings.Subject,
SubjectEncoding=System.Text.Encoding.UTF8,
BodyEncoding=System.Text.Encoding.UTF8,
IsBodyHtml=false
};
}
捕获(例外情况除外)
{
ErrorLog.WriteLog(ErrorFlags.Error,GetType().Name,string.Format(“{1},异常:{0}”,ex,System.Reflection.MethodBase.GetCurrentMethod().Name));
}
}
/// 
///发送电子邮件
/// 
///用户令牌
///要发送的消息
public void SendMail(字符串userToken,字符串bodyMessage=null)
{
尝试
{
字符串userState=userToken;
if(bodyMessage!=null)
mailMessage.Body=bodyMessage;
if(String.Compare(userState,“testMessage”,StringComparison.Ordinal)==0)
mailMessage.Body=string.Format(“Testmail from{0}”,LogFile.APPLICATION\u CAPTION);
mailClient.sendaync(mailMessage,userToken);
if(String.Compare(userState,“testMessage”,StringComparison.Ordinal)==0)
返回;
}
捕获(例外情况除外)
{
ErrorLog.WriteLog(ErrorFlags.Error,GetType().Name,string.Format(“{1},异常:{0}”,ex,System.Reflection.MethodBase.GetCurrentMethod().Name));
}
}

SendAsync
是异步的,它将在将来完成。显然,调用
SendMail
的方法的范围在
sendpleted
被激发之前结束。例如,控制台应用程序可能会在您有机会处理此事件并处理异步操作完成之前结束


任何进一步的建议将取决于应用程序的执行环境:ASP.NET、WCF、Console、WinForms、WPF等。

请不要在问题标题中包含有关所用语言的信息,除非没有它就没有意义。标签用于此目的。它是WPFapplication@simmeone,那么我怀疑在由
SendAsync
启动的操作完成之前调用了
mailClient.Dispose
。@simmeone,很高兴它起到了作用。