.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, я все равно спрошу его. Возможно, у кого-то даже есть представление о других ловушках, в которые вы можете попасть.
Ответы
Ответ 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, чтобы получить то, что вы хотите.
Ответ 6
Вставьте адреса этого кода:
objMessage.To.Add(***addresses:=***"[email protected] , [email protected] , [email protected]")
Ответ 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);
}
}
}``