我目前正在开发一个 C# 项目,我正在制作自己的 SMTP 服务器。它的工作量更少,但我正在努力让它工作,我可以向不同域上的多个收件人发送电子邮件。
我最初是这样做的,所以我会创建一个MailMesssage
对象并运行以下命令来添加每个收件人
MailMessage message = new MailMessage();
message.To.add("someone@domain1.com");
message.To.add("someone@domain2.com");
如果不同的域通过谷歌应用服务器,我会得到 MX 记录,即ALT2.ASPMX.L.GOOGLE.COM
. 当发送邮件时,虽然在上面添加了收件人,但谷歌会发回一个错误,因为他们不允许通过一个 SMTP 会话进行跨域发送。
因此,我对其进行了重新设计,以便为每个收件人发送单独的电子邮件,我获得每个域的 MX 记录,因此我最终也得到了不同的 SMTP 会话。所以message.To.add
我收到的每个收件人只有一个。我想要做的是添加一个标题,这样它仍然显示电子邮件收件人仍然会去someone@domain1.com
和someone@domain2.com
.
因此,就 MailMessage 组件而言,只有一个收件人,但标头显示多个收件人,因此当收到的邮件查看其客户端中的电子邮件时,它会显示该电子邮件到达的所有收件人。
以下是我必须发送电子邮件的代码。
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;
}
感谢您的任何帮助,您可以提供。