私は現在、独自の SMTP サーバーを作成している C# プロジェクトに取り組んでいます。あまり機能していませんが、異なるドメインにある複数の受信者に電子メールを送信できる場所で機能させようとしています。
私は最初にそれを行ったので、MailMesssage
オブジェクトを作成し、次を実行して各受信者を追加します
MailMessage message = new MailMessage();
message.To.add("someone@domain1.com");
message.To.add("someone@domain2.com");
異なるドメインがGoogleアプリサーバーを通過する場合、MXレコードはALT2.ASPMX.L.GOOGLE.COM
. 上記の受信者を追加してメールを送信すると、1 つの SMTP セッションを介したクロスドメイン送信が許可されていないため、Google はエラーを返します。
したがって、受信者ごとに個別の電子メールが送信されるように作り直しました。各ドメインの MX レコードを取得するため、最終的には異なる SMTP セッションになります。message.To.add
したがって、受信した受信者ごとに 1 つしかありません。私がやろうとしているのは、ヘッダーを追加して、メールの受信者がまだsomeone@domain1.com
とsomeone@domain2.com
.
したがって、MailMessage コンポーネントに関する限り、受信者は 1 人ですが、ヘッダーには複数の受信者が表示されるため、メールの受信者がクライアントで電子メールを表示すると、電子メールが送信されたすべての受信者が表示されます。
以下は、メールを送信するために必要なコードです。
MXLookup mxLookup = new MXLookup();
List<string> recipients = addRecipientsToEmail(message.emailRecipients);
foreach (string recipient in recipients)
{
string domain = Classes.CommonTasks.getDomainFromEmail(recipient);
string[] mxRecords = mxLookup.getMXRecords(Classes.CommonTasks.getDomainFromEmail(domain));
if (mxRecords != null)
{
MailMessage composedMail = new MailMessage();
composedMail.From = new MailAddress(message.EmailFromAddress);
composedMail.To.Add(recipient);
composedMail.Subject = message.subject;
composedMail.Body = message.EmailBody;
composedMail.Headers.Add(getHeaders(recipients));
if (message.contentType.ToString().Contains("text/html"))
{
composedMail.IsBodyHtml = true;
}
SmtpClient smtp = new SmtpClient(mxRecords[0]);
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.Port = 25;
if (Configuration.emailConfig.useSmtpMaxIdleTime)
{
smtp.ServicePoint.MaxIdleTime = 1;
}
library.logging(methodInfo, string.Format("Sending email via MX Record: {0}", mxRecords[0]));
smtp.Send(composedMail);
updateEmailStatus(message.emailID, EmailStatus.Sent);
library.logging(methodInfo, string.Format("Successfully sent email ID: {0}", message.emailID));
}
else
{
string error = string.Format("No MX Record found for domain: {0}", domain);
library.logging(methodInfo, error);
library.setAlarm(error, CommonTasks.AlarmStatus.Warning, methodInfo);
}
以下は私の getHeaders 関数です。
private NameValueCollection getHeaders(List<string> emailRecipients)
{
string headers = "";
NameValueCollection headersArray = new NameValueCollection();
foreach (string recipient in emailRecipients)
{
headers += string.Format("{0}, ", recipient);
}
headersArray.Add("To", headers);
return headersArray;
}
ご協力いただきありがとうございます。