使用 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 是的,我为单一收件人工作。 另外,仅供参考,您的 MailMessageSmtpClient 实例需要位于 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 中的地址向多个收件人发送电子邮件?

使用 Python smtplib 从 .txt 文件向多个收件人发送电子邮件

PHP表单向多个收件人发送电子邮件