Gửi Email cho nhiều người nhận bằng MailMessage?


85

Tôi có nhiều người nhận email được lưu trữ trong SQL Server. Khi tôi nhấp vào gửi trong trang web, nó sẽ gửi email đến tất cả người nhận. Tôi đã tách các email bằng cách sử dụng ;.

Sau đây là mã người nhận duy nhất.

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

Những gì bạn đã cố gắng cho đến nay? Bạn có cái này làm việc cho một người nhận không?
Brendan Green

@BrendanGreen vâng, tôi đang làm việc cho Người nhận duy nhất.
Chetan Goenka

5
Ngoài ra, FYI, của bạn MailMessagevà các SmtpClientphiên bản cần phải nằm trong usingkhối.
John Saunders

2
@JohnSaunders Họ nên, nhưng chắc chắn là không cần .
Num Lock

1
@JohnSaunders Trước hết, từ ngữ của bạn rất dễ gây hiểu lầm: Bạn có thể sẽ tranh luận về điều này, nhưng "cần phải ở trong usingcác khối" không bằng "cần phải được xử lý". Thứ hai, trong mã sản xuất như các ứng dụng web, bạn thường sẽ muốn sử dụng bất kỳ cách nào SendAsync, hoạt động như dự định mà không cần phải loại bỏ SnmpClientphiên bản.
Num Lock

Câu trả lời:


178

Dễ dàng!

Chỉ cần tách danh sách địa chỉ đến trên dấu ";" và thêm chúng vào thư:

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

Trong ví dụ này, addresseschứa " address1@example.com;address2@example.com".


56
Tôi đến muộn nhưng phương thức khởi tạo MailMessage (string from, string to) chấp nhận danh sách địa chỉ được phân tách bằng dấu phẩy. Vì vậy, bạn có thể đã làm một cái gì đó như MailMessage mới (fromMail, address.replace (";", ",")) Có thể không tốt hơn nếu sử dụng thay thế, nhưng tôi cảm thấy tôi nên nhận xét điều này trong trường hợp người khác đã phân tách bằng dấu phẩy dây! Sau đó sẽ không cần phải tách hoặc thay thế.
Areks

@Areks, nếu bạn có thể tập hợp một dòng mã mẫu tương tự như Brendan, bạn chắc chắn nên thêm nó làm câu trả lời.
Adam Miller

@Areks cảm ơn vì nhận xét này, tôi đã chia nhỏ các địa chỉ cho đến khi tôi đọc bình luận của bạn. đây chính xác là những gì tôi muốn!
Djeroen

Điều này có cần thiết không? Bạn không chỉ lấy chuỗi đã được định dạng cho nhiều địa chỉ và chia nhỏ chúng, sau đó gán lại chúng? Nếu bạn gửi Tới () một chuỗi như đã đề cập Đến ("a1; a2; a3") tại sao bạn cần phải chia chúng và sau đó gán riêng lẻ? Vì nó loại trừ nhiều Địa chỉ trong AddressCollection hoặc một chuỗi dấu phân cách.
Casey

82

Theo gợi ý của Adam Miller trong phần bình luận, tôi sẽ thêm một giải pháp khác.

Phương thức khởi tạo MailMessage (String from, String to) chấp nhận một danh sách địa chỉ được phân tách bằng dấu phẩy. Vì vậy, nếu bạn đã có một danh sách được phân tách bằng dấu phẩy (','), thì cách sử dụng đơn giản như sau:

MailMessage Msg = new MailMessage(fromMail, addresses);

Trong trường hợp cụ thể này, chúng ta có thể thay thế dấu ';' cho ',' và vẫn sử dụng hàm tạo.

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

Cho dù bạn thích điều này hay câu trả lời được chấp nhận là tùy thuộc vào bạn. Có thể cho rằng vòng lặp làm cho ý định rõ ràng hơn, nhưng điều này ngắn hơn và không tối nghĩa. Nhưng nếu bạn đã có một danh sách được phân tách bằng dấu phẩy, tôi nghĩ đây là cách để đi.


2
Vì nó gây ra sự cố với ứng dụng mà tôi quản lý đã triển khai điều này, bạn nên kiểm tra xem ký tự ở cuối có phải là dấu chấm phẩy hay không và xóa ký tự đó trước khi chạy lệnh thay thế. Tôi không chắc liệu dấu chấm phẩy ở cuối có được coi là danh sách người nhận hợp lệ hay không, nhưng mọi người có thể quen nhìn thấy dấu chấm phẩy ở cuối thông qua các ứng dụng như Outlook. Bạn không thể có dấu phẩy ở cuối trong danh sách được phân tách bằng dấu phẩy mà bạn chuyển đến MailMessage.
David Jacobsen

1
Theo hiểu biết của tôi, không nên có dấu phẩy / dấu chấm phẩy ở cuối nếu không có gì sau đó ... Nhưng chắc chắn là một nhận xét tốt để mọi người đọc bài này biết về nó. Cảm ơn bạn!
Areks

1
Điều này có được ghi ở đâu đó không? Các tài liệu của phương thức khởi tạo chỉ mô tả totham số là "Một chuỗi chứa địa chỉ của người nhận thư e-mail". Tôi muốn sử dụng nó nhưng không được nếu hỗ trợ của nó có thể bị xóa.
xr280xr

1
Đáng buồn là định dạng dường như không được ghi lại nhưng phương thức khởi tạo cho biết nó có thể dành cho nhiều người nhận: msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx Một Chuỗi chứa các địa chỉ của những người nhận e-mail. Nó là số nhiều cho cả "địa chỉ" và "người nhận".
Areks

1
Chắc chắn là một tính năng, nhưng tài liệu thì ít hoặc không tồn tại. Tôi đã phải trải qua khoảng 5 lần gọi phương thức chỉ để nhận được gợi ý đầu tiên rằng đó là sự thật. referencesource.microsoft.com/#System/net/System/Net/mail/...
Sinjai

1

Theo Tài liệu:

Thuộc tính MailMessage.To - Trả về MailAddressCollection có chứa danh sách những người nhận email này

Ở đây MailAddressCollection có một phương thức tích hợp được gọi là

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

Do đó, yêu cầu trong trường hợp có nhiều người nhận: Chuyển một chuỗi chứa các địa chỉ email được phân tách bằng dấu phẩy

Trong trường hợp của bạn :

chỉ cần thay thế tất cả các; với ,

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

Để tham khảo :

  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

Tôi đã kiểm tra điều này bằng cách sử dụng tập lệnh powershell sau và sử dụng (,) giữa các địa chỉ. Nó đã làm việc cho tôi!

$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
Đó là một câu hỏi được gắn thẻ C#, không liên quan đến PowerShell ở tất cả
Jérôme MEVEL

Cuối cùng thì cùng một thư viện. Việc kiểm tra bằng cách sử dụng powershell trên máy không có so với sau khi bạn nhận được tập lệnh powersell hoạt động dễ dàng hơn, nó chỉ là vấn đề "dịch" sang tương đương c #.
Heitor Marcos

1
Câu hỏi này thậm chí không được gắn thẻ .NET Frameworknhưng chỉ C#. Nếu mọi người cũng làm như bạn, chúng tôi cũng sẽ có câu trả lời VB.NET, F # hoặc thậm chí C ++ cho tất cả các câu hỏi liên quan đến .NET Framework. Xét cho cùng thì đó là cùng một Framework, chỉ là vấn đề dịch thuật ... Bạn thấy ý tôi ở đây chứ? StackOverflow sẽ trở thành một nguồn thông tin thực sự rác rưởi
Jérôme MEVEL
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.