2013-12-04 5 views
1

Когда я программа с C# для отправки почты по партии, мой код выглядит так:Как понять функцию C# SendAsync?

public static bool Send(MailAddress Messagefrom, 
    string MessageTo, 
    string MessageSubject, 
    string MessageBody) 
{ 
    MailMessage message = new MailMessage(); 
    message.From = Messagefrom; 
    message.To.Add(MessageTo); 
    message.Subject = MessageSubject; 
    message.Body = MessageBody;    
    message.BodyEncoding = System.Text.Encoding.UTF8; 
    //message.SubjectEncoding = Encoding.BigEndianUnicode; 
    message.IsBodyHtml = true; 
    message.Priority = MailPriority.High;    
    MailHelper mh = new MailHelper(); 
    SmtpClient sc = mh.setSmtpClient("smtp.qq.com", 25); 
    sc.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); 
    try 
    {     
     sc.SendAsync(message, message);     
    } 
    catch (Exception e) 
    { 
     LogHelper.WriteLog("Main send failed....\t the detail info:" + 
      e.ToString()); 
     return false; 
    } 
    return true; 
} 

Это проблема Когда первая почта отправить не удалось (например, почтовый адрес null), следующий! почта не может быть отправлена!

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

Но эта ситуация, вероятно, в функции Send, почему это происходит?

+2

Вы отправляете письма в цикле foreach? Вы должны изменить вызывающего абонента Send(), чтобы при сбое для одной почты зарегистрировать ошибку и продолжить отправку следующего сообщения – RononDex

+0

Да, я использую цикл foreach, все еще используя цикл? – Dolphin

+0

Вы можете попробовать вызвать метод SendAsyncCancel в блоке catch. См. Http://msdn.microsoft.com/library/x5x13z6h.aspx в разделе «Примечания». – Frank

ответ

2

Вы должны поймать ошибки в цикле Еогеаспа, который вызывает вашу функцию Send() и где-то регистрировать ошибки:

foreach (var mail in mailsToSend) 
{ 
    try 
    { 
     // Call your send function 
     Send(...) 
    } 
    catch (Exception ex) 
    { 
     // Log the error somewhere (console, file, ...) 
     Console.WriteLine("Error sending mail {0}", mail); 
    } 
} 

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

Кроме того, вы должны использовать Send() вместо SendAsync() в функции Send(). Это связано с тем, что функция SendAsync запускает новый поток для отправки почты, а Send останавливает выполнение ваших программ до тех пор, пока почта не будет отправлена. Еще одна причина, по которой вы не должны использовать функцию SendAsync, заключается в том, что в соответствии с Microsoft только 1 почта может быть отправлена ​​за один раз. Это означает, что с помощью функции SendAsync более 1 почты заставит ее выдать исключение.