C# 使用c将电子邮件从g-mail主机发送到五个不同的电子邮件帐户#

C# 使用c将电子邮件从g-mail主机发送到五个不同的电子邮件帐户#,c#,email,C#,Email,我想向5个不同的电子邮件帐户发送电子邮件,我的问题在于,每当我激活那些有“--->这一行”“的代码行时,它工作正常,但当我停用这些行时,它会向一个电子邮件帐户发送5封电子邮件,而不会向其他帐户发送任何邮件 有人知道我的代码有什么问题吗 namespace WindowsFormsApplication9 { public partial class Form1 : Form { Thread t = null; MailMessage mailMe

我想向5个不同的电子邮件帐户发送电子邮件,我的问题在于,每当我激活那些有“--->这一行”“的代码行时,它工作正常,但当我停用这些行时,它会向一个电子邮件帐户发送5封电子邮件,而不会向其他帐户发送任何邮件

有人知道我的代码有什么问题吗

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秒。