18

我正在使用SMTPClient.Send(mail)方法发送电子邮件,但后来我看到,如果电子邮件 ID 不存在(不存在),我的应用程序会等到它收到异常,然后允许用户执行进一步的任务。

所以我想到了使用 SMTPClient.SendAsync 方法。

我的怀疑!!这个作为参数传递给方法的 userToken 对象可以在哪里使用?我在网上搜索了很多东西,但没有找到一个很好的例子。即使在MSDN中,他们也像这样使用它

string userState = "test message1";
client.SendAsync(message, userState);

但是,它真的可以用来做什么呢?

先感谢您。

4

2 回答 2

31

您可以在以下情况下使用它:假设您有批量发送电子邮件的应用程序。您撰写消息(每个收件人都有不同的消息\附件,因此您不能将其组合成一条消息),例如选择 20 个收件人并按下“全部发送”按钮。对于发送,您使用“池”中的 SendAsync 和几个 SmtpClient 实例(因为 SmtpClient 不允许在前一个调用未完成之前在一个实例上调用 SendAsync 两次)。

对于所有SendAsync调用,您有一个SmtpClientSendCompleted处理程序,您应该在其中执行高级日志记录:发送的日志结果、失败消息接收者的名称(地址甚至附件),但AsyncCompletedEventArgs只能在 UserState 的帮助下提供此信息。所以这个目的的基本模式是使用自定义用户状态对象。因此,请参见简化示例:

包含您在处理程序中需要的字段的接口:

public interface IEmailMessageInfo{
   string RecipientName {get;set;}
}

异步状态类:

/// <summary>
/// User defined async state for SendEmailAsync method
/// </summary>
public class SendAsyncState {

    /// <summary>
    /// Contains all info that you need while handling message result
    /// </summary>
    public IEmailMessageInfo EmailMessageInfo { get; private set; }


    public SendAsyncState(IEmailMessageInfo emailMessageInfo) {
        EmailMessageInfo = emailMessageInfo;
    }
}

这里是发送电子邮件的代码:

SmtpClient smtpClient = GetSmtpClient(smtpServerAddress);
smtpClient.SendCompleted += SmtpClientSendCompleted;
smtpClient.SendAsync(
   GetMailMessage()
   new SendAsyncState(new EmailMessageInfo{RecipientName = "Blah-blah"})
);

以及处理程序代码示例:

private void SmtpClientSendCompleted(object sender, AsyncCompletedEventArgs e){
    var smtpClient = (SmtpClient) sender;
    var userAsyncState = (SendAsyncState) e.UserState;
    smtpClient.SendCompleted -= SmtpClientSendCompleted;

    if(e.Error != null) {
       tracer.ErrorEx(
          e.Error, 
          string.Format("Message sending for \"{0}\" failed.",userAsyncState.EmailMessageInfo.RecipientName)
       );
    }

    // Cleaning up resources
    .....
}

如果您需要更多详细信息,请告诉我。

于 2012-02-09T08:59:00.420 回答
1

如果您使用 async(),则还需要有事件处理程序。

   static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
    {
        //to be implemented        
    }

使用 Async() 方法发送电子邮件很好。希望这会有所帮助。

于 2013-03-11T11:48:14.373 回答