Что не так с WebMail.Send, когда речь идет о нескольких получателях?

Мы уже видели несколько похожих вопросов на StackOverflow относительно System.Web.Helpers.Webmail.Send, но я не вижу подходящего объяснения тому, что происходит.

Что касается параметра to:, см. документацию. говорит:

Адрес электронной почты получателя или получателей. Разделяйте нескольких получателей точкой с запятой (;).

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

Код

WebMail.Send(
    to: "[email protected],[email protected]",
    from: "[email protected]",
    subject: "Some Automated Email",
    body: "<strong>Lorem Ipsum</strong>",
    isBodyHtml: true
);

Я пробовал несколько сценариев:

[email protected];[email protected]

Письма не получены: An invalid character was found in the mail header: ';'.

[email protected]; [email protected]

Электронное письмо получает только первый получатель

[email protected],[email protected]

оба получили письмо

[email protected], [email protected]

оба получили письмо

[email protected], [email protected]

Сначала получил электронное письмо, но не перехватил исключение: Mailbox unavailable. The server response was: 5.7.1 Unable to relay

[email protected], [email protected]

Письма не получены: An invalid character was found in the mail header: ','.

Может ли кто-нибудь пролить свет на это? На самом деле у меня было еще более странное поведение на другом сервере; Я использую Exchange для вышеупомянутых тестов, но на самом деле наблюдал другое поведение на hMailServer, где [email protected],[email protected] приводил к тихому сбою без ошибок сервера и отсутствия исходящей почты в журналах hMailServer. В системе с hMailServer у меня был успех только с одним адресом.


person Zac    schedule 29.08.2013    source источник


Ответы (2)


Это, вероятно, связано с разнообразием реле, к которым вы подключаетесь, и разнообразием методов, которые они принимают. Для каждого конкретного почтового сервера важны не только символы-разделители, но и адреса электронной почты (поскольку разные ретрансляторы будут настроены для приема определенных электронных писем и будут возвращать различные коды ошибок для плохих электронных писем, что, в свою очередь, вызовет множество исключений).

Пространство имен System.Net.Mail имеет объект MailMessage, который содержит объекты MailAddressCollection для To, CC и Bcc, для которых вы можете просто вызвать Add() для каждого получателя.

У меня есть библиотека, которая отправляет почту (без ретрансляции), которая ее использует (все идет в скрытую копию), вы можете проверить код там. Если вам случится использовать библиотеку, убедитесь, что ваш IP-адрес имеет хорошую репутацию, и убедитесь, что все ваши записи DNS настроены так же, как если бы вы были ретранслятором (PTR и A записывают все настройки).

person Thabo    schedule 29.08.2013

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

internal Message(string from, string to) : this()
{
    //...
    this.to = new MailAddressCollection
    {
       to
    }
}

В результате он просто создает новую MailAddressCollection, для которой требуется разделитель comma. . Ни в коем случае строка to никогда не заменяла точку с запятой или не манипулировала ею (если только это не делается в классе Helper, но, похоже, это не так).

person keyboardP    schedule 29.08.2013