我正在编写一个通过类SmtpClient发送电子邮件的程序。我使用这段代码:
try
{
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("mailSMTP.it");
mail.From = new MailAddress("address.it");
mail.Subject = "oggetto";
mail.IsBodyHtml = true;
string htmlBody = "someHTML";
mail.Body = htmlBody;
SmtpServer.Port = 25;
SmtpServer.EnableSsl = false;
foreach (string indirizzo in indirizzi)
{
mail.To.Clear();
mail.To.Add(indirizzo);
SmtpServer.Send(mail);
System.Threading.Thread.Sleep(3000);
}
MessageBox.Show("e-mail spedite!");
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
但只有切断“睡眠”线才有效。为什么?我觉得在这个过程中休息是个好主意。
答案 0 :(得分:2)
鉴于存在异常,假设它在调用Send
时,我建议不要重复使用MailMessage
对象并在循环的每次迭代中创建一个新对象。例如:
//...
foreach (string indirizzo in indirizzi)
{
string htmlBody = "someHTML";
MailMessage mail = new MailMessage
{
From = new MailAddress("address.it"),
Subject = "oggetto",
IsBodyHtml = true,
Body = htmlBody,
};
mail.To.Clear();
mail.To.Add(indirizzo);
SmtpServer.Send(mail);
}
如果“工作”是指你的 MessageBox
在合理的时间内出现......那么原因是因为Sleep
阻止了UI线程,直到所有的消息都是发送。例如如果您尝试发送10条消息,UI将暂停30秒(3000毫秒X 10)。
答案 1 :(得分:0)
我认为你为这个过程定义了新的线程,因为如果你写System.Threading.Thread.Sleep(3000);
意味着主线程要休眠3000ms。
因此,为此过程创建一个嵌套线程,然后可以停止/休眠线程。
答案 2 :(得分:0)
在我看来(和others)你应该尽量避免睡眠,最常见的是你最终得到一个行为奇怪的应用程序(比如你描述的行为)。
我会用一个使用索引来确定下一个要发送的邮件的计时器来解决它。像这样:
try
{
MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("mailSMTP.it");
mail.From = new MailAddress("address.it");
mail.Subject = "oggetto";
mail.IsBodyHtml = true;
string htmlBody = "someHTML";
mail.Body = htmlBody;
SmtpServer.Port = 25;
SmtpServer.EnableSsl = false;
var index = 0;
var timer = new System.Threading.Timer((callbackState) =>
{
mail.To.Clear();
mail.To.Add(indirizzi[index]);
SmtpServer.Send(mail);
index++;
if (index < indirizzi.Count)
timer.Change(3000, Timeout.Infinite);
else {
timer.Dispose();
Invoke(new Action(DisplayAllEmailsSentMessage));
}
}, timer, 3000, Timeout.Infinite);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
请注意,您必须使用Invoke以任何方式与Windows窗体交互,例如显示消息框。这是因为Threading.Timer回调在它自己的线程上执行。
您也可以使用Windows.Forms.Timer,但我很少自己使用它,因为它位于Windows.Forms命名空间中,因此仅适用于以Windows窗体编写的UI。
答案 3 :(得分:0)
由于不活动,Smtp服务器正在断开连接。这很可能会释放服务器上的资源。
来自SmtpClient文档:
由SmtpClient的当前实例建立的连接 如果应用程序希望,可以重新使用SMTP服务器的类 将多条消息发送到同一SMTP服务器。这是特别的 在使用身份验证或加密时有用建立一个 连接到SMTP服务器。认证过程和 建立TLS会话可能是昂贵的操作。要求 发送大型邮件时为每条消息重新建立连接 到同一SMTP服务器的电子邮件数量可能很大 对绩效的影响。
一般情况下,其他响应者说你不应该在发送之间睡觉。 Smtp服务器应足够强大,可以处理您可以按顺序抛出的所有电子邮件。
答案 4 :(得分:0)
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
class MailSender
{
public static int CreateMessageMdp(String destination,String mdp)
{
try
{
var client = new SmtpClient("smtp.domain.com", 587)
{
Credentials = new NetworkCredential("appgestionali@domain.com", "password"),
EnableSsl = true
};
DateTime localDate = DateTime.Now;
string body = "Suite à votre demande de mot de passe le " + localDate.ToString("F") + "\n on vous envoi votre mot de passe est :" + mdp;
client.Send("appgestionali@domain.com", destination, "Information", body);
}
catch (Exception ex)
{
MessageBox.Show(""+ ex.GetBaseException());
return -1;
}
return 0;
}
}
}