E-Mail mit MailMessage an mehrere Empfänger senden?

85

Ich habe mehrere E-Mail-Empfänger in SQL Server gespeichert. Wenn ich auf der Webseite auf Senden klicke, sollte eine E-Mail an alle Empfänger gesendet werden. Ich habe E-Mails mit getrennt ;.

Es folgt der Code für einen einzelnen Empfänger.

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
quelle
Was hast du bisher versucht? Funktioniert dies für einen einzelnen Empfänger?
Brendan Green
@BrendanGreen Ja, ich arbeite für einen einzelnen Empfänger.
Chetan Goenka
5
Außerdem müssen sich Ihre MailMessageund Ihre SmtpClientInstanzen in usingBlöcken befinden.
John Saunders
1
@JohnSaunders Sie sollten aber auf jeden Fall nicht müssen .
Num Lock
1
@JohnSaunders Zunächst einmal ist Ihre Formulierung sehr irreführend: Sie werden wahrscheinlich darüber streiten, aber "muss in usingBlöcken sein" ist nicht gleich "muss entsorgt werden". Zweitens möchten Sie in Produktionscode wie Webanwendungen normalerweise SendAsyncsowieso verwenden, was wie beabsichtigt funktioniert, ohne dass die SnmpClientInstanz entsorgt werden muss.
Num Lock

Antworten:

175

Einfach!

Teilen Sie einfach die eingehende Adressliste auf das ";" Zeichen, und fügen Sie sie der E-Mail-Nachricht:

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

In diesem Beispiel addressesenthält " [email protected];[email protected]".

Brendan Green
quelle
56
Ich bin zu spät zur Party, aber der MailMessage-Konstruktor (Zeichenfolge von, Zeichenfolge bis) akzeptiert eine durch Kommas getrennte Liste von Adressen. Sie hätten also so etwas wie eine neue MailMessage (fromMail, address.replace (";", ",")) ausführen können. Vielleicht ist es nicht besser, replace zu verwenden, aber ich denke, ich sollte dies kommentieren, falls andere Personen bereits durch Kommas getrennt sind Saiten! Dann wäre keine Aufteilung oder Ersetzung erforderlich.
Areks
@Areks, wenn Sie eine Zeile mit Beispielcode zusammenstellen können, die Brendan ähnelt, sollten Sie dies auf jeden Fall als Antwort hinzufügen.
Adam Miller
@Areks danke für diesen Kommentar, ich habe die Adressen bereits aufgeteilt, bis ich Ihren Kommentar gelesen habe. das ist genau was ich will!
Djeroen
Ist das notwendig? Nehmen Sie nicht einfach die bereits für mehrere Adressen formatierte Zeichenfolge, teilen Sie sie auf und weisen Sie sie dann neu zu? Wenn Sie To () eine Zeichenfolge wie erwähnt To ("a1; a2; a3") senden, warum müssen Sie sie dann teilen und dann einzeln zuweisen? Da es mehrere Adressen in AddressCollection oder eine Trennzeichenfolge ausnimmt.
Casey
82

Wie von Adam Miller in den Kommentaren vorgeschlagen, werde ich eine weitere Lösung hinzufügen.

Der MailMessage-Konstruktor (String from, String to) akzeptiert eine durch Kommas getrennte Liste von Adressen. Wenn Sie also bereits eine durch Kommas (',') getrennte Liste haben, ist die Verwendung so einfach wie:

MailMessage Msg = new MailMessage(fromMail, addresses);

In diesem speziellen Fall können wir das ';' für ',' und verwenden Sie trotzdem den Konstruktor.

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

Ob Sie dies oder die akzeptierte Antwort bevorzugen, liegt bei Ihnen. Die Schleife macht die Absicht wohl klarer, aber dies ist kürzer und nicht dunkel. Aber sollten Sie bereits eine durch Kommas getrennte Liste haben, denke ich, ist dies der richtige Weg.

Areks
quelle
2
Da dies zu einem Problem mit einer von mir verwalteten Anwendung geführt hat, die dies implementiert hat, sollten Sie überprüfen, ob das nachfolgende Zeichen ein Semikolon ist, und dieses entfernen, bevor Sie den Befehl replace ausführen. Ich bin nicht sicher, ob ein nachfolgendes Semikolon als gültige Empfängerliste angesehen wird, aber Menschen können es gewohnt sein, ein nachfolgendes Semikolon in Anwendungen wie Outlook zu sehen. In der durch Kommas getrennten Liste, die Sie an MailMessage übergeben, darf kein durchgehendes Komma stehen.
David Jacobsen
1
Nach meinem Verständnis sollte es kein nachfolgendes Komma / Semikolon geben, wenn danach nichts mehr folgt ... Aber definitiv ein guter Kommentar, damit die Leute, die dies lesen, sich dessen bewusst sind. Danke dir!
Areks
1
Ist das irgendwo dokumentiert? Die Konstruktor-Dokumente beschreiben den toParameter lediglich als "Eine Zeichenfolge, die die Adresse des Empfängers der E-Mail-Nachricht enthält". Ich möchte es verwenden, aber nicht, wenn seine Unterstützung entfernt werden kann.
xr280xr
1
Das Format scheint leider nicht dokumentiert zu sein, aber der Konstruktor gibt an, dass es für mehr als einen Empfänger gelten kann: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx Ein String, der die Adressen enthält der Empfänger der E-Mail-Nachricht. Es ist Plural für "Adressen" und "Empfänger".
Areks
1
Auf jeden Fall eine Funktion, aber die Dokumentation ist entweder spärlich oder nicht vorhanden. Ich musste ungefähr 5 Methodenaufrufe durchlaufen, um den ersten Hinweis zu erhalten, dass es wahr ist. referencesource.microsoft.com/#System/net/System/Net/mail/…
Sinjai
1

Laut Dokumentation:

MailMessage.To- Eigenschaft - Gibt MailAddressCollection zurück , die die Liste der Empfänger dieser E-Mail-Nachricht enthält

Hier hat MailAddressCollection eine eingebaute Methode namens

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

Daher Anforderung bei mehreren Empfängern: Übergeben Sie eine Zeichenfolge, die durch Komma getrennte E-Mail-Adressen enthält

In deinem Fall :

Ersetzen Sie einfach alle; mit,

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

Als Referenz :

  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
quelle
-4

Ich habe dies mit dem folgenden Powershell-Skript und mit (,) zwischen den Adressen getestet. Es hat bei mir funktioniert!

$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
quelle
4
Das ist eine Frage mit dem Tag C#, die überhaupt nichts mit PowerShell zu
tun hat
Gleiche Bibliothek am Ende. Es ist nur einfacher, Powershell auf einem Computer ohne vs. zu testen. Nachdem Sie das Powersell-Skript zum Laufen gebracht haben, ist es nur eine Frage der "Übersetzung" in das c # -Äquivalent.
Heitor Marcos
1
Diese Frage ist nicht einmal markiert, .NET Frameworksondern nur C#. Wenn alle das Gleiche tun würden wie Sie, hätten wir auch VB.NET-, F # - oder sogar C ++ - Antworten auf alle Fragen im Zusammenhang mit .NET Framework. Immerhin ist es das gleiche Framework, es ist nur eine Frage der Übersetzung ... Sie sehen meinen Standpunkt hier? StackOverflow würde zu einer
echten Müllquelle