Отправка электронной почты через SMTP-сервер Gmail с помощью C#
почему-то ни принятый ответ, ни какие-либо другие не работают для меня "отправка писем .Чистый через Gmail". Почему они не работают?
UPDATE: я пробовал все ответы (принятые и другие) в другом вопросе, но ни один из них не работает.
Я просто хотел бы знать, работает ли он для кого-то еще, иначе Google, возможно, что-то изменил (что произошло раньше).
когда я пробую фрагмент кода, который использует SmtpDeliveryMethod.Network
, Я быстро получаю SmtpException при отправке (сообщение). Сообщение
SMTP-сервер требует защищенного соединения или клиент не прошел проверку подлинности.
ответ сервера:
Проверка Подлинности 5.5.1 Требуется. Узнайте больше на"
обновление:
это вопрос, который я задал давно, и принятый ответ код, который я использовал много, много раз в разных проектах.
Я взял некоторые идеи в этом посте и других проектах EmailSender, чтобы создать проект EmailSender в Codeplex. Он предназначен для тестируемости и поддерживает мои любимые службы SMTP, такие как GoDaddy и Gmail.
27 ответов
CVertex, обязательно просмотрите свой код и, если это ничего не покажет, опубликуйте его. Я просто включение этого на сайте ASP.NET тест я работал, и он работает.
На самом деле, в какой-то момент у меня возникла проблема с моим кодом. Я не заметил этого, пока у меня не была более простая версия на консольной программе и не увидел, что она работает (никаких изменений на стороне Gmail, как вы беспокоились). Приведенный ниже код работает так же, как образцы, на которые вы ссылались:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;
namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("myusername@gmail.com", "mypwd"),
EnableSsl = true
};
client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
Console.WriteLine("Sent");
Console.ReadLine();
}
}
}
Я также получил его работа с использованием комбинации web.config,http://msdn.microsoft.com/en-us/library/w355a94k.aspx и код (потому что нет соответствия EnableSsl
в файле конфигурации :( ).
СЛЕДУЮЩЕЕ ПОЧТИ НАВЕРНЯКА БУДЕТ ОТВЕТ НА ВАШ ВОПРОС ЕСЛИ ВСЕ ОСТАЛЬНОЕ НЕ УДАЛОСЬ:
Я получил точно такую же ошибку, оказывается, новый алгоритм измерения пароля Google изменился, считая мой текущий пароль слишком слабым и не говоря мне об этом (даже не сообщение или предупреждение)... Как я это обнаружил? Ну, я решил изменить свой пароль, чтобы увидеть, поможет ли это (пробовал все остальное безрезультатно), и когда я сменил пароль, сработало!
затем, для эксперимента, я попытался изменить свой пароль обратно на мой предыдущий пароль, чтобы увидеть, что произойдет, и Gmail на самом деле не позволил мне сделать это, сославшись на причину "извините, мы не можем позволить вам сохранить это изменение, поскольку ваш выбранный пароль слишком слаб" и не позволил мне вернуться к моему старому паролю. Я понял из этого, что это ошибка, потому что либо a) вам нужно изменить свой пароль один раз в x месяцев или b). как я сказал раньше их алгоритмы силы пароля менялись, и поэтому слабый пароль, который у меня был, не был принят, хотя они ничего не говорили об этом при попытке войти в любом месте! Это (номер 2) является наиболее вероятным сценарием, так как мой слабый пароль был около 4 месяцев, и он позволил мне использовать его в Gmail.
очень плохо, что они ничего не сказали об этом, но это имеет смысл. Потому что большинство угнанных писем регистрируются с помощью программного обеспечения за пределами gmail, и я предполагаю, что вы требуется иметь более надежный пароль, если вы хотите использовать Gmail вне среды Gmail.
надеюсь, это поможет!
в дополнение к другим шагам по устранению неполадок выше, я также хотел бы добавить, что если вы включили двухфакторную аутентификацию (также известную как двухэтапной проверки) на вашей учетной записи GMail, вы необходимо создать пароль для конкретного приложения и использовать этот вновь сгенерированный пароль для аутентификации через SMTP.
создать, на странице: https://www.google.com/settings/ и авторизация приложений и сайтов для генерации пароля.
у меня были некоторые проблемы с отправкой писем из моей учетной записи gmail, которые были вызваны несколькими из вышеупомянутых ситуаций. Вот краткое изложение того, как я заставил его работать, и сохраняя его гибким в то же время:
- прежде всего настройте свою учетную запись GMail:
- включить IMAP и утвердить нужное максимальное количество сообщений (вы можете сделать это здесь)
- убедитесь, что ваш пароль не менее 7 символов и сильна (по данным Google)
- убедитесь, что вам не нужно сначала ввести код captcha. Вы можете сделать это, отправив тестовое письмо из браузера.
- внести изменения в web.config (или app.config, я еще не пробовал, но я предполагаю, что так же легко заставить его работать в приложении windows):
<configuration>
<appSettings>
<add key="EnableSSLOnMail" value="True"/>
</appSettings>
<!-- other settings -->
...
<!-- system.net settings -->
<system.net>
<mailSettings>
<smtp from="yourusername@gmail.com" deliveryMethod="Network">
<network
defaultCredentials="false"
host="smtp.gmail.com"
port="587"
password="stR0ngPassW0rd"
userName="yourusername@gmail.com"
/>
<!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
</smtp>
</mailSettings>
</system.net>
</configuration>
Add a Class to your project:
Imports System.Net.Mail
Public Class SSLMail
Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)
GetSmtpClient.Send(e.Message)
'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
e.Cancel = True
End Sub
Public Shared Sub SendMail(ByVal Msg As MailMessage)
GetSmtpClient.Send(Msg)
End Sub
Public Shared Function GetSmtpClient() As SmtpClient
Dim smtp As New Net.Mail.SmtpClient
'Read EnableSSL setting from web.config
smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
Return smtp
End Function
End Class
и теперь, когда вы хотите отправить электронную почту все, что вам нужно сделать, это позвонить SSLMail.SendMail
:
например, на странице с Элемент управления PasswordRecovery:
Partial Class RecoverPassword
Inherits System.Web.UI.Page
Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
e.Message.Bcc.Add("webmaster@example.com")
SSLMail.SendMail(e)
End Sub
End Class
или в любом месте вашего кода Вы можете позвонить:
SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})
Я надеюсь, что это поможет всем, кто сталкивается с этим сообщением! (Я использовал VB.NET но я думаю, что тривиально конвертировать его на любой язык .NET.)
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")
Если вы получаете ошибку "SMTP-сервер требует защищенного соединения или клиент не прошел проверку подлинности. Ответ сервера: 5.5.1 требуется аутентификация. Узнайте больше на" как я получаю до этого, убедитесь, что строка SMTPClientObj.UseDefaultCredentials = False
включено, и эта строка должна перед SMTPClientObj.Credentials
.
Я попытался переключить эти 2 строки в противоположную сторону и 5.5.1 требуется проверка подлинности ошибка вернулся.
О...это удивительно... Сначала я не мог отправить письмо по каким-либо причинам. Но после того, как я изменил последовательность этих двух строк, как показано ниже, она работает отлично.
//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");
надеюсь, что это поможет!!! :)
проблема не в технической возможности отправки через gmail. Это работает в большинстве ситуаций. Если вы не можете получить машину для отправки, это обычно связано с тем, что машина не была аутентифицирована с человеком в элементах управления хотя бы один раз.
проблема, с которой сталкиваются большинство пользователей, заключается в том, что Google решает постоянно изменять исходящие ограничения. Вы всегда должны добавлять защитный код в свое решение. Если вы начинаете видеть ошибки, сойдите с скорости отправки и просто остановитесь посылаю на время. Если вы продолжаете пытаться отправить Google иногда добавляет дополнительное время к периоду задержки, прежде чем вы можете отправить снова.
то, что я сделал в моей текущей системе, - это отправить с задержкой 1,5 секунды между каждым сообщением. Затем, если я получу какие-либо ошибки, остановитесь на 5 минут, а затем начните снова. Это обычно работает и позволит вам отправлять до пределов учетной записи (последний раз я проверял, что это было 2,000 для входа клиентов premier в день).
У меня была такая же проблема, но оказалось, что это моя защита от вирусов блокирует исходящие "спамом". Отключение этого позволило мне использовать порт 587 для отправки SMTP-почты через GMail
простые шаги, чтобы исправить это:
1) Войдите в свой Gmail
2)Перейдите на эту страницу https://www.google.com/settings/security/lesssecureapps Установите "включить"
Я не уверен, какая версия .NET требуется для этого, потому что eglasius упомянул, что нет соответствия enableSsl
настройка (я использую .NET 4.0, но я подозреваю, что он работает в .NET 2.0 или более поздней версии), но эта конфигурация justed работала для меня (и не требует использования какой-либо программной конфигурации):
<system.net>
<mailSettings>
<smtp from="myusername@gmail.com" deliveryMethod="Network">
<network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
</smtp>
</mailSettings>
</system.net>
возможно, вам придется сначала включить POP или IMAP в своей учетной записи Gmail: https://mail.google.com/mail/?shva=1#settings/fwdandpop
I рекомендуется сначала попробовать его с обычным почтовым клиентом...
Если здесь больше ничего не работает, вам может потребоваться разрешить доступ к вашей учетной записи gmail из сторонних приложений. Это была моя проблема. Чтобы разрешить доступ, выполните следующие действия:
- войдите в свою учетную запись gmail.
- посетите эту страницу https://accounts.google.com/DisplayUnlockCaptcha и нажмите на кнопку, чтобы разрешить доступ.
- посетите эту страницу https://www.google.com/settings/security/lesssecureapps и включить доступ для менее безопасных приложений.
этот работал для меня, надеюсь, что это работает для кого-то другого!
@Andres Pompiglio: Да, правильно, вы должны изменить свой пароль хотя бы один раз.. этот код работает просто отлично:
//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
string subject, string body)
{
MailMessage message = new MailMessage();
SmtpClient smtpClient = new SmtpClient();
string msg = string.Empty;
try
{
MailAddress fromAddress = new MailAddress(from);
message.From = fromAddress;
message.To.Add(toList);
if (ccList != null && ccList != string.Empty)
message.CC.Add(ccList);
message.Subject = subject;
message.IsBodyHtml = true;
message.Body = body;
// We use gmail as our smtp client
smtpClient.Host = "smtp.gmail.com";
smtpClient.Port = 587;
smtpClient.EnableSsl = true;
smtpClient.UseDefaultCredentials = true;
smtpClient.Credentials = new System.Net.NetworkCredential(
"Your Gmail User Name", "Your Gmail Password");
smtpClient.Send(message);
msg = "Successful<BR>";
}
catch (Exception ex)
{
msg = ex.Message;
}
return msg;
}
//End Send Email Function
и вы можете сделать вызов с помощью функции:
Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))
Я также обнаружил, что учетная запись, которую я использовал для входа в систему, была деактивирована google по какой-то причине. Как только я сбросил свой пароль (так же, как раньше), я смог отправить электронные письма просто отлично. Я также получал сообщение 5.5.1.
Я также пытался многие решения, но внести некоторые изменения он будет работать
host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true
С smtpclient выше параметры работают в gmail
Я использовал корпоративное VPN-соединение. Именно по этой причине я не мог отправить электронное письмо из своего приложения. Он работает, если я отключаюсь от VPN.
Я столкнулся с этой же ошибкой ( "SMTP-сервер требует защищенного соединения или клиент не прошел проверку подлинности. Ответ сервера: 5.5.1 требуется аутентификация. Узнайте больше на" ) и узнал, что я использовал неправильный пароль. Я исправил учетные данные для входа, и он отправлен правильно.
Я знаю, что это поздно, но, возможно, это поможет кому-то еще.
еще одна вещь, которую я нашел, это то, что вы должны изменить свой пароль хотя бы один раз. И попробуйте использовать пароль безопасного уровня (не используйте того же пользователя, что и пароль, 123456 и т. д.)
Я получал ту же ошибку, и ни одно из вышеперечисленных решений не помогло.
моя проблема заключалась в том, что я запускал код с удаленного сервера, который никогда не использовался для входа в учетную запись gmail.
Я открыл браузер на удаленном сервере и вошел в gmail оттуда. Он задал вопрос безопасности, чтобы убедиться, что это я, так как это было новое место. После проверки безопасности я смог аутентифицироваться с помощью кода.
еще одно возможное решение для вас. У меня были аналогичные проблемы с подключением к gmail через IMAP. Попробовав все решения, с которыми я столкнулся, что вы будете читать здесь и в другом месте на SO (например. включите IMAP, включите менее безопасный доступ к вашей почте, используя https://accounts.google.com/b/0/displayunlockcaptcha и так далее), я фактически создал новую учетную запись gmail еще раз.
в моем исходном тесте, первая учетная запись gmail, которую я создал, я подключился к моей основной учетной записи gmail. Это привело к неустойчивому поведению, когда Google ссылался на неправильную учетную запись. Например, запуск https://accounts.google.com/b/0/displayunlockcaptcha открыл мой основной счет, а не тот, который я создал для этой цели.
поэтому, когда я создал новую учетную запись и не подключил ее к моей основной учетной записи, после выполнения всех соответствующих шагов, как указано выше, я обнаружил, что она работает нормально!
Я еще не подтвердили это (т. е. воспроизводится), но, по-видимому, он сделал это для меня...надеюсь, это поможет.
включите менее безопасные приложения для своей учетной записи:https://www.google.com/settings/security/lesssecureapps
- сначала проверьте настройки учетной записи gmail и включите " доступ для менее безопасных приложений"
мы настоятельно рекомендуем вам использовать безопасное приложение, например Gmail, для доступа к вашей учетной записи. Все приложения от Google соответствуют этим стандартам безопасности. С другой стороны, использование менее безопасного приложения может сделать вашу учетную запись уязвимой. Учить больше.
-
Set
smtp.UseDefaultCredentials = false;
перед
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
вы также можете подключиться через порт 465, но из-за некоторых ограничений системы.Сеть.Пространство имен Mail может потребоваться изменить код. Это связано с тем, что пространство имен не дает возможности создавать неявные SSL-соединения. Это обсуждается на http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx, и я привел пример того, как использовать CDO (Collaborative Data Object) в другом обсуждении (GMail SMTP через C# .Net ошибки на всех портах).
Я решил эту проблему. Это сообщение используется в нескольких типах ошибок. Моя проблема заключалась в том, что я достиг своего максимума 500 отправленных писем.
войдите в учетную запись и вручную попробуйте отправить письмо. Если предел был достигнут, он сообщит вам
для этой ошибки существует одна или несколько причин.
войдите в систему с помощью Gmail (или любого другого if ) в локальной системе.
также проверьте менее безопасное приложение и установите его в положение "включить" вот ссылка для GMAIL. https://www.google.com/settings/security/lesssecureapps
-
проверьте наличие EnableSsl в коде электронной почты, а также установите его в true.
smtp.EnableSsl = true;
также проверить какой порт вы используете в настоящее время. 25 является глобальным, но вы можете проверить его для других, таких как 587. проверьте здесь. все SMTP-сообщения происходят через 25?
ЕСЛИ ВЫ НАХОДИТЕСЬ НА ПУЛЬТЕ : Проверь ответы Влад Тамас выше.
smtp.Host = "smtp.gmail.com"; //host name
smtp.Port = 587; //port number
smtp.EnableSsl = true; //whether your smtp server requires SSL
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;
измените пароль gmail и повторите попытку, после этого он должен работать.
Не знаю, почему, но каждый раз, когда вы изменить свой хостинг, вы должны изменить свой пароль.