GMail + C # + Web.Config: отправка почты работает программно, создает исключение при использовании значений Web.Config - PullRequest
18 голосов
/ 06 марта 2010

Учитывая следующий раздел в Web.Config:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="Network" from="SomeWebsite Admin &lt;someuser@gmail.com&gt;">
            <network host="smtp.gmail.com" port="587" defaultCredentials="true" userName="someuser@gmail.com" 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( "someuser@gmail.com", "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( "someuser@gmail.com", "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>

* РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЯ *

Отсутствующие значения Username и Password и принятый ответ ниже привели меня к проблеме: defaultCredentials в Web.Config должно быть false.

Ответы [ 6 ]

26 голосов
/ 21 февраля 2013

Для Google, заканчивающих здесь, правильный способ сделать это:

<system.net>
    <mailSettings>
        <smtp deliveryMethod="Network" from="SomeWebsite Admin &lt;someuser@gmail.com&gt;">
            <network host="smtp.gmail.com" port="587" enableSsl="true" defaultCredentials="false" userName="someuser@gmail.com" password="somepassword" />
        </smtp>
    </mailSettings>
</system.net>

И тогда ваш код:

           smtp   = new SmtpClient();
           smtp.Send( mailMessage );
8 голосов
/ 06 марта 2010

Я не знаком с такой работой, но в файле web.config defaultCredentials имеет значение true, вы устанавливаете значение false, когда делаете это программно, это разница?

2 голосов
/ 09 ноября 2013

это конфигурация, которая отлично сработала для меня:

<system.net>
    <mailSettings>
      <smtp deliveryMethod="Network" from="my-email@gmail.com">
        <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>

Надеюсь, это поможет!

2 голосов
/ 06 марта 2010

Я думаю, что эта часть должна быть "> Как это

1 голос
/ 13 сентября 2013

Если вы используете двухэтапную проверку, не забудьте сгенерировать пароль для конкретного приложения и использовать его, а не пароль, который вы используете для входа в Gmail.

(Извините, я не могу добавить это как комментарий. Недостаточно повторений на момент публикации.)

1 голос
/ 06 марта 2010

Невозможно указать, следует ли использовать соединение SSL / Secure при определении настроек почты в файле веб-конфигурации.

Я почти уверен, что именно поэтому вы получаете ошибку.

Один из способов решить эту проблему - создать собственную оболочку для отправки почты и затем использовать ее в своем приложении, но вы, вероятно, уже получили это:

Это становится более сложным при использовании элементов управления членством .net, таких как забытый пароль, создание пользователя и т. Д. Чтобы решить эту проблему, нужно переопределить событие SendingMail, а затем установить Свойство EnableSSL почтового клиента имеет значение true.

Я надеюсь, что смог помочь :)

...