Вопрос по c#, gmail, .net – GMail SMTP через C #. Net ошибки на всех портах

11

Я пытался это сделать и до сих пор терпел неудачу. Моя последняя попытка была взята из этого стекового кода:Отправка электронной почты через SMTP-сервер Gmail с 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");

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

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

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

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

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

Ваш Ответ

7   ответов
1

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

0

явный и неявный. Явный означает, что вы подключаетесь к обычному порту SMTP (обычно 25 или 587) в виде открытого текста, а затем запускаете команду & # x201C; starttls & # x201D; Команда для переключения в режим SSL. Неявный означает, что вы подключаетесь к порту, который ожидает, что все будет SSL (обычно 465).

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

Чтобы решить эту проблему в ASP.net, мы можем использовать библиотеку объектов совместной работы (CDO) для Windows 2000 (Cdosys.dll), чтобы отправить сообщение электронной почты с вложениями. Microsoft Outlook использует эту DLL для отправки электронной почты. В ваше решение ASP.net необходимо добавить ссылку & # x201C; Microsoft CDO для Windows 2000 Library & # x201C ;. Это добавит два отмеченных 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: Оригинальный пост Неявный & amp; Явный SMTPhttp://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

15

ом, что 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». который должен добавить две ссылки: ADODB и CDO.

14

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

Даниил

спасибо, это было именно это. Я установил правило в своем брандмауэре, чтобы пропустить через порт 587, и у моего почтового клиента не было никаких проблем с его использованием, но мой a / v с подозрением относился к моему консольному тестовому приложению, думая, что это червь, пытающийся распространить. Paul
@ Павел Может кто-нибудь, пожалуйста, посмотрите здесь?stackoverflow.com/questions/52386437/…
привет, я попробовал этот тест в telnet, он работал (у меня 220 mx.google.com ESMTP), но когда я пытаюсь отправить почту с помощью приложения .net 2.0, я получаюServer does not support secure connections. знаете ли вы, что вызывает проблему
9

который мог общаться с gmail на 587 и 465 ...

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

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

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

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

@ user133243 Спасибо за информацию
как уже упоминалось, у меня уже было EnableSsl = true, см. мой код. Paul
1

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

2

http://www.google.com/accounts/DisplayUnlockCaptcha на сервере.

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

Похожие вопросы