Отправка электронной почты в .NET через Gmail


876

Вместо того чтобы полагаться на мой хост в отправке электронной почты, я думал об отправке сообщений электронной почты, используя мою учетную запись Gmail . Электронные письма - это персонализированные электронные письма группам, которые я играю на своем шоу.

Возможно ли это сделать?


1
< systemnetmail.com >, пожалуй, самый нелепо полный сайт, посвященный единственному пространству имен .NET ... но на нем есть ВСЕ, что вы когда-либо захотите узнать об отправке почты через .NET, будь то ASP.NET или Desktop. < systemwebmail.com > был исходным URL-адресом в сообщении, но его не следует использовать для .NET 2.0 и выше.
Адам Хейл

13
Если вы используете ASP.Net Mvc, я бы порекомендовал взглянуть на MvcMailer: github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
noocyte

У меня есть хороший пример того, как это сделать, на моем сайте jarloo.com/gmail-in-c
Келли,

как отправить файл, используя этот код?
Ранэдир Редди

Ответы:


1065

Обязательно используйте System.Net.Mail, а не устаревший System.Web.Mail. Использование SSL System.Web.Mail- это грубая путаница хакерских расширений.

using System.Net;
using System.Net.Mail;

var fromAddress = new MailAddress("from@gmail.com", "From Name");
var toAddress = new MailAddress("to@example.com", "To Name");
const string fromPassword = "fromPassword";
const string subject = "Subject";
const string body = "Body";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}

49
Вы по-прежнему можете заставить пользователя не войти в систему с ошибками, если Google просто вдруг решит, что вы отправили слишком много за последние xx минут. Вы должны всегда добавлять trySend, если он некоторое время ошибается, а затем пытаться снова.
Джейсон Шорт

72
Интересное примечание: если вы поменяете местами «UseDefaultCredentials = false» и «Credentials = ...», проверка подлинности не будет выполнена.
Натан Уилер

13
Нет проблем с SPF, использующим этот метод. Каждый почтовый клиент может быть настроен именно на это. У вас могут возникнуть проблемы, если вы используете свой собственный сервер (то есть что-то еще smtp.gmail.com) с something@gmail.comотправителем. Кстати: smtp.gmail.comавтоматически перезаписывает адрес отправителя, если он не ваш.
Майнерсбур

24
Мне было трудно заставить это работать даже при попытке различных настроек. Как было предложено в соответствующем сообщении, я обнаружил, что именно мой антивирус препятствовал успешной отправке электронных писем. Рассматриваемый антивирус - это McAffee, и в его «защите доступа» есть категория «Стандартная защита от вирусов», в которой есть правило «Запретить отправку электронной почты червями при массовой рассылке». Настройка / отключение этого правила заставило этот код работать на меня!
yourbuddypal

18
Я получал сообщение об ошибке 5.5.1 Authentication Required, пока не понял, что тестирую учетную запись (мою личную) с включенной двухфакторной аутентификацией. Как только я использовал аккаунт, у которого его не было, он работал нормально. Я мог также сгенерировать пароль для своего приложения, которое я тестировал, в моем личном аккаунте, но я не хотел этого делать.
Ник ДеВор

153

Приведенный выше ответ не работает. Вы должны установить, DeliveryMethod = SmtpDeliveryMethod.Networkили он вернется с ошибкой « клиент не был аутентифицирован ». Также всегда полезно поставить тайм-аут.

Пересмотренный код:

using System.Net.Mail;
using System.Net;

var fromAddress = new MailAddress("from@gmail.com", "From Name");
var toAddress = new MailAddress("to@yahoo.com", "To Name");
const string fromPassword = "password";
const string subject = "test";
const string body = "Hey now!!";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
    Timeout = 20000
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}

3
Интересно; это работает на моей машине (ТМ). Но так как это кажется правдоподобным, я добавлю его в свой ответ.
Доменик

3
Хм, я думаю, что SmtpDeliveryMethod.Network является сетью по умолчанию, но, может быть, по умолчанию меняется при работе в IIS --- это было то, что вы делали?
Доменик

3
Я использую тот же код в Консольном приложении, это из-за ошибки «Ошибка отправки почты».
Картикеян П

5
Этот ответ не работает. Пожалуйста, обратите внимание на вопрос stackoverflow.com/questions/34851484/...

110

Чтобы остальные ответы работали «с сервера», сначала включите доступ к менее защищенным приложениям в учетной записи gmail.

Похоже, недавно Google изменил свою политику безопасности. Ответ с самым высоким рейтингом больше не работает, пока вы не измените настройки своей учетной записи, как описано здесь: https://support.google.com/accounts/answer/6010255?hl=ru-RUвведите описание изображения здесь

введите описание изображения здесь

По состоянию на март 2016 года Google снова изменил расположение настроек!


4
Это сработало для меня. И это тоже касается. Не уверен, что хочу отключить эту защиту. Возможно, нужно переосмыслить ...
Sully

4
С точки зрения безопасности лучше включить двухэтапную проверку, а затем создать и использовать пароль приложения - см. Как отправить электронное письмо в .Net в соответствии с новыми политиками безопасности?
Майкл Фрайдгейм

2
@BCS Software, inmy program, пользователь вставляет любое электронное письмо, которое моя программа должна использовать для отправки сообщения. Итак, как я могу сделать так, чтобы пользователь электронной почты мог отправлять электронную почту, даже если включена двухфакторная аутентификация ??
Alaa

Это тот же параметр, который необходимо изменить, если вы хотите использовать клиент Microsoft Outlook (на настольном компьютере, мобильном телефоне и т. Д.) Для отправки / получения сообщений электронной почты через GMail Google.
Бретт Ригби

41

Это для отправки электронной почты с приложением .. Простой и короткий ..

источник: http://coding-issues.blogspot.in/2012/11/sending-email-with-attachments-from-c.html

using System.Net;
using System.Net.Mail;

public void email_send()
{
    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
    mail.From = new MailAddress("your mail@gmail.com");
    mail.To.Add("to_mail@gmail.com");
    mail.Subject = "Test Mail - 1";
    mail.Body = "mail with attachment";

    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment("c:/textfile.txt");
    mail.Attachments.Add(attachment);

    SmtpServer.Port = 587;
    SmtpServer.Credentials = new System.Net.NetworkCredential("your mail@gmail.com", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}

21

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

Вот некоторые примеры приложений, которые не поддерживают новейшие стандарты безопасности:

  • Приложение Почта на вашем iPhone или iPad с iOS 6 или ниже
  • Почтовое приложение на вашем телефоне Windows Phone, предшествующее версии 8.1
  • Некоторые настольные почтовые клиенты, такие как Microsoft Outlook и Mozilla Thunderbird

Поэтому вы должны включить менее безопасный вход в свой аккаунт Google.

После входа в учетную запись Google перейдите на:

https://myaccount.google.com/lesssecureapps
или
https://www.google.com/settings/security/lesssecureapps

В C # вы можете использовать следующий код:

using (MailMessage mail = new MailMessage())
{
    mail.From = new MailAddress("email@gmail.com");
    mail.To.Add("somebody@domain.com");
    mail.Subject = "Hello World";
    mail.Body = "<h1>Hello</h1>";
    mail.IsBodyHtml = true;
    mail.Attachments.Add(new Attachment("C:\\file.zip"));

    using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
    {
        smtp.Credentials = new NetworkCredential("email@gmail.com", "password");
        smtp.EnableSsl = true;
        smtp.Send(mail);
    }
}

17

Чтобы заставить его работать, мне нужно было включить учетную запись Gmail, чтобы другие приложения могли получить к ней доступ. Это делается с помощью «включить менее безопасные приложения», а также с помощью этой ссылки: https://accounts.google.com/b/0/DisplayUnlockCaptcha


16

Вот моя версия: « Отправить письмо в C # с помощью Gmail ».

using System;
using System.Net;
using System.Net.Mail;

namespace SendMailViaGmail
{
   class Program
   {
   static void Main(string[] args)
   {

      //Specify senders gmail address
      string SendersAddress = "Sendersaddress@gmail.com";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "ReceiversAddress@yahoo.com";
      //Specify The password of gmial account u are using to sent mail(pw of sender@gmail.com)
      const string SendersPassword = "Password";
      //Write the subject of ur mail
      const string subject = "Testing";
      //Write the contents of your mail
      const string body = "Hi This Is my Mail From Gmail";

      try
      {
        //we will use Smtp client which allows us to send email using SMTP Protocol
        //i have specified the properties of SmtpClient smtp within{}
        //gmails smtp server name is smtp.gmail.com and port number is 587
        SmtpClient smtp = new SmtpClient
        {
           Host = "smtp.gmail.com",
           Port = 587,
           EnableSsl = true,
           DeliveryMethod = SmtpDeliveryMethod.Network,
           Credentials    = new NetworkCredential(SendersAddress, SendersPassword),
           Timeout = 3000
        };

        //MailMessage represents a mail message
        //it is 4 parameters(From,TO,subject,body)

        MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, body);
        /*WE use smtp sever we specified above to send the message(MailMessage message)*/

        smtp.Send(message);
        Console.WriteLine("Message Sent Successfully");
        Console.ReadKey();
     }

     catch (Exception ex)
     {
        Console.WriteLine(ex.Message);
        Console.ReadKey();
     }
    }
   }
 }

8
Хотя ваша статья может на самом деле ответить на вопрос, было бы предпочтительным включить здесь основные части ответа и предоставить ссылку для справки. Переполнение стека так же полезно, как и его вопросы и ответы, и если ваш хост блога отключится или ваши URL будут перемещены, этот ответ станет бесполезным. Спасибо!
Сарнольд

14

Я надеюсь, что этот код будет работать нормально. Вы можете попробовать.

// Include this.                
using System.Net.Mail;

string fromAddress = "xyz@gmail.com";
string mailPassword = "*****";       // Mail id password from where mail will be sent.
string messageBody = "Write the body of the message here.";


// Create smtp connection.
SmtpClient client = new SmtpClient();
client.Port = 587;//outgoing port for the mail.
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(fromAddress, mailPassword);


// Fill the mail form.
var send_mail = new MailMessage();

send_mail.IsBodyHtml = true;
//address from where mail will be sent.
send_mail.From = new MailAddress("from@gmail.com");
//address to which mail will be sent.           
send_mail.To.Add(new MailAddress("to@example.com");
//subject of the mail.
send_mail.Subject = "put any subject here";

send_mail.Body = messageBody;
client.Send(send_mail);

2
message send_mail = new MailMessage (); Как эта линия должна работать? Вы не можете неявно преобразовать «System.Net.Mail.MailMessage» в «System.Windows.Forms.Message»
Debaprasad

9

Включите это,

using System.Net.Mail;

А потом,

MailMessage sendmsg = new MailMessage(SendersAddress, ReceiversAddress, subject, body); 
SmtpClient client = new SmtpClient("smtp.gmail.com");

client.Port = Convert.ToInt16("587");
client.Credentials = new System.Net.NetworkCredential("mail-id@gmail.com","password");
client.EnableSsl = true;

client.Send(sendmsg);

8

Источник : Отправить письмо в ASP.NET C #

Ниже приведен пример рабочего кода для отправки по почте с использованием C #, в приведенном ниже примере я использую SMTP-сервер Google.

Код довольно понятен, замените адрес электронной почты и пароль на значения электронной почты и пароля.

public void SendEmail(string address, string subject, string message)
{
    string email = "yrshaikh.mail@gmail.com";
    string password = "put-your-GMAIL-password-here";

    var loginInfo = new NetworkCredential(email, password);
    var msg = new MailMessage();
    var smtpClient = new SmtpClient("smtp.gmail.com", 587);

    msg.From = new MailAddress(email);
    msg.To.Add(new MailAddress(address));
    msg.Subject = subject;
    msg.Body = message;
    msg.IsBodyHtml = true;

    smtpClient.EnableSsl = true;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = loginInfo;
    smtpClient.Send(msg);
}

Вместо var я использовал имя класса, например NetworkCredential, MailMessage и SmtpClient. Это работает для меня.
Jui Test

7

Если вы хотите отправить фоновое письмо, пожалуйста, сделайте следующее

 public void SendEmail(string address, string subject, string message)
 {
 Thread threadSendMails;
 threadSendMails = new Thread(delegate()
    {

      //Place your Code here 

     });
  threadSendMails.IsBackground = true;
  threadSendMails.Start();
}

и добавить пространство имен

using System.Threading;


5

Попробуй это,

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

            mail.From = new MailAddress("your_email_address@gmail.com");
            mail.To.Add("to_address");
            mail.Subject = "Test Mail";
            mail.Body = "This is for testing SMTP mail from GMAIL";

            SmtpServer.Port = 587;
            SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
            SmtpServer.EnableSsl = true;

            SmtpServer.Send(mail);
            MessageBox.Show("mail Send");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

4

использовать этот способ

MailMessage sendmsg = new MailMessage(SendersAddress, ReceiversAddress, subject, body); 
SmtpClient client = new SmtpClient("smtp.gmail.com");

client.Port = Convert.ToInt32("587");
client.EnableSsl = true;
client.Credentials = new System.Net.NetworkCredential("mail-id@gmail.com","MyPassWord");
client.Send(sendmsg);

Не забывайте это:

using System.Net;
using System.Net.Mail;

4

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


3

Изменение отправителя в электронной почте Gmail / Outlook.com:

Чтобы предотвратить подделку - Gmail / Outlook.com не позволяет отправлять сообщения с произвольного имени пользователя.

Если у вас ограниченное количество отправителей, вы можете следовать этим инструкциям, а затем установить Fromполе на этот адрес: отправка почты с другого адреса

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

        msg.ReplyToList.Add(new System.Net.Mail.MailAddress(email, friendlyName));

Это позволит вам просто нажать «ответить» в своей учетной записи электронной почты, чтобы ответить поклоннику вашей группы на странице обратной связи, но они не получат ваше фактическое электронное письмо, которое может привести к тонне спама.

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


3

У меня была та же проблема, но она была решена путем перехода в настройки безопасности gmail и приложения « Разрешить менее безопасным» . Код от Domenic & Donny работает, но только если вы включили этот параметр

Если вы вошли (в Google), вы можете перейти по этой ссылке и включить «Включить» для «Доступ к менее защищенным приложениям».


3
using System;
using System.Net;
using System.Net.Mail;

namespace SendMailViaGmail
{
   class Program
   {
   static void Main(string[] args)
   {

      //Specify senders gmail address
      string SendersAddress = "Sendersaddress@gmail.com";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "ReceiversAddress@yahoo.com";
      //Specify The password of gmial account u are using to sent mail(pw of sender@gmail.com)
      const string SendersPassword = "Password";
      //Write the subject of ur mail
      const string subject = "Testing";
      //Write the contents of your mail
      const string body = "Hi This Is my Mail From Gmail";

      try
      {
        //we will use Smtp client which allows us to send email using SMTP Protocol
        //i have specified the properties of SmtpClient smtp within{}
        //gmails smtp server name is smtp.gmail.com and port number is 587
        SmtpClient smtp = new SmtpClient
        {
           Host = "smtp.gmail.com",
           Port = 587,
           EnableSsl = true,
           DeliveryMethod = SmtpDeliveryMethod.Network,
           Credentials = new NetworkCredential(SendersAddress, SendersPassword),
           Timeout = 3000
        };

        //MailMessage represents a mail message
        //it is 4 parameters(From,TO,subject,body)

        MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, body);
        /*WE use smtp sever we specified above to send the message(MailMessage message)*/

        smtp.Send(message);
        Console.WriteLine("Message Sent Successfully");
        Console.ReadKey();
     }
     catch (Exception ex)
     {
        Console.WriteLine(ex.Message);
        Console.ReadKey();
     }
}
}
}

2

Вот один из способов отправки почты и получения учетных данных из web.config:

public static string SendEmail(string To, string Subject, string Msg, bool bodyHtml = false, bool test = false, Stream AttachmentStream = null, string AttachmentType = null, string AttachmentFileName = null)
{
    try
    {
        System.Net.Mail.MailMessage newMsg = new System.Net.Mail.MailMessage(System.Configuration.ConfigurationManager.AppSettings["mailCfg"], To, Subject, Msg);
        newMsg.BodyEncoding = System.Text.Encoding.UTF8;
        newMsg.HeadersEncoding = System.Text.Encoding.UTF8;
        newMsg.SubjectEncoding = System.Text.Encoding.UTF8;

        System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient();
        if (AttachmentStream != null && AttachmentType != null && AttachmentFileName != null)
        {
            System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(AttachmentStream, AttachmentFileName);
            System.Net.Mime.ContentDisposition disposition = attachment.ContentDisposition;
            disposition.FileName = AttachmentFileName;
            disposition.DispositionType = System.Net.Mime.DispositionTypeNames.Attachment;

            newMsg.Attachments.Add(attachment);
        }
        if (test)
        {
            smtpClient.PickupDirectoryLocation = "C:\\TestEmail";
            smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
        }
        else
        {
            //smtpClient.EnableSsl = true;
        }

        newMsg.IsBodyHtml = bodyHtml;
        smtpClient.Send(newMsg);
        return SENT_OK;
    }
    catch (Exception ex)
    {

        return "Error: " + ex.Message
             + "<br/><br/>Inner Exception: "
             + ex.InnerException;
    }

}

И соответствующий раздел в web.config:

<appSettings>
    <add key="mailCfg" value="yourmail@example.com"/>
</appSettings>
<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="yourmail@example.com">
      <network defaultCredentials="false" host="mail.exapmple.com" userName="yourmail@example.com" password="your_password" port="25"/>
    </smtp>
  </mailSettings>
</system.net>

2

Попробуй это

public static bool Send(string receiverEmail, string ReceiverName, string subject, string body)
{
        MailMessage mailMessage = new MailMessage();
        MailAddress mailAddress = new MailAddress("abc@gmail.com", "Sender Name"); // abc@gmail.com = input Sender Email Address 
        mailMessage.From = mailAddress;
        mailAddress = new MailAddress(receiverEmail, ReceiverName);
        mailMessage.To.Add(mailAddress);
        mailMessage.Subject = subject;
        mailMessage.Body = body;
        mailMessage.IsBodyHtml = true;

        SmtpClient mailSender = new SmtpClient("smtp.gmail.com", 587)
        {
            EnableSsl = true,
            UseDefaultCredentials = false,
            DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential("abc@gmail.com", "pass")   // abc@gmail.com = input sender email address  
                                                                           //pass = sender email password
        };

        try
        {
            mailSender.Send(mailMessage);
            return true;
        }
        catch (SmtpFailedRecipientException ex)
        { 
          // Write the exception to a Log file.
        }
        catch (SmtpException ex)
        { 
           // Write the exception to a Log file.
        }
        finally
        {
            mailSender = null;
            mailMessage.Dispose();
        }
        return false;
}

1

Проблема для меня заключалась в том, что в моем пароле была черная косая черта "\" , которую я скопировал, вставив, не осознавая, что это вызовет проблемы.


1

При копировании из другого ответа указанные выше методы работают, но gmail всегда заменяет электронную почту «от» и «ответить на» действительной учетной записью отправляющего gmail. по-видимому, есть обходной путь, однако:

http://karmic-development.blogspot.in/2013/10/send-email-from-aspnet-using-gmail-as.html

«3. На вкладке« Учетные записи »нажмите на ссылку« Добавить свой адрес электронной почты », а затем подтвердите его».

Или возможно это

Обновление 3: Читатель Дерек Беннетт говорит: «Решение состоит в том, чтобы войти в настройки Gmail: Учетные записи и« Сделать по умолчанию »учетную запись, отличную от вашей учетной записи Gmail. Это заставит Gmail переписать поле От с любым адресом электронной почты учетной записи по умолчанию». адрес."


1

Вы можете попробовать Mailkit. Это дает вам лучший и расширенный функционал для отправки почты. Вы можете найти больше из этого Вот пример

    MimeMessage message = new MimeMessage();
    message.From.Add(new MailboxAddress("FromName", "YOU_FROM_ADDRESS@gmail.com"));
    message.To.Add(new MailboxAddress("ToName", "YOU_TO_ADDRESS@gmail.com"));
    message.Subject = "MyEmailSubject";

    message.Body = new TextPart("plain")
    {
        Text = @"MyEmailBodyOnlyTextPart"
    };

    using (var client = new SmtpClient())
    {
        client.Connect("SERVER", 25); // 25 is port you can change accordingly

        // Note: since we don't have an OAuth2 token, disable
        // the XOAUTH2 authentication mechanism.
        client.AuthenticationMechanisms.Remove("XOAUTH2");

        // Note: only needed if the SMTP server requires authentication
        client.Authenticate("YOUR_USER_NAME", "YOUR_PASSWORD");

        client.Send(message);
        client.Disconnect(true);
    }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.