【问题标题】:Sending email to multiple recipients via Google通过 Google 向多个收件人发送电子邮件
【发布时间】:2013-10-30 16:00:33
【问题描述】:

我正在开发一个 C# 项目,我正在构建自己的 SMTP 服务器。它基本上可以正常工作,但我现在正在尝试发送多个收件人,但我收到一个错误。

我从发件人域获取 MX 记录,然后我正在使用 MX 记录尝试向多个收件人发送电子邮件。如果我用同一个域做两个收件人,它工作正常,如果两个收件人有不同的域,我会得到以下响应:

Failed to send email. General Exception: Error in processing. The server response was: 4.3.0 Multiple destination domains per transaction is unsupported.  Please

please 之后没有任何内容,这就是响应的结尾。

以下是我获取 MX 记录的方式:

string[] mxRecords = mxLookup.getMXRecords(Classes.CommonTasks.getDomainFromEmail(domain));

public string[] getMXRecords(string domain)
{
    DnsLite dl = new DnsLite(library);

    ArrayList dnsServers = getDnsServers();
    dl.setDnsServers(dnsServers);

    ArrayList results = null;
    string[] retVal = null;
    results = dl.getMXRecords(domain);
    if (results != null)
    {
        retVal = new string[results.Count];


        int counter = 0;
        foreach (MXRecord mx in results)
        {
            retVal[counter] = mx.exchange.ToString();
            counter++;
        }
    }
    return retVal;
}

以下是我发送电子邮件的方式。

if (mxRecords != null)
                    {
                        MailMessage composedMail = new MailMessage();
                        composedMail.From = new MailAddress(message.EmailFromAddress);
                        //MailAddressCollection test = new MailAddressCollection();
                        //composedMail.To = test;
                        composedMail = addRecipientsToEmail(composedMail, message.emailRecipients);
                        composedMail.Subject = message.subject;
                        composedMail.Body = message.EmailBody;
                        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);
                    }

这看起来好像是 Google 限制完成的事情,但除了为每个收件人单独发送电子邮件之外,我找不到解决方法。

如果有任何用处,这两个域都是谷歌应用域。

感谢您提供的任何帮助。

【问题讨论】:

    标签: c# email smtp


    【解决方案1】:

    看来你并不孤单。看看这个。

    “根据我的调查和研究,我认为您的系统正在直接连接到交付服务器 (aspmx.l.google.com)。由于这是交付服务器,因此它不允许:

    1. 递送至未在 Google 上配置的帐户(即未经身份验证的中继)。

    2. 在同一个 SMTP 会话中传送到多个不同的域。

    第二个对我们来说很重要。自本月初(2012年5月)起,我们的服务器设置进行了调整,这意味着我们的交付服务器正在严格执行多域不允许规则。有两种方法可以解决这个问题。第一种是在不同的 smtp 会话上发送到不同的域,第二种是使用 smtp.gmail.com 代替 aspmx.l.google.com。"

    http://productforums.google.com/forum/#!topic/apps/jEUrvTd1S_w

    【讨论】:

    • 小评论,smtp.gmail.com 需要身份验证,因此您可能需要使用另一个 smtp-server(如果可用)
    【解决方案2】:

    尽管您可以通过 google 向单个收件人发送电子邮件,但您的问题不在于解决 mx 记录。 Mx 记录告知 IP 地址,但不告知该 ip 背后的服务的功能/行为。

    您可以解析 mx-record,到目前为止一切顺利。但是您不需要像 smtp-client 那样自行解决 mx 问题,只需提供主机名即可。但请注意,这是了解有关 DNS 的更多信息的绝佳练习。没有时间浪费:-)

    据我所知,以您想要的方式通过 google 发送邮件需要一个 google 帐户。使用该帐户的凭据向 smtp-server 进行身份验证可以打开一个新的视角

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多