Ошибка 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.

Другие вопросы по тегам