SMTP 出现错误:- 邮箱不可用。服务器响应为:访问被拒绝 - HELO 名称无效(参见 RFC2821 4.1.1.1)

SMTP Gives error :- Mailbox unavailable. The server response was: Access denied - Invalid HELO name (See RFC2821 4.1.1.1)

提问人:mrrobot 提问时间:10/25/2023 最后编辑:mrrobot 更新时间:10/26/2023 访问量:67

问:

我正在远程计算机上运行一个 aspx 应用程序,该应用程序运行负责通过 SMTP 发送电子邮件的服务。它无法发送电子邮件并给我以下错误

异常类型:System.Net.Mail.SmtpException 异常消息:邮箱不可用。服务器响应为:访问被拒绝 - HELO 名称无效(参见 RFC2821 4.1.1.1)

相反,我在同一台远程计算机上创建了一个控制台应用程序,并编写了一个简单的程序来通过相同的SMTP详细信息发送电子邮件,并且工作正常,以下是其工作代码

class Program
{
    static void Main(string[] args)
    {
        MailAddress to = new MailAddress("*********");

        MailAddress from = new MailAddress("******"); // Note :- from and user inside N/w Credentails is same


        MailMessage mail = new MailMessage(from, to);
       
        mail.Subject = "TESTING PLEASE IGNORE";
        
        mail.Body = "TESTING MAIL BODY";

        SmtpClient smtp = new SmtpClient();
        smtp.Host = "*********";
        smtp.Port = 587;

        smtp.Credentials = new NetworkCredential(
            "********", "**********");
        smtp.EnableSsl = true;
        Console.WriteLine("Sending email...");
        smtp.Send(mail);

    }
}

这是不起作用的应用程序代码。

string id = "";
        string cc = "";
        string bcc = "";
        string to = "";
        MailMessage objMailMessage = new MailMessage();
        
        SmtpClient SmtpMail = new SmtpClient();
        SmtpMail.Host = "****"; 
        
        SmtpMail.Credentials = new System.Net.NetworkCredential("*********", "*************"); 
        SmtpMail.EnableSsl = true; 
        
        SmtpMail.Port = 587; 
        if (req != null)
        {
            Log("External email request queued internally: " + req.OuterXml);
            try
            {
                id = req.SelectSingleNode("/QuotationServer/EmailRequest").Attributes["id"].Value;
                to = req.SelectSingleNode("/QuotationServer/EmailRequest").Attributes["to"].Value;
                cc = req.SelectSingleNode("/QuotationServer/EmailRequest").Attributes["cc"].Value;
                bcc = req.SelectSingleNode("/QuotationServer/EmailRequest").Attributes["bcc"].Value;
        
                string from = "*********************";
                string subject = req.SelectSingleNode("/QuotationServer/EmailRequest").Attributes["subject"].Value;
                string body = req.SelectSingleNode("/QuotationServer/EmailRequest").Attributes["body"].Value;
        
                objMailMessage.To.Add(new MailAddress(to.Replace(";",",")));

                if (cc.Trim() != "")
                {
                    objMailMessage.CC.Add(new MailAddress(cc.Replace(";", ",")));
                }
                if (bcc.Trim() != "")
                {
                    objMailMessage.Bcc.Add(new MailAddress(bcc.Replace(";", ",")));
                }
                objMailMessage.From = new MailAddress(from);
                objMailMessage.Subject = subject;
                objMailMessage.Body = body;
        


                if (req.SelectSingleNode("/QuotationServer/EmailRequest/Attachment").Attributes["path"] != null)
                {
                    string pdffile = req.SelectSingleNode("/QuotationServer/EmailRequest/Attachment").Attributes["path"].Value.ToString();
                    objMailMessage.Attachments.Add(new System.Net.Mail.Attachment(pdffile));
                }

                Log("server name: " + m_SMTPServer + ", password: " + m_SMTPpassword + ", user and port: " + m_SMTPuser + ", " + m_SMTPport + "");

               

                SmtpMail.Send(objMailMessage);
                }
                }

我尝试更改SMTP设置,启用SSL,将默认凭据设置为false等,但没有任何效果。

可能是什么问题?

编辑 (26/10/2023)

问题似乎出在.Net Framework版本上

它在 4.6.1 上运行良好,但由于某种原因不在 2.0 上运行?

C# asp.net SMTP Windows-Services SMTPException

评论

0赞 Ars_Codicis 10/25/2023
你好!尝试发布您正在使用的代码(当然,删除了机密信息),以便我们可以更好地分析它而不是图像。它帮助我们帮助您!
1赞 mrrobot 10/25/2023
刚才看了一眼。@Ars_Codicis
0赞 Charlieface 10/25/2023
它们的主机名和端口是否完全相同?旁注:对于多个地址,您需要拆分或单独添加它们?;,
0赞 jdweng 10/25/2023
主机的域可能不正确:datatracker.ietf.org/doc/html/rfc2821#section-4.1.1.1 主机是名称还是 IP。如果是 IP,是 IPV4 还是 IPV6?
0赞 mrrobot 10/25/2023
是的,主机名和端口完全相同,并且是单个地址@Charlieface

答:

0赞 jstedfast 10/26/2023 #1

问题是 SmtpClient 用于发送 HELO 命令时,aspx Web 服务器的 hostName 无效。

这与 SSL 设置、邮件服务器的主机名或任何发件人/收件人/抄送地址无关。

System.Net.Mail.SmtpClient 正在为运行代码的计算机获取一些无效的 hostName 字符串,或者它将其解析为未向邮件服务器网络公开的内部 IP 地址,从而使邮件服务器无法对其进行 rDNS,因此它以错误响应 HELO 命令。

如果您使用 MailKit 编写测试 App 来发送简单的电子邮件,则可以通过检查日志来查看 HELO 命令中发送的内容,从而获取协议日志,以查看您的 App 认为它运行在哪个主机名上。

或者,您可以重写 App 以使用 MailKit 发送电子邮件,并覆盖 MailKit 的 SmtpClient.LocalDomain 属性以将其设置为有效值。