C# 使用c将电子邮件从g-mail主机发送到五个不同的电子邮件帐户#
我想向5个不同的电子邮件帐户发送电子邮件,我的问题在于,每当我激活那些有“--->这一行”“的代码行时,它工作正常,但当我停用这些行时,它会向一个电子邮件帐户发送5封电子邮件,而不会向其他帐户发送任何邮件 有人知道我的代码有什么问题吗C# 使用c将电子邮件从g-mail主机发送到五个不同的电子邮件帐户#,c#,email,C#,Email,我想向5个不同的电子邮件帐户发送电子邮件,我的问题在于,每当我激活那些有“--->这一行”“的代码行时,它工作正常,但当我停用这些行时,它会向一个电子邮件帐户发送5封电子邮件,而不会向其他帐户发送任何邮件 有人知道我的代码有什么问题吗 namespace WindowsFormsApplication9 { public partial class Form1 : Form { Thread t = null; MailMessage mailMe
namespace WindowsFormsApplication9
{
public partial class Form1 : Form
{
Thread t = null;
MailMessage mailMessage;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//textBox1 is recipients email addresses
String[] to = textBox1.Text.Split(';');
foreach (String s in to)
{
Object[] array = new Object[2];
array[0] = (textBox4.Text.ToString());
array[1] = (s.ToString());
// MessageBox.Show(s.ToString()); -----> this line
t = new Thread(sentEmail);
t.Start(array);
//MessageBox.Show("from: " + array[0].ToString()); -----> this line
// MessageBox.Show("to: " + array[1].ToString()); ----->this line
Thread.Sleep(50);
}
}
void sentEmail(Object array)
{
Object[] o = array as Object[];
SmtpClient client = new SmtpClient();
client.EnableSsl = true;
client.Host = "smtp.gmail.com";
client.Port = 587;
client.Credentials = new NetworkCredential(textBox4.Text, textBox5.Text);
mailMessage = new MailMessage(new MailAddress(o[0].ToString()), new MailAddress(o[1].ToString()));
mailMessage.Body = textBox3.Text;
mailMessage.Subject = textBox2.Text;
client.Send(mailMessage);
}
}
}
您正在将
mailMessage
存储为表单的属性,地址在实际发送之前被另一个线程更改。添加消息框
可以让一个线程在另一个线程启动之前完成。只需更改sentMail
即可创建新的MailMessage
,而不是重复使用现有邮件,您应该可以:
public partial class Form1 : Form
{
Thread t = null;
//MailMessage mailMessage; <-- take out this line
void sentEmail(Object array)
{
Object[] o = array as Object[];
SmtpClient client = new SmtpClient();
client.EnableSsl = true;
client.Host = "smtp.gmail.com";
client.Port = 587;
client.Credentials = new NetworkCredential(textBox4.Text, textBox5.Text);
MailMessage mailMessage = new MailMessage(new MailAddress(o[0].ToString()), new MailAddress(o[1].ToString())); // <-- don't use the Form property
mailMessage.Body = textBox3.Text;
mailMessage.Subject = textBox2.Text;
client.Send(mailMessage);
}
公共部分类表单1:表单
{
线程t=null;
//MailMessage MailMessage;您正在重用MailMessage
对象。我怀疑您注释掉的行会使处理速度减慢到足以正确发送5条不同的消息/线程完成。当它们不存在时,线程访问同一对象时,您会出现奇怪的行为
本打算清理这里的代码,但@D_Stanley已经介绍过你了。这显然是一个关于你如何发送邮件的问题,而不是那些行的问题。问题是什么?你能给我一些提示吗?问题是明确的:“它向一个电子邮件帐户发送五封电子邮件,而不向其他帐户发送任何邮件。”要添加到@Matthew的响应中,只需在函数中设置mailMessage
一个局部变量。无论如何,为什么它是一个类变量?非常感谢。它解决了这个问题。但现在它在我定义Thread.Sleep(2000)的同时发送电子邮件;我需要它延迟向每个电子邮件帐户发送电子邮件。当我检查我的不同电子邮件帐户时,我看到它们都是同时发送的。虽然当我使用旧代码并激活这些行时这不是一个问题。知道为什么吗?这只是2秒的延迟,所以可能不明显。这可能是SMTP的一个功能您正在使用的d/或POP服务器-SMTP服务器可能不会在接收SMTP数据的准确时间发送邮件。电子邮件不是即时发送的。我测试了较长的Tread.Sleep(5000);但结果和以前一样。你知道SMPT或POP服务器的其他功能可以解决这个问题吗?谢谢,我不知道。POP的设计目的是批量检索电子邮件,而不是实时检索。你为什么需要延迟?如果它们要发送给5个不同的人,为什么不能同时发送。你的客户知道你没有电子邮件吗控制gmail处理SMTP请求或POP客户端下载邮件的时间?如果你能证明你的程序每次延迟2秒,我不知道你还能做什么。另外,如果你需要2秒的延迟,为什么要异步执行?发送电子邮件应该不到2秒。