Надсилання електронної пошти в .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
Келлі

як надіслати файл за допомогою цього коду?
Ranadheer Reddy

Відповіді:


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 несподівано вирішить, що ви надсилали занадто багато за минулу кількість хвилин. Ви завжди повинні додати trySend, якщо він деякий час помиляється зі сном, а потім спробуйте знову.
Jason Short

72
Цікава примітка: Якщо ви поміняєте "UseDefaultCredentials = false" та "Credentials = ...", вони не автентифікуються.
Натан Уілер

13
Проблем із SPF при використанні цього методу немає. Кожен клієнт електронної пошти може бути налаштований саме так. У вас можуть виникнути проблеми, якщо ви використовуєте власний сервер (тобто щось інше, ніж smtp.gmail.com) something@gmail.comяк відправника. Btw: smtp.gmail.comавтоматично перезаписує адресу відправника, якщо він не ваш.
Майнерсбург

24
Мені важко було працювати над цим навіть при спробах різних налаштувань. Як було запропоновано у відповідній публікації, я виявив, що насправді мій антивірус перешкоджав успішному надсиланню електронних листів. Антивірус, про який йде мова, - McAffee, а його "Захист доступу" має категорію "Антивірусний стандартний захист", яка має правило "Запобігати масовим розсилкам черв'яків від надсилання електронної пошти". Якщо налаштувати / вимкнути це правило, цей код працює для мене!
yourbuddypal

18
Я отримував повідомлення про помилку, необхідне для перевірки автентифікації 5.5.1, поки не зрозумів, що тестую з обліковим записом (моїм особистим), на якому було включено двофакторну автентифікацію. Одного разу я використав обліковий запис, у якого цього не було, він працював чудово. Я також міг створити пароль для своєї програми, яку я тестував в особистому акті, але цього не хотів робити.
Нік ДеВор

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
Цікаво; він працює на моїй машині (TM). Але оскільки це здається правдоподібним, я додам це до своєї відповіді.
Доменік

3
Хм, я здогадуюсь, що SmtpDeliveryMethod.Network є типовим, але, можливо, дефолт змінюється під час роботи в IIS --- це було те, що ви робили?
Доменік

3
Я використовую той самий код у програмі Console, це через помилку "Помилка надсилання пошти".
Karthikeyan P

5
Ця відповідь не працює. Будь ласка, зверніть увагу на питання stackoverflow.com/questions/34851484 / ...

110

Для інших відповідей, які працюють "із сервера", спочатку увімкніть доступ для менш захищених програм у акаунті gmail.

Схоже, нещодавно Google змінив політику безпеки. Відповідь з найвищим рейтингом більше не працює, поки ви не зміните налаштування свого облікового запису, як описано тут: https://support.google.com/accounts/answer/6010255?hl=ukвведіть тут опис зображення

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

Станом на березень 2016 року google знову змінив налаштування!


4
Це працювало для мене. І також стосується. Не впевнений, що хочу вимкнути цю безпеку. Може знадобитися переосмислити ...
Саллі

4
З точки зору безпеки краще увімкнути двоетапну перевірку, а потім генерувати та використовувати пароль програми - див. Як надіслати електронний лист у .Net відповідно до нових правил безпеки?
Майкл Фрейджім

2
@BCS Software, програма inmy, користувач вставляє будь-який електронний лист, який моя програма повинна використовувати для надсилання повідомлення через. Отже, як я можу зробити так, щоб користувач електронної пошти міг надсилати повідомлення, навіть якщо ввімкнено двофакторну автентифікацію ??
Алаа '18

Це те саме налаштування, яке потрібно змінити, якщо ви хочете використовувати клієнт Microsoft Outlook (на робочому столі, мобільному телефоні тощо) для надсилання / отримання електронних листів через Google GMail.
Бретт Рігбі

41

Це надсилання електронного листа з вкладенням .. Просте і коротке ..

джерело: http://coding-isissue.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 або нижче
  • Додаток Mail на вашому телефоні Windows, що передує випуску 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-адреси переміщуються, ця відповідь стає марною. Дякую!
sarnold

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 = новий 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.Те працює для мене.
тест Джуї

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 завжди замінює електронну пошту "від" та "відповідь на" фактичним обліковим записом відправки. мабуть, є робота, однак:

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

"3. На вкладці" Облікові записи "натисніть на посилання" Додати іншу власну адресу електронної пошти ", а потім перевірте її"

Або, можливо, це

Оновлення 3: Читач Дерек Беннетт каже: "Рішення полягає в тому, щоб перейти до налаштувань 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.