.Net System.Mail.Message, добавляющий несколько адресов To

РЕДАКТИРОВАТЬ: этот вопрос бессмыслен, кроме как в качестве упражнения в отвлекающих маневрах. Проблема оказалась комбинацией моего идиотизма (НИКОМУ не отправляли электронные письма, поскольку хост не был указан и был неверным в web.config) и пользователей, которые говорили мне, что они иногда получали электронные письма, а иногда нет, когда на самом деле они НИКОГДА не получали электронные письма.

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


Я просто наткнулся на что-то, что считаю непоследовательным, и хотел посмотреть, делаю ли я что-то не так, идиот ли я или...

MailMessage msg = new MailMessage();
msg.To.Add("[email protected]");
msg.To.Add("[email protected]");
msg.To.Add("[email protected]");
msg.To.Add("[email protected]");

На самом деле отправляет это письмо только 1 человеку, последнему.

Чтобы добавить несколько, я должен сделать это:

msg.To.Add("[email protected],[email protected],[email protected],[email protected]");

Я не понимаю. Я думал, что добавляю несколько человек в коллекцию адресов To, но на самом деле я заменил ее.

Я думаю, что только что понял свою ошибку - чтобы добавить один элемент в коллекцию, используйте .To.Add(new MailAddress("[email protected]"))

Если вы используете только string, он заменяет все, что было в его списке. РЕДАКТИРОВАТЬ: другие люди протестировали и не наблюдают такого поведения. Это либо ошибка в моей конкретной версии фреймворка, либо, что более вероятно, мой идиотский маневр.

Фу. Я бы посчитал это довольно большой ошибкой! Поскольку я ответил на свой вопрос, но я думаю, что это полезно иметь в архиве stackoverflow, я все равно спрошу его. Может быть, кто-то даже имеет представление о других ловушках, в которые можно попасть.


person Matt Dawdy    schedule 08.03.2010    source источник
comment
Рад, что вы решили не отвечать на свой вопрос. Это странное явление.   -  person DOK    schedule 08.03.2010
comment
Ваша проблема в том, что он отправляет только последним или что ваша коллекция перезаписывает значения? FWIW, в консольном приложении .Net 2.0 это ведет себя так, как ожидалось (4 адреса в коллекции To).   -  person Austin Salonen    schedule 08.03.2010
comment
Мы могли бы помочь вам, если бы вы разместили больше кода...   -  person Austin Salonen    schedule 09.03.2010


Ответы (7)


Я не смог воспроизвести вашу ошибку:

var message = new MailMessage();

message.To.Add("[email protected]");
message.To.Add("[email protected]");

message.From = new MailAddress("[email protected]");
message.Subject = "Test";
message.Body = "Test";

var client = new SmtpClient("localhost", 25);
client.Send(message);

Сброс содержимого To: MailAddressCollection:

MailAddressCollection (2 элемента)
DisplayName Адрес хоста пользователя

пользователь example.com [email protected]
user2 example.com [email protected]

И полученное электронное письмо, перехваченное smtp4dev:

Received: from mycomputername (mycomputername [127.0.0.1])
     by localhost (Eric Daugherty's C# Email Server)
     3/8/2010 12:50:28 PM
MIME-Version: 1.0
From: [email protected]
To: [email protected], [email protected]
Date: 8 Mar 2010 12:50:28 -0800
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Test

Вы уверены, что с вашим кодом или SMTP-сервером не связана какая-либо другая проблема?

person Lance McNearney    schedule 08.03.2010
comment
Я с вами. Я не могу воспроизвести это. - person Austin Salonen; 08.03.2010
comment
Хм. Прямо сейчас почтовый сервер отключен на техническое обслуживание, поэтому я не знаю ни одного, с которым я мог бы протестировать. Однако я был очень осторожен, и код, который я использовал, был очень простым. Но вы, ребята, нашли время, чтобы запустить свои собственные тесты и несколько человек. Я все еще смотрю на свой код, чтобы увидеть, происходит ли что-то еще. В противном случае мне придется попросить какого-нибудь инженера проверить сервер. - person Matt Dawdy; 09.03.2010
comment
@Matt Dawdy: Вы можете загрузить связанный файл smtp4dev, чтобы убедиться, что вы все делаете правильно. - person Austin Salonen; 09.03.2010

private string FormatMultipleEmailAddresses(string emailAddresses)
    {
      var delimiters = new[] { ',', ';' };

      var addresses = emailAddresses.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);

      return string.Join(",", addresses);
    }

Теперь вы можете использовать его как

var mailMessage = new MailMessage();
mailMessage.To.Add(FormatMultipleEmailAddresses("[email protected];[email protected],[email protected]"));
person prashant    schedule 25.09.2013
comment
если вы хотите разрешить пробелы для разделения писем, используйте это: var delimiters = new[] { ',', ';', ' ' }; - person Nathan Prather; 08.03.2018
comment
Для To.Add разделителем является , ? - person Kiquenet; 17.05.2018

Вы можете сделать это либо с несколькими объектами System.Net.Mail.MailAddress, либо указать одну строку, содержащую все адреса, разделенные запятыми.

person Brian Surowiec    schedule 08.03.2010

Вы можете попробовать поместить электронные письма в строку с разделителями-запятыми ("[email protected], [email protected]"):

C#:

ArrayList arEmails = new ArrayList();
arEmails.Add("[email protected]");
arEmails.Add("[email protected]");
           
string strEmails = string.Join(", ", arEmails);

VB.NET, если вам интересно:

Dim arEmails As New ArrayList
arEmails.Add("[email protected]")
arEmails.Add("[email protected]")

Dim strEmails As String = String.Join(", ", arEmails)
person Chad Levy    schedule 08.03.2010
comment
Я думаю, что если я пойду по этому пути, он захочет, чтобы электронные письма были разделены запятыми. Но это ограничивает меня тем, что я не могу указать удобное для пользователя имя электронной почты. Подобно тому, как мы делали это много лет назад с конструкцией типа ‹Bob Smith› [email protected]. Может быть, у меня это задом наперёд, я уже забыл... - person Matt Dawdy; 09.03.2010

Добавьте несколько объектов System.MailAdress, чтобы получить то, что вы хотите.

person David Brunelle    schedule 08.03.2010

Вставьте в адреса этот код:

objMessage.To.Add(***addresses:=***"[email protected] , [email protected] , [email protected]")

person user2923556    schedule 26.10.2013

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

msg.to.Add(‹MailAddress›) добавляет MailAddress в конец коллекции
msg.to.Add(‹string›) добавляет список адресов электронной почты в коллекцию

Немного разные действия в зависимости от типа параметра, я думаю, что это довольно плохая форма, я бы предпочел методы разделения AddStringList чего-то.

person Mike    schedule 16.01.2014