2009-07-04 6 views
10

Я пробовал для whlie на этом и до сих пор терпел неудачу. Моя последняя попытка была снята с этого кода стека здесь: Sending email through Gmail SMTP server with C#, но я пробовал весь синтаксис, который я мог найти здесь, в стеке и в другом месте. Мой код в настоящее время:GMail SMTP через C#. Ошибки в сети на всех портах

var client = new SmtpClient("smtp.gmail.com", 587) 
{ 
    Credentials = new NetworkCredential("[email protected]", "mypass"), 
    EnableSsl = true 
}; 

client.Send("[email protected]","[email protected]","Test", "test message"); 

Запуск этого кода дает мне немедленное исключение «Сбой отправки почты», который имеет innerexeption «не удается подключиться к удаленному серверу».

Если я сменил порт на 465 (как предлагает gmail docs), я получаю таймаут каждый раз.

Я читал, что 465 не является хорошим портом для использования, поэтому мне интересно, что сделка w/587 дала мне отказ подключиться. Мой пользователь и пароль прав. Я читал, что у меня должна быть настройка службы POP на моей учетной записи gmail, поэтому я сделал это. Безрезультатно.

Первоначально я пытался заставить эту работу работать с моей фирменной учетной записью GMail, но после того, как я столкнулся с теми же проблемами, с которыми я столкнулся думал собирается с моей обычной учетной записью Gmail будет проще ... пока что это не дело.

+0

Можете ли вы подключиться через стандартный почтовый клиент? Если нет, это может быть проблемой с вашим брандмауэром. Включили ли вы доступ к POP в своей учетной записи? – MiffTheFox

+0

Да, я могу, и да, да. – Paul

ответ

14

Я попробовал ваш код, и он работает втирают с портом 587, но не 465.

Вы проверили пожарную стену? Попробуйте в командной строке «Telnet smtp.gmail.com 587» Если вы получили «220 mx.google.com ESMTP ....» назад, тогда порт открыт. Если нет, это то, что блокирует вас.

Daniel

+0

спасибо, это было именно оно. Я установил правило в своем брандмауэре, чтобы передать порт 587, и у моего почтового клиента не было проблем с его использованием, но мой ай/я был подозрительным к моему консольному тестовому приложению, думая, что это червь, пытающийся пропагандировать. – Paul

+0

привет, я пробовал этот тест в telnet, он работал (я получил 220 mx.google.com ESMTP), но когда я пытаюсь отправить почту с помощью приложения .net 2.0, я получаю «сервер не поддерживает безопасные подключения». Знаете ли вы что вызывает проблему – Smith

9

Я реализовал клиент электронной почты некоторое время назад, что может поговорить с GMAIL как на 587 и 465 ...

Порт 25 является нормальным незашифрованном поп-порт; недоступен в gmail.

Другие два порта имеют шифрование; 587 использует TLS, 465 использует SSL.

Чтобы использовать 587, вы должны установить SmtpClient.EnableSsl = true.

465 не работает с SmtpClient, вместо этого он будет работать с устаревшим классом SmtpMail.

+0

, как уже упоминалось, у меня уже был EnableSsl = true, см. мой код. – Paul

+0

@ user133243 Благодарим за информацию – prabhakaran

1

брандмауэра частной сети заблокировали порты 587 и 465. Вы можете использовать стандартный порт 25 или включить там порты на брандмауэре

15

я столкнулся в этой проблеме некоторое время назад, как хорошо. Проблема заключается в том, что SmtpClient не поддерживает неявные SSL-соединения, но поддерживает явные подключения (System.Net.Mail with SSL to authenticate against port 465). Предыдущий класс MailMessage (я считаю .Net 1.0) действительно поддерживал это, но уже давно устарел.

Мой ответ был назвать CDO (объекты Collaborative Data) (http://support.microsoft.com/kb/310212) непосредственно через COM, используя что-то вроде следующего:

/// <summary> 
    /// Send an electronic message using the Collaboration Data Objects (CDO). 
    /// </summary> 
    /// <remarks>http://support.microsoft.com/kb/310212</remarks> 
    private void SendTestCDOMessage() 
    { 
     try 
     { 
      string yourEmail = "[email protected]"; 

      CDO.Message message = new CDO.Message(); 
      CDO.IConfiguration configuration = message.Configuration; 
      ADODB.Fields fields = configuration.Fields; 

      Console.WriteLine(String.Format("Configuring CDO settings...")); 

      // Set configuration. 
      // sendusing:    cdoSendUsingPort, value 2, for sending the message using the network. 
      // smtpauthenticate:  Specifies the mechanism used when authenticating to an SMTP service over the network. 
      //         Possible values are: 
      //         - cdoAnonymous, value 0. Do not authenticate. 
      //         - cdoBasic, value 1. Use basic clear-text authentication. (Hint: This requires the use of "sendusername" and "sendpassword" fields) 
      //         - cdoNTLM, value 2. The current process security context is used to authenticate with the service. 

      ADODB.Field field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserver"]; 
      field.Value = "smtp.gmail.com"; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpserverport"]; 
      field.Value = 465; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendusing"]; 
      field.Value = CDO.CdoSendUsing.cdoSendUsingPort; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]; 
      field.Value = CDO.CdoProtocolsAuthentication.cdoBasic; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendusername"]; 
      field.Value = yourEmail; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/sendpassword"]; 
      field.Value = "YourPassword"; 

      field = fields["http://schemas.microsoft.com/cdo/configuration/smtpusessl"]; 
      field.Value = "true"; 

      fields.Update(); 

      Console.WriteLine(String.Format("Building CDO Message...")); 

      message.From = yourEmail; 
      message.To = yourEmail; 
      message.Subject = "Test message."; 
      message.TextBody = "This is a test message. Please disregard."; 

      Console.WriteLine(String.Format("Attempting to connect to remote server...")); 

      // Send message. 
      message.Send(); 

      Console.WriteLine("Message sent."); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 

Не забудьте просматривать ваши COM-ссылки и добавить «Microsoft CDO для библиотеки Windows 200 ", которая должна добавить две ссылки: ADODB и CDO.

1

У меня была такая же проблема, но я не имел права изменять ограничения брандмауэра моей компании. Основываясь на одной из заметок на this Google doc, наряду с ответом эрденцотта выше, я попытался использовать порт 25, и он сработал.(Сначала я был обеспокоен тем, что использование порта 25 может означать, что сообщение не может быть зашифровано, поэтому я установил EnableSSL в false, что вызвало отклонение Gmail, потому что StartTLS никогда не вызывался. Это заставляет меня думать, что gmail обеспечивает Явное SSL, даже через порт 25).

2

Пробуйте эту ссылку http://www.google.com/accounts/DisplayUnlockCaptcha на сервере.

Деловые учетные записи Gmail (или обычные учетные записи gmail не уверены в этом) требуют DisplayUnlockCaptcha в первый раз.

0

Существует два способа сделать SMTP через SSL: Явный и неявный. Явное означает, что вы подключаетесь к обычному SMTP-порту (обычно 25 или 587) в открытом тексте, а затем запускаете команду «starttls» для переключения в режим SSL. Неявное означает, что вы подключаетесь к порту, который ожидает, что все будет SSL (обычно 465).

Asp.net использовать «System.Net.Mail.SmtpClient()» для отправки электронной почты. Основная проблема заключается в том, что SmtpClient не поддерживает неявные SSL-соединения, но поддерживает явные подключения (System.Net.Mail с SSL для аутентификации против порта 465). Таким образом, если почтовый сервер (SMTP) не поддерживает явное соединение, ему не удается отправить электронную почту и показать такие сообщения, как «Тайм-аут соединения», «Сообщение не может быть отправлено на SMTP-сервер. Код ошибки транспорта был 0x80040217. Ответ сервера не был доступен »и т. Д.

Для решения этой проблемы в ASP.net мы можем использовать объекты данных совместной работы (CDO) для библиотеки Windows 2000 (Cdosys.dll) для отправки сообщения электронной почты с вложениями. Microsoft Outlook использует эту DLL для отправки электронной почты. В вашем решении ASP.net вам нужно добавить ссылку «Microsoft CDO для Windows 2000 Library». Он добавит две помеченные dll в папку Bin.

image to add referance

Теперь сделайте сильфона код в C# .net:

public static void SendMail(string FromName, string FromEmail, string ReceiverEmail, string CC, string BCC, string subj, string Mssg) 
{ 
const var cdoSendUsingPort = 2; 
const var cdoBasicAuth = 1; 
const var cdoTimeout = 60; 
var mailServer = "mail.XXXXXXX.net"; 
var SMTPport = 465; 
var mailusername = "[email protected]"; 
var mailpassword = "PPPPXXXX"; 
var objEmail = CreateObject("CDO.Message"); 
var objConf = objEmail.Configuration; 
var objFlds = objConf.Fields; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername; 
objFlds.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword; 
objFlds.Update(); 
objEmail.To = ReceiverEmail; 
objEmail.From = FromEmail; 
objEmail.CC = CC; 
objEmail.BCC = BCC; 
objEmail.Subject = subj; 
objEmail.HTMLBody = Mssg; 
objEmail.Send(); 
} 

В VB.net

Public Shared Sub SendMail(ByVal FromName As String, ByVal FromEmail As String, ByVal ReceiverEmail As String, ByVal CC As String, ByVal BCC As String, ByVal subj As String, ByVal Mssg As String) 

''#################Sending Email########################## 

Const cdoSendUsingPort = 2 ' Send the message using SMTP 
Const cdoBasicAuth = 1 ' Clear-text authentication 
Const cdoTimeout = 60 ' Timeout for SMTP in seconds 

Dim mailServer = "mail.XXXXXXX.net" 
Dim SMTPport = 465 
Dim mailusername = "[email protected]" 
Dim mailpassword = "PPPPXXXX" 




Dim objEmail = CreateObject("CDO.Message") 
Dim objConf = objEmail.Configuration 
Dim objFlds = objConf.Fields 

With objFlds 
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = mailServer 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SMTPport 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = cdoTimeout 
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasicAuth 
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = mailusername 
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = mailpassword 
.Update() 
End With 

objEmail.To = ReceiverEmail 
objEmail.From = FromEmail 
objEmail.CC = CC 
objEmail.BCC = BCC 
objEmail.Subject = subj 
objEmail.HTMLBody = Mssg 
'objEmail.AddAttachment "C:\report.pdf" 
objEmail.Send() 
End Sub 

Referance: Original post неявной & Явная SMTP http://help.fogcreek.com/9002/using-an-smtp-server-with-ssl использовать Библиотека Cdosys.dll для отправки электронного сообщения с прикрепленными файлами https://support.microsoft.com/en-us/help/310212/how-to-use-the-cdosys-dll-library-to-send-an-e-mail-message-with-attac