четверг, 29 октября 2009 г.

Как отправлять почту через Google Mail с сайта ASP.NET

Грабли, которые подстерегают человека, которому надо отправить почту через почтовый домен, хостящийся на google apps из .net-сайта. Грабли описаны на примере встроенных в фреймворк классов из пространства System.Net.Mail.

1) Надо обязательно использовать TLS/SSL. В web.config это выглядит так:

<system.net>
    <mailSettings>
        <smtp from=from_person@domain.com deliveryMethod="network">
            <network host="smtp.gmail.com." port="587" userName=from_person@domain.com password="PASSWORD"/>
        </smtp>
    </mailSettings>
</system.net>

2) Кроме того что в конфиге надо правильный порт сказать, в коде надо проставить свойство EnableSsl у SmtpClient (не знаю, почему это не вынесено в <mailSettings>

private static void internalSend(SmtpClient smtp, string email, MailMessage mm)
{


smtp.EnableSsl = true;
smtp.Send(mm);

}

3) На хостинговом сервере может не пройти проверка сертификата SMTP сервера. Я решил этот вопрос радикально – отключил проверку:

public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    return true;
}

private static SmtpClient getSmtpClient()
{
    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

    return new SmtpClient();
}

4) Сам почтовый аккакунт, из-под которого отправляется почта, должен быть активирован в гугле. Это значит, что

  • запись для аккаунта создана в контрольной панели google mail
  • под самим аккакнтом на gmail заходили хоть раз
  • в свойствах аккаунта стоит разрешение подключаться по POP3/SMTP

И даже после этого у вас может получиться отправлять почту совсем не сразу. У меня например гугль начал отсылать письма где-то через день после того как я под аккаунтом залогинился в gmail. Наверное, что-то обсчитывал :-)

2 комментария:

Viktor Varlamov комментирует...

http://example.com/

Анонимный комментирует...
Этот комментарий был удален администратором блога.