Отправка электронной почты через SMTP-сервер Gmail с C # - PullRequest
229 голосов
/ 01 апреля 2009

Почему-то ни принятый ответ, ни какие-либо другие не работают для меня на " Отправка электронной почты в .NET через Gmail ". Почему они не работают?

ОБНОВЛЕНИЕ: Я попробовал все ответы (принятые и другие) на другой вопрос, но ни один из них не работает.

Я просто хотел бы знать, работает ли он для кого-то еще, в противном случае Google мог бы что-то изменить (что случилось раньше).

Когда я пробую фрагмент кода, который использует SmtpDeliveryMethod.Network, я быстро получаю SmtpException при отправке (сообщение). Сообщение

Для SMTP-сервера требуется безопасное соединение, или клиент не прошел проверку подлинности.

Ответ сервера был:

5.5.1 Требуется аутентификация. Узнайте больше на "<- серьезно, это заканчивается там. </p>

UPDATE:

Это вопрос, который я задавал давным-давно, и принятым ответом является код, который я использовал много-много раз в разных проектах.

Я взял некоторые идеи из этого поста и других проектов EmailSender, чтобы создать проект EmailSender в Codeplex . Он предназначен для тестирования и поддерживает мои любимые SMTP-сервисы, такие как GoDaddy и Gmail.

Ответы [ 28 ]

283 голосов
/ 02 апреля 2009

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 :().

66 голосов
/ 08 февраля 2011

СЛЕДУЮЩИЕ СЛЕДУЮЩИЕ ПОЧТИ УЖЕ БУДУТ ОТВЕТИТЬ К ВАШЕМУ ВОПРОСУ ЕСЛИ ВСЕ ЕЩЕ ОТКАЗАЛСЯ :

Я получил точно такую ​​же ошибку, оказалось, что новый алгоритм измерения надежности пароля Google изменил, посчитав мой текущий пароль слишком слабым, и не сказал мне об этом ничего (даже сообщение или предупреждение) ... Как Я обнаружил это? Ну, я решил изменить свой пароль, чтобы посмотреть, поможет ли он (пробовал все остальное безрезультатно), и когда я сменил пароль, это сработало!

Затем, для эксперимента, я попытался изменить свой пароль обратно на свой предыдущий пароль, чтобы посмотреть, что произойдет, и Gmail на самом деле не позволил мне сделать это, сославшись на причину «извините, мы не можем позволить вам сохранить это изменение так как выбранный вами пароль слишком слаб "и не позволит мне вернуться к моему старому паролю. Из этого я понял, что это ошибка, потому что либо а) вам нужно менять пароль один раз каждые x месяцев, либо б). как я уже говорил, их алгоритмы надежности паролей изменились, и поэтому слабый пароль, который я имел, не был принят, хотя они ничего не говорили об этом, когда пытались войти НИКОГДА! Это (номер 2) наиболее вероятный сценарий, поскольку моему слабому паролю было около 4 месяцев, и он позволил мне использовать его в Gmail.

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

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

64 голосов
/ 05 марта 2012

В дополнение к другим шагам по устранению неполадок, приведенным выше, я также хотел бы добавить, что если вы включили двухфакторную аутентификацию (также известную как двухэтапная проверка ) в своей учетной записи GMail, вы должен сгенерировать пароль для конкретного приложения и использовать этот новый пароль для аутентификации через SMTP .

Чтобы создать его, посетите: https://www.google.com/settings/ и выберите Авторизация приложений и сайтов для создания пароля.

50 голосов
/ 19 февраля 2015
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Ссылка на настройки Gmail

enter image description here

29 голосов
/ 22 мая 2011

У меня также были некоторые проблемы с отправкой электронных писем с моего аккаунта Gmail, что было связано с несколькими из вышеупомянутых ситуаций. Вот краткое изложение того, как я получил его работу и в то же время поддерживал его гибкость:

  • Прежде всего настройте учетную запись GMail:
    • Включить IMAP и указать максимальное количество сообщений (вы можете сделать это здесь)
    • Убедитесь, что ваш пароль не менее 7 символов и является надежным (по данным Google)
    • Убедитесь, что вам не нужно сначала вводить код с картинки. Вы можете сделать это, отправив тестовое электронное письмо из браузера.
  • Внесите изменения в 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.)

13 голосов
/ 26 сентября 2010
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.

Я попытался переключить эти две строки в обратном направлении, и ошибка 5.5.1 Требуется аутентификация вернулась.

12 голосов
/ 05 июня 2011

Ох ... Это удивительно ... Сначала я не смог отправить письмо по каким-либо причинам. Но после того, как я изменил последовательность этих двух строк, как показано ниже, она работает отлично.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

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

9 голосов
/ 11 апреля 2016

Простые шаги, чтобы исправить это:

1) Войдите в свой Gmail

2) Перейдите на эту страницу https://www.google.com/settings/security/lesssecureapps и установите значение «Включить»

9 голосов
/ 26 августа 2009

Проблема не в технической возможности отправки через gmail. Это работает для большинства ситуаций. Если вам не удается отправить машину, обычно это происходит из-за того, что машина не прошла проверку подлинности с человеком на пульте управления хотя бы один раз.

Проблема, с которой сталкивается большинство пользователей, заключается в том, что Google решает постоянно изменять исходящие ограничения. Вы всегда должны добавлять защитный код в ваше решение. Если вы начинаете видеть ошибки, уменьшите скорость отправки и просто прекратите отправку на некоторое время. Если вы продолжаете пытаться отправить, Google иногда добавляет дополнительное время к периоду задержки, прежде чем вы сможете отправить снова.

То, что я сделал в моей текущей системе, - это отправка сообщения с задержкой в ​​1,5 секунды между каждым сообщением. Затем, если я получу какие-либо ошибки, остановитесь на 5 минут, а затем начните снова. Обычно это работает и позволяет вам отправлять аккаунты до предела (в последний раз я проверял, что это было 2000 для главных входов клиентов в день).

9 голосов
/ 02 октября 2010

У меня была такая же проблема, но оказалось, что моя антивирусная защита блокировала исходящую "спам" электронную почту. Отключение этого параметра позволило мне использовать порт 587 для отправки электронной почты SMTP через GMail

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...