GMail + С# + Web.Config: отправка почты работает программно, исключает исключение с использованием значений Web.Config
Учитывая следующий раздел в Web.Config
:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="SomeWebsite Admin <[email protected]>">
<network host="smtp.gmail.com" port="587" defaultCredentials="true" userName="[email protected]" password="somepassword" />
</smtp>
</mailSettings>
</system.net>
И следующий фрагмент кода:
smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential( "[email protected]", "somepassword" );
smtp.Send( mailMessage );
Вышеизложенное прекрасно работает, но комментирует программные переопределения, например:
smtp = new SmtpClient();
//smtp.Host = "smtp.gmail.com";
//smtp.Port = 587;
smtp.EnableSsl = true;
//smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
//smtp.UseDefaultCredentials = false;
//smtp.Credentials = new NetworkCredential( "[email protected]", "somepassword" );
smtp.Send( mailMessage );
сбой:
System.Net.Mail.SmtpException: {"The SMTP server requires a secure connection or the
client was not authenticated. The server response was: 5.5.1 Authentication Required.
Learn more at "}
Да, пустое место после "узнайте больше" на самом деле есть, и это приносит дополнительные удовольствия. Дело в том, что я не могу жестко кодировать эти ценности, поскольку они меняются от разработки к внутренней постановке, чтобы жить. Поэтому мне интересно, почему он не работает с параметрами Web.Config
по умолчанию. Я полагаю, что у меня отсутствует одно критическое что-то другое?
* РЕДАКТИРОВАТЬ *
Вот еще несколько сведений, рассматривающих значения моего объекта smtp
(без программных переопределений, кроме EnableSSL = true):
Host = smtp.gmail.com (makes sense -- proves I'm actually editing the right Web.Config...
DeliveryMethod = Network
Port = 587
Credentials.UserName = <blank> (Problem???)
Credentials.Password = <blank> (Problem???)
Credentials.Domain = <blank>
* EDIT EDIT *
Отсутствующие значения Username
и Password
и принятый ответ ниже привели меня в проблему: defaultCredentials
в Web.Config должен быть false
.
Ответы
Ответ 1
Для конечных пользователей, правильных способов сделать это:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="SomeWebsite Admin <[email protected]>">
<network host="smtp.gmail.com" port="587" enableSsl="true" defaultCredentials="false" userName="[email protected]" password="somepassword" />
</smtp>
</mailSettings>
</system.net>
И тогда ваш код:
smtp = new SmtpClient();
smtp.Send( mailMessage );
Ответ 2
Я не знаком с работой этого способа, но в файле web.config defaultCredentials верно, вы устанавливаете значение false при его программном программировании в том, что разница?
Ответ 3
Я думаю, эта часть должна быть < smtp deliveryMethod = "Сеть" from = "SomeWebsite Admin < [email protected] > " > Как это < smtp deliveryMethod = "Сеть" from = "[email protected]" >
Ответ 4
это конфигурация, которая отлично сработала для меня:
<system.net>
<mailSettings>
<smtp deliveryMethod="Network" from="[email protected]">
<network defaultCredentials="false" host="smtp.gmail.com" port="587" userName="my-username" password="my-password"/>
</smtp>
</mailSettings>
</system.net>
нет способа добавить параметр SSL в сетевой тег.
Вам нужно будет установить его из кода:
var smtpClient = new SmtpClient();
smtpClient.EnableSsl = true;
smtpClient.Send(message);
Если вы не хотите отправлять электронные письма с помощью внешнего smtp, вы можете настроить его на использование localhost и использовать настольный почтовый приемник, например PaperCut (http://papercut.codeplex.com/).
Это конфигурация для этого:
<system.net>
<mailSettings>
<smtp>
<network host="127.0.0.1" port="25" />
</smtp>
</mailSettings>
</system.net>
Надеюсь, это поможет!
Ответ 5
Невозможно указать, следует ли использовать SSL/Secure соединение при определении параметров почты в файле веб-конфигурации.
Я уверен, почему вы получаете сообщение об ошибке.
Один из способов решения этой проблемы - создать свою собственную почтовую упаковку, а затем использовать ее в своем приложении, но вы, вероятно, уже получили это:)
Это становится более сложным при использовании элементов управления членством .net, таких как забытый пароль, создание пользователя и т.д.
Способ решения этого вопроса - переопределить событие SendingMail, а затем установить
Свойство EnableSSL для mailclient равно true.
Надеюсь, я смог помочь:)
Ответ 6
Если вы используете двухэтапную аутентификацию, не забудьте создать пароль для конкретного приложения и использовать его, а не пароль, который вы используете для входа в Gmail.
(Извините, я не могу добавить это в качестве комментария. Недостаточно репутации во время публикации этого сообщения.)