¿Enviar correo electrónico a varios destinatarios con MailMessage?

85

Tengo varios destinatarios de correo electrónico almacenados en SQL Server. Cuando hago clic en enviar en la página web, debería enviar un correo electrónico a todos los destinatarios. He separado correos electrónicos usando ;.

A continuación se muestra el código de destinatario único.

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();
Chetan Goenka
fuente
¿Qué has intentado hasta ahora? ¿Tiene esto funcionando para un solo destinatario?
Brendan Green
@BrendanGreen, sí, he trabajado para un solo destinatario.
Chetan Goenka
5
Además, para su información, sus instancias MailMessagey SmtpClientdeben estar en usingbloques.
John Saunders
2
@JohnSaunders Deberían hacerlo, pero definitivamente no es necesario .
Num Lock
1
@JohnSaunders En primer lugar, su redacción es muy engañosa: probablemente discutirá sobre esto, pero "debe estar en usingbloques" no es igual a "debe eliminarse". En segundo lugar, en el código de producción, como las aplicaciones web, generalmente querrá usar de SendAsynctodos modos, lo que funciona según lo previsto sin la necesidad de eliminar la SnmpClientinstancia.
Num Lock

Respuestas:

178

¡Fácil!

Simplemente divida la lista de direcciones entrantes en el ";" carácter y agréguelos al mensaje de correo:

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

En este ejemplo, addressescontiene " [email protected];[email protected]".

Brendan Green
fuente
56
Llego tarde a la fiesta, pero el constructor MailMessage (string from, string to) acepta una lista de direcciones separadas por comas. Entonces, podría haber hecho algo como new MailMessage (fromMail, direcciones.replace (";", ",")) Tal vez no sea mejor usar reemplazar, pero creo que debería comentar esto en caso de que otras personas ya hayan separado por comas ¡instrumentos de cuerda! Entonces no habría necesidad de dividirlo o reemplazarlo.
Areks
@Areks, si puede armar una línea de código de muestra similar a Brendan, definitivamente debería agregar eso como respuesta.
Adam Miller
@Areks gracias por este comentario, ya estaba dividiendo las direcciones hasta que leí tu comentario. ¡esto es exactamente lo que quiero!
Djeroen
¿Es esto necesario? ¿No está simplemente tomando la cadena ya formateada para múltiples direcciones y dividiéndolas, luego reasignándolas? Si envía a To () una cadena como se menciona a To ("a1; a2; a3"), ¿por qué necesita dividirlos y luego asignarlos individualmente? Dado que exceptúa varias direcciones en AddressCollection o una cadena delimitadora.
Casey
82

Como sugirió Adam Miller en los comentarios, agregaré otra solución.

El constructor MailMessage (String from, String to) acepta una lista de direcciones separadas por comas. Entonces, si ya tiene una lista separada por comas (','), el uso es tan simple como:

MailMessage Msg = new MailMessage(fromMail, addresses);

En este caso particular, podemos reemplazar el ';' for ',' y aún hacer uso del constructor.

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

Si prefiere esta o la respuesta aceptada, depende de usted. Podría decirse que el bucle aclara la intención, pero esto es más corto y no oscuro. Pero si ya tiene una lista separada por comas, creo que este es el camino a seguir.

Areks
fuente
2
Dado que causó un problema con una aplicación que administro que implementó esto, debe verificar si el carácter final es un punto y coma y eliminarlo antes de ejecutar el comando de reemplazo. No estoy seguro de si un punto y coma al final se considera una lista de destinatarios válida, pero la gente puede estar acostumbrada a ver un punto y coma al final en aplicaciones como Outlook. No puede tener una coma al final en la lista separada por comas que pasa a MailMessage.
David Jacobsen
1
A mi entender, no debería haber una coma / punto y coma al final si no hay nada después de eso ... Pero definitivamente es un buen comentario para que las personas que lean esto lo sepan. ¡Gracias!
Areks
1
¿Está esto documentado en alguna parte? Los documentos del constructor simplemente describen el toparámetro como "Una cadena que contiene la dirección del destinatario del mensaje de correo electrónico". Quiero usarlo pero no si se puede quitar su soporte.
xr280xr
1
Lamentablemente, el formato parece no estar documentado, pero el constructor afirma que puede ser para más de un destinatario: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx Una cadena que contiene las direcciones de los destinatarios del mensaje de correo electrónico. Es plural tanto para "direcciones" como para "destinatarios".
Areks
1
Definitivamente una característica, pero la documentación es escasa o inexistente. Tuve que pasar por alrededor de 5 llamadas a métodos solo para obtener la primera pista de que es cierto. referenciasource.microsoft.com/#System/net/System/Net/mail/…
Sinjai
1

Según la documentación:

Propiedad MailMessage.To : devuelve MailAddressCollection que contiene la lista de destinatarios de este mensaje de correo electrónico.

Aquí MailAddressCollection tiene un método integrado llamado

   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 (",").     

Por lo tanto, requisito en caso de varios destinatarios: pasar una cadena que contenga direcciones de correo electrónico separadas por comas

En tu caso :

simplemente reemplace todos los; con ,

Msg.To.Add(toEmail.replace(";", ","));

Para referencia :

  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/
Shriram Navaratnalingam
fuente
-4

Probé esto usando el siguiente script de PowerShell y usando (,) entre las direcciones. ¡Funcionó para mí!

$EmailFrom = "<[email protected]>";
$EmailPassword = "<password>";
$EmailTo = "<[email protected]>,<[email protected]>";
$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);
Heitor Marcos
fuente
4
Esa es una pregunta etiquetada C#, no relacionada con PowerShell en absoluto
Jérôme MEVEL
Misma biblioteca al final. Es más fácil probar usando PowerShell en una máquina sin vs. Después de que el script de Powersell funcione, es solo una cuestión de "traducción" al equivalente de C #.
Heitor Marcos
1
Esta pregunta ni siquiera está etiquetada, .NET Frameworksino solo C#. Si todo el mundo estuviera haciendo lo mismo que tú, también tendríamos respuestas VB.NET, F # o incluso C ++ a todas las preguntas relacionadas con .NET Framework. Después de todo, es el mismo Framework, es solo una cuestión de traducción ... ¿Ves mi punto aquí? StackOverflow se convertiría en una fuente de información realmente basura
Jérôme MEVEL