MailMessage ile birden fazla Alıcıya E-posta Gönderilsin mi?


87

SQL Server'da depolanan birden çok e-posta alıcım var. Web sayfasında gönder düğmesine tıkladığımda tüm alıcılara e-posta göndermeli. E-postaları kullanarak ayırdım; .

Tek alıcı kodu aşağıdadır.

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

Şimdiye kadar ne denedin? Bunu tek bir alıcı için çalıştırıyor musunuz?
Brendan Green

@BrendanGreen evet Tek alıcı için çalışıyorum.
Chetan Goenka

5
Ayrıca, bilginize, sizin MailMessageve SmtpClientörneklerinizin usingbloklar halinde olması gerekir .
John Saunders

2
@JohnSaunders Yapmalı, ama kesinlikle gerek yok .
Num Lock

1
@JohnSaunders Her şeyden önce, ifadeniz çok yanıltıcı: Muhtemelen bu konuda tartışacaksınız, ancak " usingbloklar halinde olması gerekir " eşit değildir "atılması gerekir". İkincisi, web uygulamaları gibi üretim kodunda genellikle SendAsyncher halükarda kullanmak isteyeceksiniz , bu da SnmpClientörneği elden çıkarmaya gerek kalmadan amaçlandığı gibi çalışır .
Num Lock

Yanıtlar:


182

Kolay!

Sadece gelen adres listesini ";" karakter girin ve bunları posta mesajına ekleyin:

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

Bu örnekte, addresses" address1@example.com;address2@example.com" içerir .


56
Partiye geç kaldım ancak MailMessage (string from, string to) kurucusu virgülle ayrılmış adresler listesini kabul ediyor. Yani, yeni MailMessage gibi bir şey yapmış olabilirsiniz (fromMail, adresler.replace (";", ",") Belki de değiştirmeyi kullanmak daha iyi değildir, ancak diğer insanların virgülle ayrılmış olması durumunda bunu yorumlamam gerektiğini düşünüyorum. Teller! O zaman bölmeye veya değiştirmeye gerek kalmaz.
Areks

@Areks, Brendan'a benzer bir örnek kod satırı bir araya getirebiliyorsanız, bunu kesinlikle bir cevap olarak eklemelisiniz.
Adam Miller

@Areks bu yorum için teşekkürler, yorumunuzu okuyana kadar zaten adresleri bölüyordum. bu tam olarak istediğim şey!
Djeroen

Bu gerekli mi? Birden fazla adres için zaten biçimlendirilmiş dizeyi alıp onları bölmek ve sonra yeniden atamak değil misiniz? Kime () 'ye belirtildiği gibi bir dizi gönderirseniz ("a1; a2; a3") neden onları bölmeniz ve ardından ayrı ayrı atamanız gerekir? AddressCollection veya bir sınırlayıcı dizede birden çok Adresi hariç tuttuğu için.
Casey

85

Adam Miller'ın yorumlarda önerdiği gibi, başka bir çözüm ekleyeceğim.

MailMessage (String from, String to) yapıcısı, virgülle ayrılmış bir adres listesi kabul eder. Dolayısıyla, zaten virgülle (',') ayrılmış bir listeniz varsa, kullanım şu kadar basittir:

MailMessage Msg = new MailMessage(fromMail, addresses);

Bu özel durumda, ';' için ',' ve yine de yapıcıyı kullanıyor.

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

Bunu ya da kabul edilen cevabı tercih edip etmemek size kalmış. Muhtemelen döngü, amacı netleştirir, ancak bu daha kısadır ve belirsiz değildir. Ama zaten virgülle ayrılmış bir listeniz varsa, bence gidilecek yol bu.


2
Bunu uygulayan yönettiğim bir uygulamada soruna neden olduğundan, sondaki karakterin noktalı virgül olup olmadığını kontrol etmeli ve değiştirme komutunu çalıştırmadan önce bunu kaldırmalısınız. Sondaki noktalı virgülün geçerli bir alıcı listesi olarak kabul edilip edilmediğinden emin değilim, ancak insanlar Outlook gibi uygulamalar aracılığıyla sonda noktalı virgül görmeye alışkın olabilir. MailMessage'a ilettiğiniz virgülle ayrılmış listede sonda virgül olamaz.
David Jacobsen

1
Anladığım kadarıyla, ondan sonra bir şey yoksa, virgül / noktalı virgül olmamalıdır ... Ama kesinlikle iyi bir yorum, böylece bunu okuyan insanlar bunun farkında olsun. Teşekkür ederim!
Areks

1
Bu bir yerde belgelendi mi? Yapıcı dokümanlar sadece toparamı "E-posta mesajının alıcısının adresini içeren bir Dize" olarak tanımlar . Kullanmak istiyorum ama desteği kaldırılabilirse değil.
xr280xr

1
Biçim ne yazık ki belgelenmemiş gibi görünüyor, ancak kurucu birden fazla alıcı için olabileceğini belirtiyor: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx Adresleri içeren bir dize e-posta mesajının alıcılarından. Hem "adresler" hem de "alıcılar" için çoğuldur.
Areks

1
Kesinlikle bir özellik, ancak dokümantasyon ya seyrek ya da yok. Doğru olduğuna dair ilk ipucunu almak için yaklaşık 5 yöntem çağrısından geçmek zorunda kaldım. reference.microsoft.com/#System/net/System/Net/mail/…
Sinjai

1

Belgelere göre:

MailMessage.To özelliği - MailAddressCollection döndürür Bu e-posta iletisinin alıcılarının listesini içeren

Burada MailAddressCollection adlı yerleşik bir yöntem vardır.

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

Bu nedenle, birden fazla alıcı olması durumunda gereklilik: Virgülle ayrılmış e-posta adreslerini içeren bir dize geçirin

Senin durumunda :

basitçe hepsini değiştirin; ile ,

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

Referans için :

  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

Bunu aşağıdaki powershell betiğini kullanarak ve adresler arasında (,) kullanarak test ettim. Benim için çalıştı!

$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
Bu C#, PowerShell ile hiç ilgili olmayan etiketli bir soru
Jérôme MEVEL

Sonunda aynı kütüphane. Powerershell'i vs. olmayan bir makinede kullanarak test etmek çok daha kolay powersell betiğini çalıştırdıktan sonra, c # eşdeğerine bir "çeviri" meselesidir.
Heitor Marcos

1
Bu soru etiketlenmemiş bile, .NET Frameworksadece C#. Herkes sizinle aynı şeyi yapıyor olsaydı, ilgili tüm sorulara VB.NET, F # veya hatta C ++ cevapları da olurdu .NET Framework. Sonuçta aynı Çerçeve, bu sadece bir çeviri meselesi ... Burada benim açımdan anlıyor musunuz? StackOverflow gerçekten çöp bir bilgi kaynağı olacaktı
Jérôme MEVEL
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.