Отправить электронное письмо нескольким получателям с помощью MailMessage?

87

У меня есть несколько получателей электронной почты, хранящихся в 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 да, я работаю на одного получателя.
Четан Гоенка
5
Кроме того , FYI, ваши MailMessageи SmtpClientэкземпляры должны быть в usingблоках.
Джон Сондерс
2
@JohnSaunders Они должны, но определенно не должны .
Num Lock
1
@JohnSaunders Прежде всего, ваша формулировка вводит в заблуждение: вы, вероятно, будете спорить по этому поводу, но «должен быть в usingблоках» не равно «необходимо удалить». Во-вторых, в производственном коде, таком как веб-приложения, вы, как правило, захотите использовать в SendAsyncлюбом случае, который работает, как задумано, без необходимости удалять SnmpClientэкземпляр.
Num Lock

Ответы:

182

Легко!

Просто разделите список входящих адресов на ";" и добавьте их в почтовое сообщение:

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

В этом примере addressesсодержит " address1@example.com;address2@example.com".

Брендан Грин
источник
56
Я опаздываю на вечеринку, но конструктор MailMessage (строка от, строка до) принимает список адресов, разделенных запятыми. Итак, вы могли бы сделать что-то вроде нового MailMessage (fromMail, addresses.replace (";", ",")) Возможно, не лучше использовать замену, но я чувствую, что должен прокомментировать это на случай, если другие люди уже разделили запятую струны! Тогда не было бы необходимости в разделении или замене.
Areks
@Areks, если вы можете собрать строку примера кода, подобную Брендану, вам обязательно нужно добавить это в качестве ответа.
Адам Миллер,
@Areks, спасибо за этот комментарий, я уже разделял адреса, пока не прочитал ваш комментарий. это именно то, что я хочу!
Djeroen
Это необходимо? Вы не просто берете строку, уже отформатированную для нескольких адресов, и разделяете их, а затем переназначаете? Если вы отправляете To () строку, как упомянуто To ("a1; a2; a3"), почему вам нужно разделять их, а затем назначать индивидуально? Поскольку он исключает несколько адресов в AddressCollection или строку разделителя.
Кейси
85

Как предложил Адам Миллер в комментариях, добавлю еще одно решение.

Конструктор MailMessage (String from, String to) принимает список адресов, разделенных запятыми. Итак, если у вас уже есть список, разделенный запятыми (','), использование так же просто, как:

MailMessage Msg = new MailMessage(fromMail, addresses);

В этом конкретном случае мы можем заменить ";" for ',' и по-прежнему использовать конструктор.

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

Предпочитаете ли вы этот или принятый ответ, решать вам. Возможно, цикл делает намерение более ясным, но он короче и не затрудняет понимание. Но если у вас уже есть список, разделенный запятыми, я думаю, что это выход.

Арекс
источник
2
Поскольку это вызвало проблему с приложением, которым я управляю, который реализовал это, вы должны проверить, является ли конечный символ точкой с запятой, и удалить его перед запуском команды replace. Я не уверен, что конечная точка с запятой считается допустимым списком получателей, но люди могут привыкнуть видеть конечную точку с запятой в таких приложениях, как Outlook. У вас не может быть конечной запятой в списке, разделенном запятыми, который вы передаете MailMessage.
Дэвид Якобсен,
1
Насколько я понимаю, не должно быть запятой / точки с запятой, если после этого ничего нет ... Но определенно хороший комментарий, поэтому люди, читающие это, знают об этом. Спасибо!
Areks
1
Это где-то задокументировано? Документы конструктора просто описывают toпараметр как «Строка, содержащая адрес получателя сообщения электронной почты». Я хочу использовать его, но не могу, если его поддержка может быть удалена.
xr280xr
1
К сожалению, формат не задокументирован, но в конструкторе указано, что он может быть адресован более чем одному получателю: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx Строка, содержащая адреса получателей сообщения электронной почты. Оно используется во множественном числе как для «адресов», так и для «получателей».
Арекс
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/en-us/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,
Жером МЕВЕЛ
Та же библиотека в конце концов. Просто проще протестировать с помощью PowerShell на машине без vs. После того, как вы запустили скрипт powersell, это просто вопрос «перевода» в эквивалент C #.
Heitor Marcos
1
Этот вопрос даже не помечен, .NET Frameworkа только C#. Если бы все делали то же самое, что и вы, у нас также были бы ответы на VB.NET, F # или даже C ++ на все вопросы, связанные с .NET Framework. В конце концов, это тот же Framework, это просто вопрос перевода ... Вы понимаете мою мысль? StackOverflow станет действительно мусорным источником информации
Жером МЕВЕЛ