ส่งอีเมลไปยังผู้รับหลายคนด้วย MailMessage?


87

ฉันมีผู้รับอีเมลหลายคนที่เก็บไว้ใน SQL Server เมื่อฉันคลิกส่งในหน้าเว็บควรส่งอีเมลถึงผู้รับทุกคน ฉันได้แยกอีเมลโดยใช้;ไฟล์.

ต่อไปนี้เป็นรหัสผู้รับรายเดียว

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

คุณพยายามทำอะไรจนถึงตอนนี้? คุณทำงานให้กับผู้รับรายเดียวหรือไม่
Brendan Green

@BrendanGreen ใช่ฉันทำงานให้กับผู้รับคนเดียว
Chetan Goenka

5
นอกจากนี้ FYI ของคุณMailMessageและSmtpClientอินสแตนซ์ต้องอยู่ในusingบล็อก
John Saunders

2
@JohnSaunders พวกเขาควร แต่แน่นอนไม่จำเป็นต้อง
Num Lock

1
@JohnSaunders ก่อนอื่นคำพูดของคุณทำให้เข้าใจผิดมาก: คุณอาจจะเถียงเรื่องนี้ แต่ "ต้องอยู่ในusingบล็อค" ไม่เท่ากับ "ต้องทิ้ง" ประการที่สองในโค้ดการใช้งานจริงเช่นเว็บแอปพลิเคชันคุณมักจะต้องการใช้ต่อไปSendAsyncซึ่งทำงานได้ตามที่ตั้งใจไว้โดยไม่จำเป็นต้องทิ้งSnmpClientอินสแตนซ์
Num Lock

คำตอบ:


182

ง่าย!

เพียงแค่แยกรายการที่อยู่ขาเข้าบน ";" อักขระและเพิ่มลงในข้อความเมล:

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

ในตัวอย่างaddressesนี้ประกอบด้วย " address1@example.com;address2@example.com"


56
ฉันไปงานปาร์ตี้สาย แต่ตัวสร้าง MailMessage (สตริงจากสตริงถึง) ยอมรับรายการที่อยู่ที่คั่นด้วยเครื่องหมายจุลภาค ดังนั้นคุณสามารถทำบางอย่างเช่น MailMessage ใหม่ (fromMail, address.replace (";", ",")) อาจจะไม่ดีกว่าที่จะใช้การแทนที่ แต่ฉันรู้สึกว่าฉันควรแสดงความคิดเห็นนี้ในกรณีที่คนอื่นคั่นด้วยเครื่องหมายจุลภาคแล้ว สตริง! จากนั้นจะไม่จำเป็นต้องแยกหรือเปลี่ยน
Areks

@Areks ถ้าคุณสามารถรวบรวมโค้ดตัวอย่างที่คล้ายกับ Brendan ได้คุณควรเพิ่มเป็นคำตอบอย่างแน่นอน
Adam Miller

@ ขอบคุณสำหรับความคิดเห็นนี้ฉันได้แยกที่อยู่ทั้งหมดแล้วจนกว่าฉันจะอ่านความคิดเห็นของคุณ นี่คือสิ่งที่ฉันต้องการ!
Djeroen

สิ่งนี้จำเป็นหรือไม่? คุณไม่เพียงแค่จัดรูปแบบสตริงสำหรับที่อยู่หลายรายการแล้วแยกออกจากกันแล้วกำหนดใหม่ หากคุณส่ง To () สตริงตามที่กล่าวถึง To ("a1; a2; a3") ทำไมคุณต้องแยกออกจากกันแล้วกำหนดทีละรายการ เนื่องจากยกเว้นที่อยู่หลายรายการใน AddressCollection หรือสตริงตัวคั่น
Casey

85

ตามที่ Adam Miller แนะนำในความคิดเห็นฉันจะเพิ่มวิธีแก้ปัญหาอื่น

ตัวสร้าง MailMessage (String from, String to) ยอมรับรายการแอดเดรสที่คั่นด้วยเครื่องหมายจุลภาค ดังนั้นหากคุณมีรายการที่คั่นด้วยเครื่องหมายจุลภาค (',') อยู่แล้วการใช้งานจะง่ายดังนี้:

MailMessage Msg = new MailMessage(fromMail, addresses);

ในกรณีนี้เราสามารถแทนที่ ';' สำหรับ ',' และยังคงใช้ประโยชน์จากตัวสร้าง

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

ไม่ว่าคุณจะชอบสิ่งนี้หรือคำตอบที่ยอมรับก็ขึ้นอยู่กับคุณ การวนซ้ำทำให้เจตนาชัดเจนขึ้น แต่สั้นกว่าและไม่คลุมเครือ แต่ถ้าคุณมีรายการที่คั่นด้วยจุลภาคอยู่แล้วฉันคิดว่านี่คือวิธีที่จะไป


2
เนื่องจากมันทำให้เกิดปัญหากับแอปพลิเคชันที่ฉันจัดการที่ใช้สิ่งนี้คุณควรตรวจสอบว่าอักขระต่อท้ายเป็นเซมิโคลอนหรือไม่และลบออกก่อนที่จะรันคำสั่งแทนที่ ฉันไม่แน่ใจว่าอัฒภาคต่อท้ายถือเป็นรายชื่อผู้รับที่ถูกต้องหรือไม่ แต่ผู้คนอาจคุ้นเคยกับการดูอัฒภาคต่อท้ายผ่านแอปพลิเคชันเช่น Outlook คุณไม่สามารถมีเครื่องหมายจุลภาคต่อท้ายในรายการที่คั่นด้วยจุลภาคที่คุณส่งไปยัง MailMessage
David Jacobsen

1
ตามความเข้าใจของฉันไม่ควรมีเครื่องหมายจุลภาค / อัฒภาคต่อท้ายหากไม่มีอะไรหลังจากนั้น ... แต่เป็นความคิดเห็นที่ดีอย่างแน่นอนเพื่อให้คนที่อ่านสิ่งนี้รับรู้ ขอขอบคุณ!
Areks

1
เอกสารนี้อยู่ที่ไหน เอกสารตัวสร้างเพียงอธิบายtoพารามิเตอร์ว่า "สตริงที่มีที่อยู่ของผู้รับข้อความอีเมล" ฉันต้องการใช้ แต่ไม่สามารถลบการสนับสนุนได้หรือไม่
xr280xr

1
ดูเหมือนว่ารูปแบบจะไม่ได้รับการจัดทำเป็นเอกสาร แต่ตัวสร้างระบุว่าสามารถเป็นได้สำหรับผู้รับมากกว่าหนึ่งคน: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx สตริงที่มีที่อยู่ ของผู้รับข้อความอีเมล เป็นพหูพจน์ของทั้ง "ที่อยู่" และ "ผู้รับ"
Areks

1
เป็นคุณลักษณะที่แน่นอน แต่เอกสารประกอบมีทั้งแบบกระจัดกระจายหรือไม่มีอยู่ ฉันต้องผ่านการเรียกประมาณ 5 วิธีเพื่อให้ได้คำใบ้แรกว่าเป็นจริง referencesource.microsoft.com/#System/net/System/Net/mail/…
สินจัย

1

ตามเอกสาร:

คุณสมบัติMailMessage To - ส่งกลับMailAddressCollectionที่มีรายชื่อผู้รับข้อความอีเมลนี้

ที่นี่MailAddressCollectionมีวิธีการสร้างที่เรียกว่า

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

ดังนั้นข้อกำหนดในกรณีที่มีผู้รับหลายคน: ส่งสตริงที่มีที่อยู่อีเมลคั่นด้วยลูกน้ำ

ในกรณีของคุณ:

เพียงแค่แทนที่; ด้วย

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

สำหรับการอ้างอิง:

  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

ฉันได้ทดสอบสิ่งนี้โดยใช้สคริปต์ powershell ต่อไปนี้และใช้ (,) ระหว่างที่อยู่ มันได้ผลสำหรับฉัน!

$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
นั่นเป็นคำถามที่แท็กC#ไม่เกี่ยวข้องกับ PowerShell เลย
Jérôme MEVEL

ไลบรารีเดียวกันในตอนท้าย มันง่ายกว่าที่จะทดสอบโดยใช้ powershell บนเครื่องโดยไม่เทียบกับหลังจากที่คุณได้รับสคริปต์ powersell ที่ใช้งานได้มันเป็นเพียงเรื่องของ "การแปล" ที่เทียบเท่ากับ c #
Heitor Marcos

1
คำถามนี้ไม่ได้ติดแท็กแม้แต่เพียง.NET Framework C#ถ้าทุกคนทำเช่นเดียวกับคุณเราก็จะมี VB.NET, F # หรือแม้กระทั่ง C ++ .NET Frameworkคำตอบสำหรับคำถามทั้งหมดที่เกี่ยวข้องกับ ท้ายที่สุดมันก็คือ Framework เดียวกันมันก็แค่เรื่องของการแปล ... คุณเห็นประเด็นของฉันที่นี่? StackOverflow จะกลายเป็นแหล่งข้อมูลที่เป็นขยะจริงๆ
Jérôme MEVEL
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.