提问人:mrrobot 提问时间:10/25/2023 最后编辑:mrrobot 更新时间:10/26/2023 访问量:67
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)
问:
我正在远程计算机上运行一个 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 上运行?
答:
问题是 SmtpClient 用于发送 HELO 命令时,aspx Web 服务器的 hostName 无效。
这与 SSL 设置、邮件服务器的主机名或任何发件人/收件人/抄送地址无关。
System.Net.Mail.SmtpClient 正在为运行代码的计算机获取一些无效的 hostName 字符串,或者它将其解析为未向邮件服务器网络公开的内部 IP 地址,从而使邮件服务器无法对其进行 rDNS,因此它以错误响应 HELO 命令。
如果您使用 MailKit 编写测试 App 来发送简单的电子邮件,则可以通过检查日志来查看 HELO 命令中发送的内容,从而获取协议日志,以查看您的 App 认为它运行在哪个主机名上。
或者,您可以重写 App 以使用 MailKit 发送电子邮件,并覆盖 MailKit 的 SmtpClient.LocalDomain 属性以将其设置为有效值。
评论
;
,