2013-09-13 7 views
3

Я должен следующий код:Ошибка отправки электронной почты в vb.net 2010

Try 
    Dim mail As New MailMessage() 
    Dim SmtpServer As New SmtpClient("smtp.gmail.com") 
    mail.From = New MailAddress(txtid.Text) 
    mail.[To].Add(TextBox1.Text) 
    mail.Subject = txtsub.Text 
    mail.Body = txtmess.Text 
    ' mail.Attachments.Add(New Attachment(OpenFileDialog1.FileName)) 
    SmtpServer.Port = 587 
    SmtpServer.Credentials = New System.Net.NetworkCredential(txtid.Text, txtpass.Text) 
    SmtpServer.EnableSsl = True 

    SmtpServer.Send(mail) 
    MsgBox("E-mail Has Been Send Successfully !") 
Catch ex As Exception 
    MsgBox(ex.Message) 
End Try 

на этапе

SmtpServer.Send(mail) 

Я всегда получаю сообщение об ошибке: Ошибка отправки почты

Любой Идея, как это исправить?

Обратите внимание, что я использую VB.NET

+0

Каков тип исключения? –

+0

@KarlAnderson это SMTPException – User7291

+0

Я пробовал тестировать порты, но все еще nth:/ – User7291

ответ

2

Try настройке SMTP-сервера на порт 465 (с SSL) и порт 587 (с TLS), работает для меня.

1

Поскольку вы получаете в SmtpException, документация SmtpClient.Send Method (MailMessage) утверждает, что следующие причины могут быть причиной:

  • Подключение к серверу SMTP не удалось ,
  • Ошибка аутентификации.
  • Операция истекло.
  • EnableSsl выставлен на продажу true, но DeliveryMethod Недвижимость установлена ​​в SpecifiedPickupDirectory или PickupDirectoryFromIis.
  • EnableSsl установлен в true, но почтовый сервер SMTP не рекламировал STARTTLS в ответе на команду EHLO.

Я хотел бы использовать Trim() с вашим именем пользователя и пароль текст значений, чтобы удалить любые возможные начальные или конечные пробелы, как это:

SmtpServer.Credentials = New System.Net.NetworkCredential(txtid.Text.Trim(), 
                  txtpass.Text,Trim()) 

Я также рекомендовал бы заставить DeliveryMethod использовать сервер SMTP, как это:

SmtpServer.DeliveryMethod = SmtpDeliveryMethod.Network 
+0

ладно .. я вижу ... и как я могу узнать причину, чтобы исправить это? – User7291

+0

Я бы попытался изолировать причину от списка возможных сценариев, см. Обновленный ответ. –

+0

Я попробовал trim() ... но я все еще сталкиваюсь с той же ошибкой – User7291

0

Мои собственные эксперименты показывают, что класс .NET SmtpClient фактически не поддерживает SMTP через SSL (SMTPS). Переключение флага .EnableSsl на ваш клиентский объект вместо этого заставит клиента использовать STARTTLS.

Это неудивительно, учитывая, что SMTPS устарел в пользу STARTTLS по ряду причин, большинство из которых связаны с бесшовной интероперабельностью между новыми и старыми клиентами и серверами.

SMTPS: Клиент открывает TCP-соединение с целевым сервером. Эти два запускают SSL-подтверждение сразу, а затем переходят через этот SSL-туннель, используя обычный SMTP-протокол (EHLO, AUTH и т. Д.).

STARTTLS: Клиент открывает TCP-соединение с целевым сервером. Клиент выдает EHLO, а затем STARTTLS. Это делается с использованием простого текста. Команда STARTTLS предлагает клиенту и серверу начать квитирование SSL по уже открытому сокету. Вся будущая коммуникация (команда AUTH и за ее пределами) осуществляется через уже установленный SSL-туннель.

Возникла проблема, когда объект SmtpClient подключается к серверу, ожидающему SMTPS.Клиент отправит EHLO после открытия своего сокета вместо того, чтобы немедленно начать квитирование SSL, что приведет к тому, что сервер будет считать, что квитирование SSL не выполнено, и соединение остановится или умрет. Клиент задержит тайм-аут, и вы получите исключение SmtpException.

Любой SMTP-сервер, прослушивающий порт 465, вероятно, ожидает SMTPS. SMTPS имеет собственный выделенный порт и необязательно поддерживает STARTTLS, потому что по определению STARTTLS сервер должен принимать и отвечать на команды EHLO и STARTTLS перед использованием SSL.

SMTP-серверы на традиционных портах, таких как 587 или 25, однако имеют возможность поддерживать STARTTLS, если серверное программное обеспечение поддерживает его и администратор службы, чтобы включить его. Именно поэтому многие люди на интернет-публикации об этой проблеме отметили, что они в состоянии получить SmtpClient работать, изменяя порт от 465 до 587.


Короткая версия: Класс SmtpClient поддерживает STARTTLS и не SMTP через SSL (SMTPS). Если вы хотите использовать флаг .EnableSsl на объекте клиента, убедитесь, что сервер и порт, к которому вы подключаетесь, поддерживают STARTTLS. Если сервер и порт вместо этого прослушивают и ожидают истинный SMTPS, клиентский объект не сможет успешно подключиться, и отправка не удастся. Порт 465 используется почти исключительно для SMTPS. Порты 25 и 587 используются для поддержки SMTP или SMTP с поддержкой STARTTLS при наличии STARTTLS (дополнительно).

Смежные вопросы