使用MailMessage将电子邮件发送给多个收件人?


85

我在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是的,我为单一收件人工作。
Chetan Goenka

5
另外,仅供参考,您的MailMessageSmtpClient实例必须成using块。
约翰·桑德斯

2
@JohnSaunders他们应该,但绝对不需要
Num Lock

1
@JohnSaunders首先,您的措辞非常容易引起误解:您可能会对此争论不休,但是“需要被限制using”并不等于“需要被处置”。其次,在生产代码(如Web应用程序)中,您通常SendAsync总是想使用它,而按预期方式工作却不需要处理SnmpClient实例。
Num Lock

Answers:


178

简单!

只需在“;”上拆分传入地址列表 字符,并将它们添加到邮件中:

foreach (var address in addresses.Split(new [] {";"}, StringSplitOptions.RemoveEmptyEntries))
{
    mailMessage.To.Add(address);    
}

在此示例中,addresses包含“ address1@example.com;address2@example.com”。


56
我参加聚会很晚,但是MailMessage(string from,string to)构造函数接受逗号分隔的地址列表。因此,您本可以进行诸如new MailMessage(fromMail,addresss.replace(“;”,“,”))之类的操作,也许使用replace并不是更好,但我想我应该在其他人已经用逗号分隔时对此进行评论弦!这样就无需拆分或替换。
Areks

@Areks,如果您可以将类似于Brendan的示例代码放在一起,则一定要添加它作为答案。
亚当·米勒

@Areks感谢您的评论,在阅读您的评论之前,我已经准备好分配地址。这正是我想要的!
Djeroen '16

这有必要吗?您不只是将已经格式化为多个地址的字符串并拆分,然后重新分配它们吗?如果您向To()发送一个如To(“ a1; a2; a3”)所述的字符串,为什么需要将它们分开然后分别分配?由于它不包含AddressCollection中的多个Addresses或分隔符字符串。
Casey

82

正如亚当·米勒(Adam Miller)在评论中所建议的那样,我将添加另一个解决方案。

MailMessage(String from,String to)构造函数接受逗号分隔的地址列表。因此,如果您碰巧已经有一个用逗号(',')分隔的列表,则用法很简单:

MailMessage Msg = new MailMessage(fromMail, addresses);

在这种情况下,我们可以替换';' 代表',',并且仍使用构造函数。

MailMessage Msg = new MailMessage(fromMail, addresses.replace(";", ","));

是否选择此答案还是接受的答案取决于您。可以说,循环使意图更清晰,但这更短且不模糊。但是,如果您已经有一个用逗号分隔的列表,我认为这是要走的路。


2
由于这引起了我管理的实现该问题的应用程序的问题,因此应在运行replace命令之前检查结尾字符是否为分号,并删除该字符。我不确定尾随分号是否被视为有效的收件人列表,但人们可能习惯于通过Outlook等应用程序查看尾随分号。传递给MailMessage的逗号分隔列表中不能包含结尾逗号。
David Jacobsen

1
据我了解,如果在此之后没有任何内容,则不应使用逗号/分号结尾。但是绝对是个不错的评论,因此阅读本文的人都知道这一点。谢谢!
Areks

1
这是否记录在某处?构造函数文档仅将to参数描述为“包含电子邮件收件人地址的字符串”。我想使用它,但是如果它的支持可能被删除,则不会。
xr280xr 2015年

1
遗憾的是,该格式似乎未作记录,但构造函数确实声明它可以用于多个收件人:msdn.microsoft.com/zh-cn/library/14k9fb7t(v=vs.110).aspx 包含地址的字符串电子邮件收件人的数量。“地址”和“收件人”都是复数形式。
Areks 2015年

1
绝对是一个功能,但是文档要么很少,要么不存在。我必须经过大约5个方法调用才能获得第一个暗示它是正确的提示。referencesource.microsoft.com/#System/net/System/Net/mail/…–
Sinjai

1

根据文档:

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(";", ","));

以供参考 :

  1. https://docs.microsoft.com/zh-cn/dotnet/api/system.net.mail.mailmessage?view=netframework-4.8
  2. https://www.geeksforgeeks.org/c-sharp-replace-method/

-4

我已经使用以下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);

4
这是标记问题C#,都没有涉及到PowerShell的
杰罗姆MEVEL

最后是同一个库。在没有vs的机器上使用powershell进行测试更容易。获得powersell脚本后,这只是将其“翻译”为等效于c#的问题。
Heitor Marcos

1
这个问题甚至没有被标记.NET Framework,只是被标记C#。如果每个人都和您一样,我们还将获得VB.NET,F#或什至C ++来回答与相关的所有问题.NET Framework。毕竟是同一个框架,只是翻译问题...您在这里看到我的意思了吗?StackOverflow的将成为信息的真垃圾源
杰罗姆MEVEL
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.