Почтовый клиент (SMTP) - C#

Узнай цену своей работы

Формулировка задачи:

Написал код почтового клиента, но отправки писем так и не добился. Пробовал и с яндекса и с рамблера - результат тот же. Может кто сталкивался с такой же проблемой. А если есть рабочий вариант отправки (для рамблера или яндекса) то большая просьба выложить. Примеры я конечно всяко разно видел, но вроде там все так же, однако у меня в чем то накладка.
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();
           }
Через секунд 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) --- Конец трассировки внутреннего стека исключений --- Есть ошибка в моем коде? Или тут дело в чем то другом?
Так-c... никто значит не знает. Причину я нашел - провайдер мой зараза оказывается 25 порт заблокировал и видимо не только его. 587 и 465 (юзаются smtp серверами gmail.com) тоже не пашут. А других портов я не знаю. Остается только юзать почтовый сервис провайдера.

Решение задачи: «Почтовый клиент (SMTP)»

textual
Листинг программы
client = new SmtpClient("smtp.rambler.ru")

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4 из 5