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 2014 년

5
또한 FYI, 귀하 MailMessageSmtpClient인스턴스는 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 (string from, string to) 생성자는 쉼표로 구분 된 주소 목록을 허용합니다. 따라서 new MailMessage (fromMail, addresses.replace ( ";", ","))와 같은 작업을 수행 할 수있었습니다. 대체를 사용하는 것이 낫지 않을 수도 있지만 다른 사람들이 이미 쉼표로 구분 된 경우에 대해 주석을 추가해야한다고 생각합니다. 문자열! 그러면 분할하거나 교체 할 필요가 없습니다.
Areks 2015-04-13

@Areks, Brendan과 유사한 샘플 코드 줄을 모을 수 있다면 반드시 답으로 추가해야합니다.
Adam Miller

@Areks이 의견을 주셔서 감사합니다. 귀하의 의견을 읽을 때까지 주소를 분할했습니다. 이것이 바로 내가 원하는 것입니다!
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
이를 구현 한 내가 관리하는 응용 프로그램에 문제가 발생했기 때문에 후행 문자가 세미콜론인지 확인하고 replace 명령을 실행하기 전에 제거해야합니다. 후행 세미콜론이 유효한 수신자 목록으로 간주되는지 확실하지 않지만 사람들은 Outlook과 같은 응용 프로그램을 통해 후행 세미콜론을 보는 데 익숙 할 수 있습니다. MailMessage에 전달하는 쉼표로 구분 된 목록에는 후행 쉼표를 사용할 수 없습니다.
David Jacobsen

1
내 이해에 따르면 그 뒤에 아무것도 없으면 후행 쉼표 / ​​세미콜론이 있어서는 안됩니다.하지만 확실히 좋은 댓글이므로이 글을 읽는 사람들이 그것에 대해 알고 있습니다. 감사합니다!
Areks

1
어딘가에 문서화되어 있습니까? 생성자 문서는 to매개 변수를 "이메일 메시지 수신자의 주소를 포함하는 문자열"로 설명합니다 . 나는 그것을 사용하고 싶지만 그 지원이 제거 될 수 있다면 아닙니다.
xr280xr

1
안타깝게도 형식이 문서화되지 않은 것처럼 보이지만 생성자는 두 명 이상의 수신자를 대상으로 할 수 있다고 명시합니다. msdn.microsoft.com/en-us/library/14k9fb7t(v=vs.110).aspx 주소가 포함 된 문자열 전자 메일 메시지의 수신자 "주소"와 "수신자"모두 복수형입니다.
Areks 2015-10-29

1
확실히 기능이지만 문서는 드물거나 존재하지 않습니다. 사실이라는 첫 번째 힌트를 얻기 위해 약 5 번의 메서드 호출을 거쳐야했습니다. referencesource.microsoft.com/#System/net/System/Net/mail/…
Sinjai

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에서 관련,
제롬 MEVEL

결국 같은 라이브러리. 파워 셀 스크립트가 작동하지 않는 컴퓨터에서 powershell을 사용하여 테스트하기가 더 쉽습니다. powersell 스크립트가 작동하면 C #에 해당하는 "번역"문제 일뿐입니다.
Heitor Marcos 2018

1
이 질문도 태그하지 않습니다 .NET FrameworkC#. 모두가 당신과 똑같은 일을하고 있다면, 우리는 또한 VB.NET, F # 또는 심지어 .NET Framework. 결국 그것은 동일한 프레임 워크이고 번역의 문제 일뿐입니다. 여기 제 요점이 보이십니까? StackOverflow의 정보의 정말 쓰레기 원천이 될 것입니다
제롬 MEVEL에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.