2017-01-05 2 views
1

Я работаю над проектом, который (к сожалению) требует максимального рамочных разрешенного быть .NET 4.SmtpClient.SendAsync не отправки электронной почты по сравнению с SmtpClient.Send

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

Если я использую синхронный метод Send();, он работает безупречно.

Единственным отличием в моем коде является использование обработчика события для метода SendAsync();. (SendCompleteEventHandler)

Ниже приведен код, который я пробовал до сих пор, чтобы отправить электронное письмо.

private static void SendMailAsync() 
{ 

    const string FROM = "[email protected]"; 
    const string TO = "[email protected]"; 

    string SUBJECT = "THIS IS A TEST"; 
    string BODY = "THIS IS A TEST"; 


    const string SMTP_USERNAME = "UserName"; //SMTP username. 
    const string SMTP_PASSWORD = "Password"; // SMTP password. 


    const string HOST = "host.testsmtp.com"; 
    const int PORT = 2587; 

    // Create an SMTP client 
    SmtpClient client = new SmtpClient(HOST, PORT); 
    client.SendCompleted += new SendCompletedEventHandler(Client_SendComplete); 

    // Create a network credential 
    client.Credentials = new System.Net.NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD); 
    client.EnableSsl = true; 

    string userToken = "testmsg1"; 

    // Send the email. 

     client.SendAsync(FROM, TO, SUBJECT, BODY, userToken); 

    client.Dispose(); 

} 

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

    if (e.Error != null) 
    { 
     MessageBox.Show(e.Error.ToString()); 
    } 
    else 
    { 
     MessageBox.Show("Message sent."); 
    } 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    SendMailAsync(); 
} 

Есть ли что-то, что я просто не понял? Благодарю.

+0

Согласен, я не думаю, что вы должны распоряжаться клиентом, но вы можете удалить сообщение. 'SendAsync' не является ожидаемым, поэтому не делайте этого, даже если он похож на шаблон async/await. – Crowcoder

+0

@Crowcoder - спасибо за разъяснение. Очень странно, что это не так. Я предполагаю, что этот код является модификацией [образец здесь, в MSDN] (https://msdn.microsoft.com/en-us/library/x5x13z6h%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396) –

+0

@KraangPrime, просто догадка, но я думаю, что это было до .net 4.5, и это просто совпадение, что оно было названо 'async'. – Crowcoder

ответ

1

Операция под названием asynchronous, если она выполняется asynchronously, в фоновом режиме. Итак, вы должны рассмотреть метод SendAsync как начало для операции. После этого вы удаляете клиента, который фактически запускает операцию, не дожидаясь ее завершения, так что вы, например, говорите: эй, начните это для меня, пожалуйста ... О, неважно.

Таким образом, вы, вероятно, должны удалить метод Dispose из кода сразу после отправки. Вы можете распоряжаться своим клиентом в Client_SendComplete (sender объект, вероятно, является клиентом), или вы можете создать статическое поле в своем классе и утилизировать его после закрытия вашей программы (насколько я вижу, это проект WinForms, поэтому вы может обрабатывать некоторые события Windows)