Почтовый клиент (SMTP) - C#
Формулировка задачи:
Написал код почтового клиента, но отправки писем так и не добился.
Пробовал и с яндекса и с рамблера - результат тот же.
Может кто сталкивался с такой же проблемой.
А если есть рабочий вариант отправки (для рамблера или яндекса) то большая просьба выложить.
Примеры я конечно всяко разно видел, но вроде там все так же, однако у меня в чем то накладка.
Через секунд 30 после отправки письма получаю через коллбек на отправку такой вот мессидж:
System.Net.Mail.SmtpException: Сбой при отправке сообщения электронной почты. ---> System.Net.WebException: Невозможно соединиться с удаленным сервером ---> System.Net.Sockets.SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера 81.19.70.48:25
в System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Int32 timeout, Exception& exception)
--- Конец трассировки внутреннего стека исключений ---
в System.Net.Mail.SmtpConnection.ConnectAndHandshakeAsyncResult.End(IAsyncResult result)
в System.Net.Mail.SmtpClient.ConnectCallback(IAsyncResult result)
--- Конец трассировки внутреннего стека исключений ---
Есть ошибка в моем коде? Или тут дело в чем то другом?
namespace MailClient
{
public partial class Window1 : Window
{
RegistryKey newkey;
RegistryKey newkey2;
RegistryKey newkey3;
Attachment data;
SmtpClient client;
OpenFileDialog OpenFile = new OpenFileDialog();
//static bool MailSend = false;
public Window1()
{
InitializeComponent();
//коллбек на открытие меню выбора файлов
OpenFile.FileOk += new System.ComponentModel.CancelEventHandler(this.OpenFileOk);
}
//коллбек на отправку почты
private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
String token = (string)e.UserState;
if (e.Cancelled)
{
MessageBox.Show("[{0}] Отправка отменена.", token);
}
if (e.Error != null)
{
MessageBox.Show(e.Error.ToString());
StreamWriter log = new StreamWriter("D:\\log.doc");
log.Write(e.Error.ToString());
log.Close();
}
else
{
MessageBox.Show("Сообщение успешно отправлено");
}
}
//собственно сам отправка
public void mail()
{
//задает уровень доступа: надо не надо - хрен его знает...
SmtpPermission connectAccess = new SmtpPermission(SmtpAccess.Connect);
string Header = Thema.Text; //заголовок
string Mail = TextMessage.Text; //письмо
string FromAdress = MyAdress.Text; //адрес отправителя
string ToAdress = Adress.Text; //адрес получателя
string file = Attach.Text; //прикрепленный файл
string password = Password.Text; //пароль на почтовом сервере
string login = Login.Text; //логин на почтовом серевере
if (Header == "")
{
Header = "Без темы";
}
//string host = Dns.GetHostName();
//IPAddress[] ips = Dns.GetHostAddresses(host);
if (ToAdress == "")
{
MessageBox.Show("Введите адрес");
return;
}
if (Mail == "")
{
MessageBox.Show("Введите текст");
return;
}
Write_Key(Header,ToAdress, FromAdress, password, login);
client = new SmtpClient("smtp.rambler.ru", 25);
//client.Timeout = 100000;
//авторизация на своем почтовом сервере
client.Credentials = new NetworkCredential(login, password);
//client.EnableSsl = true; не обязательно
//вот это не знаю как правильно интерпретировать и что собственно дают
//client.Credentials = CredentialCache.DefaultNetworkCredentials;
//client.UseDefaultCredentials = true;
//адреса - от кого кому
MailAddress from = new MailAddress(FromAdress);
MailAddress to = new MailAddress(ToAdress);
MailMessage message = new MailMessage(from, to);
message.Subject = Header;
message.Body = Mail;
message.SubjectEncoding = System.Text.Encoding.UTF8;
message.BodyEncoding = System.Text.Encoding.UTF8;
//обработчик успешной отправки
client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
//вложения
if (file != "")
{
data = new Attachment(file, MediaTypeNames.Application.Octet);
ContentDisposition disposition = data.ContentDisposition;
disposition.CreationDate = System.IO.File.GetCreationTime(file);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(file);
disposition.ReadDate = System.IO.File.GetLastAccessTime(file);
message.Attachments.Add(data);
}
//отправляем сообщение
//исключение теперь здесь не ловится так как стоит коллбек на отправку
try
{
client.SendAsync(message,"test");
}
catch (SmtpException ex)
{
MessageBox.Show(String.Format("Базовая ошибка: {0} Статус кода: {1}", ex.GetBaseException().ToString(), ex.StatusCode.ToString()));
StreamWriter log2 = new StreamWriter("D:\\log.doc");
log2.Write(ex.GetBaseException().ToString());
log2.Close();
}
//освобождаем ресурсы
message.Dispose();
}
Так-c... никто значит не знает.
Причину я нашел - провайдер мой зараза оказывается 25 порт заблокировал и видимо не только его.
587 и 465 (юзаются smtp серверами gmail.com) тоже не пашут.
А других портов я не знаю.
Остается только юзать почтовый сервис провайдера.
Решение задачи: «Почтовый клиент (SMTP)»
textual
Листинг программы
client = new SmtpClient("smtp.rambler.ru")