MailMessageで複数の受信者にメールを送信しますか?


85

SQLServerに複数の電子メール受信者が保存されています。Webページで[送信]をクリックすると、すべての受信者に電子メールが送信されます。を使用してメールを区切りました;

以下は、単一の受信者コードです。

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

これまでに何を試しましたか?これは単一の受信者に対して機能しますか?
ブレンダングリーン

@BrendanGreenはい私は単一の受信者のために働いています。
Chetan Goenka 2014年

5
また、参考までに、あなたMailMessageSmtpClientインスタンスはusingブロック内にある必要があります。
ジョンサンダース2014年

2
@JohnSaundersすべきですが、絶対にそうする必要ありません。
Num Lock

1
@JohnSaundersまず第一に、あなたの言い回しは非常に誤解を招くものです。おそらくこれについて議論するでしょうが、「usingブロックに入れる必要がある」は「処分する必要がある」と同じではありません。次に、Webアプリケーションのような本番コードでは、通常はSendAsyncとにかく使用する必要がありSnmpClientます。これは、インスタンスを破棄しなくても意図したとおりに機能します。
Num Lock

回答:


178

簡単!

着信アドレスリストを「;」で分割するだけです。文字、およびそれらをメールメッセージに追加します。

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( ";"、 "、"))のようなことを行うことができます。replaceを使用する方が良いかもしれませんが、他の人がすでにカンマで区切っている場合に備えて、これにコメントする必要があると思います。文字列!そうすれば、分割したり交換したりする必要はありません。
areks 2015

@Areks、ブレンダンに似たサンプルコードの行をまとめることができれば、それを答えとして間違いなく追加する必要があります。
アダムミラー2015年

@Areksこのコメントに感謝します。あなたのコメントを読むまで、私はすでにアドレスを分割していました。これはまさに私が欲しいものです!
djeroen 2016

これは必要ですか?複数のアドレス用にすでにフォーマットされている文字列を取得して分割し、再割り当てするだけではありませんか?To( "a1; a2; a3")のように文字列をTo()に送信する場合、なぜそれらを分割してから個別に割り当てる必要があるのですか?AddressCollection内の複数のアドレスまたはデリミネーター文字列を除外するため。
ケーシー

82

コメントでAdamMillerが示唆しているように、別の解決策を追加します。

MailMessage(String from、String to)コンストラクターは、コンマで区切られたアドレスのリストを受け入れます。したがって、すでにコンマ( '、')で区切られたリストがある場合、使用法は次のように簡単です。

MailMessage Msg = new MailMessage(fromMail, addresses);

この特定のケースでは、「;」を置き換えることができます。'、'の場合でも、コンストラクターを使用します。

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

あなたがこれを好むか、受け入れられた答えを好むかどうかはあなた次第です。おそらくループは意図をより明確にしますが、これはより短く、曖昧ではありません。ただし、すでにコンマ区切りのリストがある場合は、これが最適な方法だと思います。


2
これを実装した私が管理するアプリケーションで問題が発生したため、replaceコマンドを実行する前に、末尾の文字がセミコロンであるかどうかを確認して削除する必要があります。末尾のセミコロンが有効な受信者リストと見なされるかどうかはわかりませんが、Outlookなどのアプリケーションで末尾のセミコロンが表示されることに慣れている場合があります。MailMessageに渡すコンマ区切りリストに末尾のコンマを含めることはできません。
David Jacobsen 2015年

1
私の理解では、その後に何もない場合、末尾にコンマ/セミコロンがあってはなりません...しかし、これを読んでいる人はそれを知っているので、間違いなく良いコメントです。ありがとうございました!
areks 2015年

1
これはどこかに文書化されていますか?コンストラクターのドキュメントでは、toパラメーターを「電子メールメッセージの受信者のアドレスを含む文字列」と記述しているだけです。使用したいのですが、サポートが削除される可能性がある場合は使用しません。
xr280xr 2015年

1
残念ながら、この形式は文書化されていないようですが、コンストラクターは、複数の受信者向けである可能性があると 述べています。msdn.microsoft.com / en - us / library / 14k9fb7t(v = vs.110).aspxアドレスを含む文字列電子メールメッセージの受信者の。「アドレス」と「受信者」の両方で複数形です。
areks 2015年

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#に相当するものに「変換」するだけです。
HeitorMarcos18年

1
この質問にはタグ.NET Frameworkが付けられていませんが、タグが付けられているだけC#です。全員があなたと同じことをしているとしたら、VB.NET、F#、さらにはC ++でさえに関連するすべての質問に答えることができ.NET Frameworkます。結局のところ、それは同じフレームワークです、それはただ翻訳の問題です...ここに私のポイントがわかりますか?StackOverflowのは、情報の本当にゴミの源になるだろう
ジェローム・MEVEL
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.