2014-02-16 3 views
1

У меня странная проблема с C# и sendmail async. Когда я использую обычный метод отправки, все работает нормально, и мой E-Mail отправляет на правый SMTP-сервер. Но когда я использую метод SendAsync, он не работает.SendMail 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 без каких-либо исключений или ошибок. Я действительно не знаю, почему.

У кого-нибудь есть подсказка, подсказка? Благодаря!

Update

Вот полный код:

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)); 
    } 
} 
+0

опубликовать полный код. –

+0

Пожалуйста, не включайте информацию о языке, используемом в заголовке вопроса, если это не имеет смысла без него. Теги служат для этой цели. –

ответ

1

SendAsync является асинхронным, он завершает в будущем. По-видимому, сфера применения метода, когда заканчивается ваш звонок SendMailдоSendCompleted уволен. Например, консольное приложение может просто закончиться, прежде чем вы сможете обработать это событие и обработать завершение асинхронной операции.

Любое дальнейшее предложение будет зависеть от того, что среда выполнения вашего приложения: ASP.NET, WCF, консоли, WinForms, WPF и т.д.

+0

Это приложение WPF – simmeone

+0

@simmeone, тогда я подозреваю, что 'mailClient.Dispose' вызывается до того, как операция, запущенная' SendAsync', будет завершена. – Noseratio

+0

Hum! Это хороший намек, я попробую. – simmeone

Смежные вопросы