Inviare e-mail a più destinatari con MailMessage?


87

Ho più destinatari di posta elettronica archiviati in SQL Server. Quando faccio clic su Invia nella pagina Web, dovrebbe inviare un'e-mail a tutti i destinatari. Ho separato le email usando ;.

Di seguito è riportato il codice del singolo destinatario.

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();

Cosa hai provato finora? Hai questo lavoro per un singolo destinatario?
Brendan Green

@BrendanGreen sì, lavoro per un unico destinatario.
Chetan Goenka

5
Inoltre, per tua informazione, le tue MailMessagee le SmtpClientistanze devono essere in usingblocchi.
John Saunders

2
@ JohnSaunders Dovrebbero, ma sicuramente non è necessario .
Num Lock

1
@JohnSaunders Prima di tutto, la tua formulazione è molto fuorviante: probabilmente ne discuterete, ma "deve essere in usingblocchi" non è uguale a "deve essere smaltito". In secondo luogo, nel codice di produzione come le applicazioni Web che di solito si desidera utilizzare SendAsynccomunque, il che funziona come previsto senza la necessità di eliminare l' SnmpClientistanza.
Num Lock

Risposte:


182

Facile!

Basta dividere l'elenco degli indirizzi in entrata su ";" carattere e aggiungili al messaggio di posta:

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

In questo esempio, addressescontiene " address1@example.com;address2@example.com".


56
Sono in ritardo per la festa ma il costruttore MailMessage (stringa da, stringa a) accetta un elenco di indirizzi separati da virgole. Quindi, avresti potuto fare qualcosa come new MailMessage (fromMail, address.replace (";", ",")) Forse non è meglio usare replace, ma mi sento come se dovessi commentarlo nel caso in cui altre persone siano già separate da virgole stringhe! Quindi non sarebbe necessario dividere o sostituire.
Areks

@Areks, se riesci a mettere insieme una riga di codice di esempio simile a Brendan, dovresti assolutamente aggiungerla come risposta.
Adam Miller

@Areks grazie per questo commento, stavo già dividendo gli indirizzi finché non ho letto il tuo commento. questo è esattamente quello che voglio!
Djeroen

È necessario? Non stai solo prendendo la stringa già formattata per più indirizzi e suddividendoli, quindi riassegnandoli? Se si invia a To () una stringa come indicato a To ("a1; a2; a3") perché è necessario dividerli e quindi assegnarli singolarmente? Poiché esclude più indirizzi in AddressCollection o una stringa deliminatore.
Casey

85

Come suggerito da Adam Miller nei commenti, aggiungerò un'altra soluzione.

Il costruttore MailMessage (String from, String to) accetta un elenco di indirizzi separati da virgole. Quindi, se ti capita di avere già un elenco separato da virgole (','), l'utilizzo è semplice come:

MailMessage Msg = new MailMessage(fromMail, addresses);

In questo caso particolare, possiamo sostituire il carattere ";" per "," e continuare a utilizzare il costruttore.

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

Se preferisci questa o la risposta accettata, dipende da te. Probabilmente il ciclo rende più chiaro l'intento, ma questo è più breve e non oscuro. Ma se hai già un elenco separato da virgole, penso che questa sia la strada da percorrere.


2
Poiché ha causato un problema con un'applicazione che gestisco che lo implementa, dovresti controllare se il carattere finale è un punto e virgola e rimuoverlo prima di eseguire il comando di sostituzione. Non sono sicuro che un punto e virgola finale sia considerato un elenco di destinatari valido, ma le persone potrebbero essere abituate a vedere un punto e virgola finale attraverso applicazioni come Outlook. Non puoi avere una virgola finale nell'elenco separato da virgole che passi a MailMessage.
David Jacobsen

1
Per quanto ne so, non dovrebbe esserci una virgola / punto e virgola finale se non c'è niente dopo ... Ma sicuramente un buon commento in modo che le persone che leggono questo ne siano consapevoli. Grazie!
Areks

1
È documentato da qualche parte? I documenti del costruttore descrivono semplicemente il toparametro come "Una stringa che contiene l'indirizzo del destinatario del messaggio di posta elettronica". Voglio usarlo ma non se il suo supporto può essere rimosso.
xr280xr

1
Il formato purtroppo sembra non essere documentato ma il costruttore afferma che può essere per più di un destinatario: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx Una stringa che contiene gli indirizzi dei destinatari del messaggio di posta elettronica. È plurale sia per "indirizzi" che per "destinatari".
Areks

1
Sicuramente una caratteristica, ma la documentazione è scarsa o inesistente. Ho dovuto eseguire circa 5 chiamate al metodo solo per ottenere il primo suggerimento che fosse vero. Referencesource.microsoft.com/#System/net/System/Net/mail/…
Sinjai

1

Secondo la documentazione:

Proprietà MailMessage.To : restituisce MailAddressCollection che contiene l'elenco dei destinatari di questo messaggio di posta elettronica

Qui MailAddressCollection ha un metodo integrato chiamato

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

Pertanto requisito in caso di più destinatari: passare una stringa che contenga indirizzi email separati da virgola

Nel tuo caso :

è sufficiente sostituire tutti i file; con ,

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

Per riferimento :

  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/

-4

L'ho testato utilizzando il seguente script PowerShell e utilizzando (,) tra gli indirizzi. Ha funzionato per me!

$EmailFrom = "<from@any.com>";
$EmailPassword = "<password>";
$EmailTo = "<to1@any.com>,<to2@any.com>";
$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);

4
Questa è una domanda etichettata C#, non correlata affatto a PowerShell
Jérôme MEVEL

Stessa libreria alla fine. È semplicemente più facile testare utilizzando PowerShell su una macchina senza vs. Dopo aver fatto funzionare lo script powersell, è solo questione di "traduzione" nell'equivalente c #.
Heitor Marcos

1
Questa domanda non è nemmeno etichettata .NET Frameworkma solo C#. Se tutti facessero lo stesso di te, avremmo anche risposte VB.NET, F # o persino C ++ a tutte le domande relative a .NET Framework. Dopotutto è lo stesso Framework, è solo una questione di traduzione ... Capisci il mio punto qui? StackOverflow diventerebbe una fonte di informazioni davvero spazzatura
Jérôme MEVEL
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.