Skip to main content
 首页 » 编程设计

c#之SendAsync Smtp 邮件错误

2024年01月26日26EasonJim

应用程序要求使用 SendAsync 而不仅仅是发送。所以我制作了一个 CEmailServer 类并设置了所有内容。到目前为止, Send 工作正常,但是当将其更改为与 SendAsync 一起使用时,它不起作用。我创建了一个在发送邮件并且 userToken 就位时调用的方法,但它一直失败。我找不到我的错误。这是我的代码:

static bool mailSent = false; 
 
//Method for Sending with attachment. 
public void SendEmail(string Address, string Recipient, string Subject, string Body, string Dir) 
{ 
    var fromAddress = new MailAddress("someadress.kimberley@gmail.com", "My Company"); 
    var toAddress = new MailAddress(Address, Recipient); 
    const string fromPassword = "password"; 
    string subject = Subject; 
    string body = Body; 
 
    var smtp = new SmtpClient 
    { 
        Host = "smtp.gmail.com", 
        Port = 587, 
        EnableSsl = true, 
        DeliveryMethod = SmtpDeliveryMethod.Network, 
        UseDefaultCredentials = false, 
        Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
 
    }; 
    using (var message = new MailMessage(fromAddress, toAddress) 
    { 
        Subject = subject, 
        Body = body, 
    }) 
    { 
        smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); 
        string userState = "Test"; 
        message.Attachments.Add(new Attachment(Dir)); 
        smtp.SendAsync(message,userState); 
        message.Dispose(); 
    } 
} 
 
//Method for Sending regular message without attachment. 
public void SendEmail(string Address, string Recipient, string Subject, string Body) 
{ 
    var fromAddress = new MailAddress("someadress.kimberley@gmail.com", "My Company"); 
    var toAddress = new MailAddress(Address, Recipient); 
    const string fromPassword = "password"; 
    string subject = Subject; 
    string body = Body; 
 
    var smtp = new SmtpClient 
    { 
        Host = "smtp.gmail.com", 
        Port = 587, 
        EnableSsl = true, 
        DeliveryMethod = SmtpDeliveryMethod.Network, 
        UseDefaultCredentials = false, 
        Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
 
    }; 
    using (var message = new MailMessage(fromAddress, toAddress) 
    { 
        Subject = subject, 
        Body = body, 
    }) 
    { 
        smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback); 
        string userState = "Message Sent"; 
        smtp.SendAsync(message, userState); 
        message.Dispose(); 
    } 
} 
 
//Method to be called when sending is complete 
private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e) 
{ 
    // Get the unique identifier for this asynchronous operation. 
    String token = (string)e.UserState; 
 
    if (e.Cancelled) 
    { 
        MessageBox.Show("Sending Canc"); 
    } 
    if (e.Error != null) 
    { 
        MessageBox.Show("Error Sending Mail"); 
    } 
    else 
    { 
        MessageBox.Show("Message sent."); 
    } 
    mailSent = true; 
} 

非常感谢!

请您参考如下方法:

您正在发送完成之前处理消息。您应该在 SendCompleted 回调事件中处理它们。这是一个 example处理客户端和消息的最佳方式。

您的代码应如下所示:

var smtp = new SmtpClient 
{ 
    Host = "smtp.gmail.com", 
    Port = 587, 
    EnableSsl = true, 
    DeliveryMethod = SmtpDeliveryMethod.Network, 
    UseDefaultCredentials = false, 
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword) 
}; 
 
var message = new MailMessage(fromAddress, toAddress) 
{ 
    Subject = subject, 
    Body = body, 
}; 
 
smtp.SendCompleted += (s, e) => { 
    SendCompletedCallback(s, e); 
    smtp.Dispose(); 
    message.Dispose(); 
}; 
string userState = "Test"; 
message.Attachments.Add(new Attachment(Dir)); 
smtp.SendAsync(message, userState);