Я думаю, что это - случай, где обработка исключений была бы предпочтительным решением. Вы действительно не знаете, что это будет работать, пока Вы не попробуете, и отказ является исключением.
Редактирование:
Вы захотите обработать SmtpException. Это имеет свойство StatusCode, которое является перечислением, которое скажет Вам, почему Отправление () перестало работать.
Поймайте исключение SmtpException, оно скажет Вам, если оно перестало работать, потому что Вы не могли соединиться с сервером.
, Если Вы хотите проверить, можно ли открыть соединение с сервером перед какой-либо попыткой, Использованием TcpClient и поймать SocketExceptions. Хотя я не вижу преимущества для выполнения этого по сравнению только с ловлей проблем от Smtp. Отправить.
Вы могли попытаться отправить команду HELO, чтобы протестировать, если сервер является активным и рабочим прежде для отправки электронного письма. Если Вы хотите проверить, существует ли пользователь, Вы могли бы попробовать командой VRFY, но это часто отключается на серверах SMTP из-за соображений безопасности.Дальнейшее чтение: http://the-welters.com/professional/smtp.html Hope это помогает.
Я думаю, что если вы хотите протестировать 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");
}