Ошибка ASP: почтовый ящик недоступен. Ответ сервера: Отказано в доступе - неверное имя HELO (см. RFC2821 4.1.1.1)
Я получаю сообщение об ошибке и знаю, что мои учетные данные верны. Есть идеи? Это на Windows Server, но я хочу использовать настройки SMTP Hostgator для моей электронной почты. Это то, что происходит, когда я отправляю простую контактную форму.
ОШИБКА: почтовый ящик недоступен. Ответ сервера: Отказано в доступе - неверное имя HELO (см. RFC2821 4.1.1.1)
Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Net.Mail.SmtpException: почтовый ящик недоступен. Ответ сервера: Отказано в доступе - неверное имя HELO (см. RFC2821 4.1.1.1)
Строка ошибки источника 61:
Line 59:
Line 60: SmtpClient smtp = new SmtpClient(SMTPServer, SMTPPort);
Line 61: smtp.Credentials = new NetworkCredential(SMTPUserId, SMTPPassword);
Line 62: smtp.Send(mail);
Line 63: }
Исходный файл: \Websites\Client\Reports\ContactUs.aspx.cs Строка: 61
================================================== =======================
Мой исходный код:
protected void ImageButton1_Click(object sender, ImageClickEventArgs e)
{
string name = txtFirstName.Text + " " + txtLastName.Text;
string clientID = Session["CustomerID"].ToString();
string message = txtMessage.Text;
string email = txtEmail.Text;
string company = txtCompany.Text;
string phone = txtPhone.Text;
SMTPMailHelper.SendMail(email, "[email protected]", "Contact from Client: " + clientID + ": " + name + " " + company, message);
}
Я оставил некоторые сценарии, которые не имели значения, как условные заявления. И ЭТО ОСТАЕТСЯ ЭТОМ:
public class SMTPMailHelper
{
const string SMTPServer = "mail.mydomain.com";
const string SMTPUserId = "[email protected]";
const string SMTPPassword = "MyPasswordHidden";
const int SMTPPort = 25;
public static void SendMail(string sendFrom, string sendTo, string subject, string body)
{
MailAddress fromAddress = new MailAddress(sendFrom);
MailAddress toAddress = new MailAddress(sendTo);
MailMessage mail = new MailMessage();
mail.From = fromAddress;
mail.To.Add(toAddress);
mail.Subject = subject;
if (body.ToLower().Contains("<html>"))
{
mail.IsBodyHtml = true;
}
mail.Body = body;
SmtpClient smtp = new SmtpClient(SMTPServer, SMTPPort);
smtp.Credentials = new NetworkCredential(SMTPUserId, SMTPPassword);
smtp.Send(mail);
}
}
1 ответ
Проблема в том, что SmtpClient выдает HELO
или же EHLO
команда со строкой имя хоста / домена, которую ваш сервер отклоняет по SMTP.
Я, очевидно, не могу знать внутреннюю логику реализации Microsoft SmtpClient, но я подозреваю, что вы, вероятно, находитесь за NAT, что означает, что SmtpClient не может разрешить доступное для просмотра полное доменное имя вашей машины. Он может разрешить только полное доменное имя вашей машины в вашей "внутренней сети" (и реально, возможно, он даже не может преобразовать его в фактическое полное доменное имя, возможно, он должен согласиться на IP-адрес внутренней сети).
Итак... SmtpClient, вероятно, отправляет что-то вроде EHLO [192.168.1.100]
(или каким бы ни был ваш локальный IP-адрес), и сервер отклоняет его, потому что это не тот IP-адрес, с которого он получает пакеты.
Вам нужно найти свой внешний IP-адрес, посетив сайт, например http://www.whatismyip.com/ или используя имя хоста, обнаруженное сайтом, например http://www.displaymyhostname.com/.
Чтобы проиллюстрировать, о чем я говорю, вот небольшая демонстрационная программа:
using System;
using System.Net;
using System.Linq;
using System.Net.Sockets;
using System.Collections.Generic;
using System.Net.NetworkInformation;
namespace LocalHostName
{
class Program
{
static void Main (string[] args)
{
var ipAddresses = Dns.GetHostAddresses ("www.google.com");
Socket socket;
for (int i = 0; i < ipAddresses.Length; i++) {
socket = new Socket (ipAddresses[i].AddressFamily, SocketType.Stream, ProtocolType.Tcp);
try {
socket.Connect (ipAddresses[i], 80);
Console.WriteLine ("LocalEndPoint: {0}", socket.LocalEndPoint);
break;
} catch {
socket.Dispose ();
socket = null;
if (i + 1 == ipAddresses.Length)
throw;
}
}
Console.ReadLine ();
}
}
}
Какой бы IP-адрес он ни печатал, скорее всего, тот, который SmtpClient использует в своем HELO
/EHLO
команда.
Плохая новость заключается в том, что нет способа обойти эту проблему с System.Net.Mail.SmtpClient.
Хорошей новостью является то, что я сэкономил 15% на страховании автомобиля... я имею в виду, что написал свои собственные почтовые библиотеки MimeKit и MailKit, которые могут обойти эту проблему.
Еще одна хорошая новость заключается в том, что вы можете легко преобразовать свой объект System.Net.Mail.MailMessage в объект MimeKit.MimeMessage (хотя, очевидно, было бы лучше полностью переключиться на MimeKit и MailKit).
var mimeMessage = (MimeMessage) mailMessage;
Вот как будет выглядеть ваш переписанный класс SMTPMailHelper с использованием MimeKit и MailKit:
using System;
using MimeKit;
using MailKit.Net.Smtp;
public class SMTPMailHelper
{
const string SMTPServer = "mail.mydomain.com";
const string SMTPUserId = "[email protected]";
const string SMTPPassword = "MyPasswordHidden";
const int SMTPPort = 25;
public static void SendMail(string sendFrom, string sendTo, string subject, string body)
{
MimeMessage message = new MimeMessage ();
TextPart text;
message.From.Add (new MailboxAddress ("", sendFrom));
message.To.Add (new MailboxAdress ("", sendTo));
message.Subject = subject;
if (body.ToLower ().Contains ("<html>"))
text = new TextPart ("html") { Text = text };
else
text = new TextPart ("plain") { Text = text };
message.Body = text;
using (var smtp = new SmtpClient ()) {
// use the IP address gotten from http://www.whatismyip.com/
// or the hostname gotten from http://www.displaymyhostname.com/
smtp.LocalDomain = "c-24-71-150-91.hsd1.ga.comcast.net";
smtp.Connect (SMTPServer, SMTPPort, false);
smtp.Authenticate (SMTPUserId, SMTPPassword);
smtp.Send (message);
smtp.Disconnect (true);
}
}
}
Важным битом является строка, для которой вы устанавливаете свойство LocalDomain объекта SmtpClient.