Подтвердить что ты не робот

.Net System.Mail.Message добавляет несколько адресов "Кому"

EDIT: этот вопрос бессмыслен, кроме как упражнение в красных сельдях. Проблема оказалась комбинацией моего идиотизма (NO ONE отправлялась по электронной почте, поскольку узел не указывался и был неверным в 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]");

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

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

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

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

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

Если вы используете только string, он заменяет все, что у него было в своем списке. EDIT: другие люди протестировали и не видят этого поведения. Это либо ошибка в моей конкретной версии фреймворка, либо, скорее всего, идиотский маневр.

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

4b9b3361

Ответ 1

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

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

user example.com [email protected]
 user2 example.com [email protected]

И получившееся сообщение электронной почты, пойманное smtp4dev:

Received: from mycomputername (mycomputername [127.0.0.1])
     by localhost (Eric Daugherty 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-сервером не возникает другой проблемы?

Ответ 2

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

Ответ 3

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]"));

Ответ 4

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

С#:

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)

Ответ 5

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

Ответ 7

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

msg.to.Add(<MailAddress> ) добавляет MailAddress в конец коллекции
msg.to.Add(<string> ) добавить список писем в коллекцию

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

Ответ 8

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Mail;
using System.Web;

namespace HMS.HtmlHelper
{
    public class SendmailHelper
    {
        //Created SendEMail method for sendiing mails to users 
        public bool SendEMail(string FromName, string ToAddress, string Subject, string Message)
        {
            bool valid =false;
            try
            {
                string smtpUserName = System.Configuration.ConfigurationManager.AppSettings["smtpusername"].ToString();
                string smtpPassword = System.Configuration.ConfigurationManager.AppSettings["smtppassword"].ToString();
                MailMessage mail = new MailMessage();``
                mail.From = new MailAddress(smtpUserName, FromName);
                mail.Subject = Subject;
                mail.To.Add(FormatMultipleEmailAddresses(ToAddress));
                //mail.To.Add(ToAddress);
                mail.Body = Message.ToString();
                mail.IsBodyHtml = true;
                SmtpClient smtp = new SmtpClient();
                smtp.Port = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["smtpserverport"]);
                smtp.Host = System.Configuration.ConfigurationManager.AppSettings["SmtpServer"]; /
                smtp.Credentials = new System.Net.NetworkCredential(smtpUserName, smtpPassword);
                smtp.EnableSsl = Convert.ToBoolean(System.Configuration.ConfigurationManager.AppSettings["ssl"]); ;
                smtp.Send(mail);
                valid = true;

            }
            catch (Exception ex)
            {
                valid =false ;
            }

            return valid;
        }



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

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

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

    }
}``