Як я можу зробити SMTP автентифікованим на C #


75

Я створюю нову веб-програму ASP.NET, яка використовує SMTP для надсилання повідомлень. Проблема в тому, що smtp не пройшов аутентифікацію від того, хто надсилає повідомлення.

Як я можу зробити аутентифікацію SMTP у своїй програмі? чи має C # клас, який має атрибут для введення імені користувача та пароля?

Відповіді:


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

using(SmtpClient smtpClient = new SmtpClient())
{
    var basicCredential = new NetworkCredential("username", "password"); 
    using(MailMessage message = new MailMessage())
    {
        MailAddress fromAddress = new MailAddress("from@yourdomain.com"); 

        smtpClient.Host = "mail.mydomain.com";
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = basicCredential;

        message.From = fromAddress;
        message.Subject = "your subject";
        // Set IsBodyHtml to true means you can send HTML email.
        message.IsBodyHtml = true;
        message.Body = "<h1>your message body</h1>";
        message.To.Add("to@anydomain.com"); 

        try
        {
            smtpClient.Send(message);
        }
        catch(Exception ex)
        {
            //Error, could not send the message
            Response.Write(ex.Message);
        }
    }
}

Ви можете використовувати наведений вище код.


2
звідки походить ім’я користувача та пароль? а що таке mail.mydomain.com? це його ім'я DNS?
Shyju

5
це ваша адреса електронної пошти та пароль, mail.mydomain.com - ваш SMTP-сервер (наприклад, smtp.gmail.com).
Короткий перегляд

2
Вам слід обернути об'єкт MailMessage в оператор using (або викликати Dispose on it after your done), так?
Бен,

Зазвичай вам також потрібно буде налаштувати порт. Це можна зробити, скориставшись властивістю порту, наприкладsmtpClient.Port(123)
Wouter Vanherck

@Arief: Привіт, ти можеш перевірити моє запитання? stackoverflow.com/questions/56604850/ ... будь-яка пропозиція щодо того, як зробити нашу функцію надсилання пошти не в якості зовнішніх відправників?
Амір

89

Переконайтеся, що ви встановили телефон SmtpClient.Credentials після дзвінка SmtpClient.UseDefaultCredentials = false.

Порядок важливий, оскільки налаштування SmtpClient.UseDefaultCredentials = falseбуде скинуто SmtpClient.Credentialsдо нуля.


При використанні Sendgrid і замовлення неправильне - він поверне повідомлення про помилку: "Поштова скринька недоступна. Відповідь сервера була: Неавтентифіковані відправники заборонені". Встановлення ідентифікаційних даних після прапора UseDefaultCredentials вирішує цю проблему
Marcinu,


2

Щоб надіслати повідомлення через TLS / SSL, потрібно встановити для Ssl класу SmtpClient значення true.

string to = "jane@contoso.com";
string from = "ben@contoso.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an e-mail message from an application very easily.";
SmtpClient client = new SmtpClient(server);
// Credentials are necessary if the server requires the client 
// to authenticate before it will send e-mail on the client's behalf.
client.UseDefaultCredentials = true;
client.EnableSsl = true;
client.Send(message);

напишіть приклад коду про SSL проти SMTP-клієнта, щоб отримати кращу відповідь
Нікола Лукіч

1

Як ви надсилаєте повідомлення?

Класи у System.Net.Mailпросторі імен (а це, мабуть, саме те, що вам слід використовувати) мають повну підтримку автентифікації, або вказану в Web.config, або за допомогою SmtpClient.Credentialsвластивості.


0

У моєму випадку навіть після дотримання всього вищесказаного. Мені довелося оновити свій проект із .net 3.5 до .net 4 для авторизації проти нашого внутрішнього поштового сервера Exchange 2010.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.