用C#通过Thunderbird一次发送多封电子邮件

3
我将使用C#通过Thunderbird给多人发送邮件。我使用了循环。我的问题是,当我运行应用程序时,每次发送电子邮件都会打开一个新的Thunderbird窗口,然后我需要按“发送”才能发送。这非常不方便。如何一次发送所有邮件?
我的代码:
string strCommand;
for(i=0;i<100;i++)
{
   strCommand = " -compose to=" + (char)34 + astrRecip[i] + (char)34 + ",";
   strCommand += "body=" + (char)34 + strMessage[i] + (char)34 + ",";
   strCommand += "subject=" + (char)34 + strSubject + (char)34 + ",";
   strCommand += "attachment=" + (char)34 + strAttachment[i] + (char)34;
   Process.Start(@"C:\Program Files\Mozilla Thunderbird\thunderbird", strCommand);
}

我认为因为我在每封电子邮件中写了“-compose”,所以会打开一个新窗口,也许如果我只写一个命令行就可以了。我尝试过了,但没有成功。


3
你使用Thunderbird发送邮件而不是使用SMTP,是否有原因?此外,由于Thunderbird安装到C:\ Program Files(x86)\ ...,你的代码在任何64位操作系统上都无法工作。 - Joe
1
你为什么要用Thunderbird发送邮件,而不是直接使用C#和System.Net.Mail命名空间发送? - Ignacio Soler Garcia
1
@Chanipoz:如果你的老板提出了无意义的要求,你有责任告诉他这个要求是无意义的。也许他不知道更好的做法。 - Daniel Hilgarth
1
这是因为程序员的典型思维方式是采用懒惰的方式——通过SmtpClient实现似乎比通过第三方程序更容易。由于他们不理解为什么应该使用该程序的要求,因此将提出其他看似更简单的解决方案。我对你说“没有地方在这里写它们”的回应只是因为没有使用它的好理由。因此,将提出其他解决方案。当你说“你的老板想要它”时,这是一个可以改变以达到更简单解决方案的要求。 - default
3
你的问题基本上是说“我找到了一种通过这个非常复杂的方式达到某个目标的方法,但有一件小事情不起作用了。我该如何解决这个小问题?”- 这将产生回答说“别使用那个复杂的方法,改用这个简单的方法”。所以...你需要说明为什么要使用复杂的方法。 - default
显示剩余6条评论
2个回答

6

你真的应该使用.NET框架中的SmtpClient类。


通常是的,唯一的例外是我想使用预配置的加密,而不必在代码中再次设置它(特别是对于gpg,但即使是s/mime,如果您的证书仅存储在TB的证书存储中)。 - mbx

2
您可以在一个撰写参数中使用多个电子邮件地址,如命令行参数 - Thunderbird中所示的示例。
因此,不要在每次循环中启动进程,而是将所有电子邮件地址连接起来,然后启动一个进程。这很容易通过string.Join实现。
string strCommand;
strCommand = " -compose to=" + (char)34 + string.Join(",", astrRecip) + (char)34 + ",";
strCommand += "body=" + (char)34 + strMessage[i] + (char)34 + ",";
strCommand += "subject=" + (char)34 + strSubject + (char)34 + ",";
strCommand += "attachment=" + (char)34 + strAttachment[i] + (char)34;
Process.Start(@"C:\Program Files\Mozilla Thunderbird\thunderbird", strCommand);

编辑:请注意,如果您想使用 \ "进行转义,则可以这样做。因此,您可以输入 (char) 34 而不是使用它。
strCommand = " -compose to=\"" + string.Join(",", astrRecip) + "\",";

而且,通过使用字符串格式化,这甚至可以更容易阅读。
strCommand = string.Format("-compose to=\"{0}\",", string.Join(",", astrRecip));

因为你将字符串与参数分开。


我刚注意到你在正文和主题中都使用了一个数组。它们会改变吗?还是它们是相同的?如果它们不同,那么这个解决方案将不太有效.. :-/ - Patrick
@Chanipoz:哦,我明白了。那么你只有两个选择,要么为每个用户打开一个窗口,要么使用Daniel提出的解决方案。也许一个小调整是等待当前进程结束,使用Process.WaitFor。这样至少你不会一次性打开100个窗口,而是一个接一个地打开。 - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接