GMail SMTP через C# .NET ошибки на всех портах
Я пытался это сделать и до сих пор терпел неудачу. Моя последняя попытка была взята из этого стекового кода: отправка электронной почты через SMTP-сервер Gmail с C#, но я попробовал весь синтаксис, который я мог найти здесь, в стеке и в других местах. Мой код в настоящее время:
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("me@gmail.com", "mypass"),
EnableSsl = true
};
client.Send("me@gmail.com","me@gmail.com","Test", "test message");
Выполнение этого кода дает мне немедленное исключение "Ошибка отправки почты", которая содержит исключение "невозможно подключиться к удаленному серверу".
Если я изменю порт на 465 (как подсказывают документы gmail), я получаю таймаут каждый раз.
Я читал, что 465 не очень хороший порт для использования, поэтому мне интересно, что за сделка с 587 дает мне ошибку при подключении. Мой пользователь и пароль правы. Я прочитал, что мне нужно настроить службу POP в моей учетной записи Gmail, поэтому я сделал это. Безрезультатно
Первоначально я пытался заставить это работать для моей фирменной учетной записи GMail, но после столкновения с теми же проблемами, которые я думал, что с моей обычной учетной записью Gmail будет проще... пока это не так.
7 ответов
Я попробовал ваш код, и он работает с портом 587, а не с 465.
Вы проверили противопожарную стену? Попробуйте из командной строки "Telnet smtp.gmail.com 587". Если вы вернете "220 mx.google.com ESMTP....", то порт открыт. Если нет, то это то, что блокирует ваш вызов.
Даниил
Я тоже столкнулся с этой проблемой некоторое время назад. Проблема заключается в том, что 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 = "YourUserName@gmail.com";
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.
Я реализовал почтовый клиент, который мог общаться с gmail на 587 и 465...
Порт 25 является обычным незашифрованным поп-портом; недоступно в Gmail.
Два других порта имеют шифрование; 587 использует TLS, 465 использует SSL.
Чтобы использовать 587, вы должны установить SmtpClient.EnableSsl = true.
465 не будет работать с SmtpClient, вместо этого он будет работать с устаревшим классом SmtpMail.
Попробуйте эту ссылку http://www.google.com/accounts/DisplayUnlockCaptcha на сервере.
Учетные записи Gmail для бизнеса (или обычные учетные записи Gmail не уверены в этом) впервые требуют DisplayUnlockCaptcha.
У меня была та же проблема, но я не мог изменить ограничения брандмауэра моей компании. Основываясь на одной из заметок в этом документе Google, а также на ответе erdenetsogt выше, я попытался использовать порт 25, и это сработало. (Сначала я был обеспокоен тем, что использование порта 25 может означать, что сообщение не может быть зашифровано; поэтому я установил для EnableSSL значение false, из-за чего gmail отклонил его, поскольку StartTLS никогда не вызывался. Это заставляет меня полагать, что gmail применяет явное SSL, даже через порт 25).
Брандмауэр вашей частной сети заблокировал порты 587 и 465. Вы можете использовать порт по умолчанию 25 или включить там порты на брандмауэре
Есть два способа сделать 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.
Теперь сделайте следующий код в 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 = "yyy@XXXXXXX.net";
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 = "yyy@XXXXXXX.net"
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
Ссылка: Оригинальный пост Неявный и Явный 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