GMail SMTP через ошибки С#.Net во всех портах

Я пробовал эту штуковину и до сих пор терпел неудачу. Моя последняя попытка была снята с этого кода стека здесь: Отправка электронной почты через SMTP-сервер Gmail с С#, но я пробовал весь синтаксис, который я мог найти здесь, в стеке и в другом месте. В настоящее время мой код:

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");

Запуск этого кода дает мне немедленное исключение "Отказ при отправке почты", который имеет невосприимчивость "не может подключиться к удаленному серверу".

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

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

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

Ответы

Ответ 1

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

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

Daniel

Ответ 2

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

Мой ответ состоял в том, чтобы вызвать CDO (Collaborative Data Objects) (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 Library", который должен добавить две ссылки: ADODB и CDO.

Ответ 3

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

Порт 25 - обычный незашифрованный поп-порт; недоступно в gmail.

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

Есть два способа сделать 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.

изображение для добавления ссылки

Теперь выполните следующий код в С#.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: Оригинальное сообщение Неявный и явный 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