使用 MailMessage 向多个收件人发送电子邮件?
Posted
技术标签:
【中文标题】使用 MailMessage 向多个收件人发送电子邮件?【英文标题】:Send Email to multiple Recipients with MailMessage? 【发布时间】:2014-06-22 11:09:33 【问题描述】:我在 SQL Server 中存储了多个电子邮件收件人。当我在网页中单击发送时,它应该向所有收件人发送电子邮件。我使用;
分隔电子邮件。
以下是单个收件人代码。
MailMessage Msg = new MailMessage();
MailAddress fromMail = new MailAddress(fromEmail);
Msg.From = fromMail;
Msg.To.Add(new MailAddress(toEmail));
if (ccEmail != "" && bccEmail != "")
Msg.CC.Add(new MailAddress(ccEmail));
Msg.Bcc.Add(new MailAddress(bccEmail));
SmtpClient a = new SmtpClient("smtp server name");
a.Send(Msg);
sreader.Dispose();
【问题讨论】:
到目前为止你尝试过什么?你有这个为单个收件人工作吗? @BrendanGreen 是的,我为单一收件人工作。 另外,仅供参考,您的MailMessage
和 SmtpClient
实例需要位于 using
块中。
@JohnSaunders 他们应该,但绝对不需要。
@JohnSaunders 首先,您的措辞非常具有误导性:您可能会就此争论,但“需要在using
块中”不等于“需要被处置”。其次,在 Web 应用程序之类的生产代码中,您通常希望使用 SendAsync
【参考方案1】:
简单!
只需在“;”上拆分传入地址列表字符,并将它们添加到邮件消息中:
foreach (var address in addresses.Split(new [] ";", StringSplitOptions.RemoveEmptyEntries))
mailMessage.To.Add(address);
在本例中,addresses
包含“address1@example.com;address2@example.com
”。
【讨论】:
我迟到了,但 MailMessage(string from, string to) 构造函数接受逗号分隔的地址列表。因此,您可以执行类似 new MailMessage(fromMail,addresses.replace(";", ",")) 之类的操作,也许使用替换并不是更好,但我觉得我应该对此发表评论,以防其他人已经用逗号分隔字符串!这样就不需要拆分或替换。 @Areks,如果您可以将一行类似于 Brendan 的示例代码放在一起,您绝对应该将其添加为答案。 @Areks 感谢您的评论,在阅读您的评论之前,我已经准备好拆分地址了。这正是我想要的! 这有必要吗?您不只是将已经格式化为多个地址的字符串并拆分它们,然后重新分配它们吗?如果您向 To() 发送 To("a1;a2;a3") 提到的字符串,为什么需要拆分它们然后单独分配?因为它除了 AddressCollection 中的多个地址或分隔符字符串。【参考方案2】:根据 Adam Miller 在 cmets 中的建议,我将添加另一个解决方案。
MailMessage(String from, String to) 构造函数接受逗号分隔的地址列表。所以如果你碰巧已经有一个逗号(',')分隔的列表,那么用法很简单:
MailMessage Msg = new MailMessage(fromMail, addresses);
在这种特殊情况下,我们可以替换 ';' for ',' 仍然使用构造函数。
MailMessage Msg = new MailMessage(fromMail, addresses.replace(";", ","));
您喜欢这个还是接受的答案取决于您。可以说,循环使意图更清晰,但这更短且不晦涩。但是如果你已经有一个逗号分隔的列表,我认为这是要走的路。
【讨论】:
由于它导致我管理的实现此功能的应用程序出现问题,您应该检查尾随字符是否为分号并在运行替换命令之前将其删除。我不确定尾随分号是否被视为有效的收件人列表,但人们可能习惯于通过 Outlook 等应用程序查看尾随分号。在传递给 MailMessage 的逗号分隔列表中不能有尾随逗号。 据我了解,如果后面没有任何内容,则不应有尾随的逗号/分号......但绝对是一个很好的评论,所以阅读本文的人都知道这一点。谢谢! 这是否记录在某处?构造函数文档只是将to
参数描述为“包含电子邮件收件人地址的字符串”。我想使用它,但如果它的支持可能会被删除,我就不想使用它。
遗憾的是,该格式似乎没有记录在案,但构造函数确实声明它可以用于多个收件人:msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx 包含电子邮件收件人地址的字符串。 “地址”和“收件人”都是复数形式。
绝对是一个特性,但文档要么稀疏要么不存在。我必须经历大约 5 次方法调用才能得到第一个提示,即这是真的。 referencesource.microsoft.com/#System/net/System/Net/mail/…【参考方案3】:
我已使用以下 powershell 脚本并在地址之间使用 (,) 对此进行了测试。它对我有用!
$EmailFrom = "<from@any.com>";
$EmailPassword = "<password>";
$EmailTo = "<to1@any.com>,<to2@any.com>";
$SMTPServer = "<smtp.server.com>";
$SMTPPort = <port>;
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer,$SMTPPort);
$SMTPClient.EnableSsl = $true;
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($EmailFrom, $EmailPassword);
$Subject = "Notification from XYZ";
$Body = "this is a notification from XYZ Notifications..";
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body);
【讨论】:
这是一个标记为C#
的问题,与 PowerShell 完全无关
最后是同一个库。在没有 vs 的机器上使用 powershell 进行测试更容易。在你让 powersell 脚本工作之后,它只是一个“翻译”到 c# 等价物的问题。
这个问题甚至没有标记.NET Framework
,而只有C#
。如果每个人都和你一样,我们也会有 VB.NET、F# 甚至 C++ 来回答与.NET Framework
相关的所有问题。毕竟是同一个框架,只是翻译的问题……你明白我的意思了吗? *** 将成为一个非常垃圾的信息源【参考方案4】:
根据文档:
MailMessage.To 属性 - 返回包含此电子邮件的收件人列表的 MailAddressCollection
这里 MailAddressCollection 有一个名为
的内置方法 public void Add(string addresses)
1. Summary:
Add a list of email addresses to the collection.
2. Parameters:
addresses:
*The email addresses to add to the System.Net.Mail.MailAddressCollection. Multiple
*email addresses must be separated with a comma character (",").
因此在多个收件人的情况下要求: 传递包含以逗号分隔的电子邮件地址的字符串
在你的情况下:
只需替换所有 ; ,
Msg.To.Add(toEmail.replace(";", ","));
供参考:
-
https://docs.microsoft.com/en-us/dotnet/api/system.net.mail.mailmessage?view=netframework-4.8
https://www.geeksforgeeks.org/c-sharp-replace-method/
【讨论】:
【参考方案5】:这对我来说是这样的:
var addresses = "firstemail@email.com;secondemail@email.com";
var fromAddress = new MailAddress("sender@email.com", "Sender");
const string fromPassword = "Password";
string subject = "[Message] Message Subject" ;
string body = "Message Body";
var smtp = new SmtpClient
Host = "smtp.email.com",
Port = 587, //or 25 depending on your smtp server config
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
;
foreach (var address in addresses.Split(new[] ";" , StringSplitOptions.RemoveEmptyEntries))
using (var message = new MailMessage(fromAddress.ToString(), address)
Subject = subject,
Body = body,
Priority = MailPriority.High
)
smtp.Send(message);
【讨论】:
以上是关于使用 MailMessage 向多个收件人发送电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 Mandrill 的 Smtp 客户端发送电子邮件
如何使用 python smtplib 向多个收件人发送电子邮件?
使用 Mailkit 或 mimekit 向多个收件人发送一封电子邮件
如何使用存储在 Excel 中的地址向多个收件人发送电子邮件?