Я могу протестировать SmtpClient перед звонящим клиентом. Отправить ()?

21
задан Community 23 May 2017 в 11:55
поделиться

4 ответа

Я думаю, что это - случай, где обработка исключений была бы предпочтительным решением. Вы действительно не знаете, что это будет работать, пока Вы не попробуете, и отказ является исключением.

Редактирование:

Вы захотите обработать SmtpException. Это имеет свойство StatusCode, которое является перечислением, которое скажет Вам, почему Отправление () перестало работать.

8
ответ дан 29 November 2019 в 20:09
поделиться

Поймайте исключение SmtpException, оно скажет Вам, если оно перестало работать, потому что Вы не могли соединиться с сервером.

, Если Вы хотите проверить, можно ли открыть соединение с сервером перед какой-либо попыткой, Использованием TcpClient и поймать SocketExceptions. Хотя я не вижу преимущества для выполнения этого по сравнению только с ловлей проблем от Smtp. Отправить.

2
ответ дан 29 November 2019 в 20:09
поделиться

Вы могли попытаться отправить команду HELO, чтобы протестировать, если сервер является активным и рабочим прежде для отправки электронного письма. Если Вы хотите проверить, существует ли пользователь, Вы могли бы попробовать командой VRFY, но это часто отключается на серверах SMTP из-за соображений безопасности.Дальнейшее чтение: http://the-welters.com/professional/smtp.html Hope это помогает.

1
ответ дан 29 November 2019 в 20:09
поделиться

Я думаю, что если вы хотите протестировать SMTP, это значит, что вы ищете способ проверить свою конфигурацию и доступность сети без фактической отправки электронной почты. В любом случае это то, что мне было нужно, так как не было пустых писем, которые имели бы смысл.

По совету моего коллеги-разработчика я придумал это решение. Небольшой вспомогательный класс, использование которого показано ниже. Я использовал его в событии OnStart службы, рассылающей электронные письма.

Примечание: заслуга за содержимое TCP-сокетов принадлежит Питеру А. Бромбергу по адресу http://www.eggheadcafe.com/articles/20030316.asp , а здесь ребятам прочитана информация о конфигурации: Программный доступ к настройкам system.net из app.config в C #

Помощник:

public static class SmtpHelper
{
    /// <summary>
    /// test the smtp connection by sending a HELO command
    /// </summary>
    /// <param name="config"></param>
    /// <returns></returns>
    public static bool TestConnection(Configuration config)
    {
        MailSettingsSectionGroup mailSettings = config.GetSectionGroup("system.net/mailSettings") as MailSettingsSectionGroup;
        if (mailSettings == null)
        {
            throw new ConfigurationErrorsException("The system.net/mailSettings configuration section group could not be read.");
        }
        return TestConnection(mailSettings.Smtp.Network.Host, mailSettings.Smtp.Network.Port);
    }

    /// <summary>
    /// test the smtp connection by sending a HELO command
    /// </summary>
    /// <param name="smtpServerAddress"></param>
    /// <param name="port"></param>
    public static bool TestConnection(string smtpServerAddress, int port)
    {
        IPHostEntry hostEntry = Dns.GetHostEntry(smtpServerAddress);
        IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], port);
        using (Socket tcpSocket = new Socket(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp))
        {
            //try to connect and test the rsponse for code 220 = success
            tcpSocket.Connect(endPoint);
            if (!CheckResponse(tcpSocket, 220))
            {
                return false;
            }

            // send HELO and test the response for code 250 = proper response
            SendData(tcpSocket, string.Format("HELO {0}\r\n", Dns.GetHostName()));
            if (!CheckResponse(tcpSocket, 250))
            {
                return false;
            }

            // if we got here it's that we can connect to the smtp server
            return true;
        }
    }

    private static void SendData(Socket socket, string data)
    {
        byte[] dataArray = Encoding.ASCII.GetBytes(data);
        socket.Send(dataArray, 0, dataArray.Length, SocketFlags.None);
    }

    private static bool CheckResponse(Socket socket, int expectedCode)
    {
        while (socket.Available == 0)
        {
            System.Threading.Thread.Sleep(100);
        }
        byte[] responseArray = new byte[1024];
        socket.Receive(responseArray, 0, socket.Available, SocketFlags.None);
        string responseData = Encoding.ASCII.GetString(responseArray);
        int responseCode = Convert.ToInt32(responseData.Substring(0, 3));
        if (responseCode == expectedCode)
        {
            return true;
        }
        return false;
    }
}

Использование:

if (!SmtpHelper.TestConnection(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)))
{
    throw new ApplicationException("The smtp connection test failed");
}
40
ответ дан 29 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: