Надсилання E-Mail. Програмне відправлення email, використовуючи різні сервіси Відправлення листа з вкладенням c#

останнє оновлення: 31.10.2015

Для надсилання пошти в Інтернеті використовується протокол SMTP (Simple Mail Transfer Protocol). Цей протокол вказує, як поштові сервери взаємодіють під час передачі електронної пошти.

Для роботи з протоколом SMTP та надсилання електронної пошти в .NET призначений клас SmtpClient із простору імен System.Net.Mail.

Цей клас визначає ряд властивостей, які дозволяють налаштувати надсилання:

    Host: smtp-сервер, з якого здійснюється надсилання пошти. Наприклад, smtp.yandex.ru

    Port: порт, який використовується SMP-сервером. Якщо не вказано, за замовчуванням використовується 25 порт.

    Credentials: автентифікаційні дані відправника

    EnableSsl: вказує, чи використовуватиметься протокол SSLпри відправленні

Ще одним ключовим класом, який використовується при надсиланні, є MailMessage . Цей клас є повідомленням, що надсилається. Серед його властивостей можна виділити такі:

    Attachments: містить всі прикріплення до листа

    Body: безпосередньо текст листа

    Від: адреса відправника. Представляє об'єкт MailAddress

    To: адреса одержувача. Також представляє об'єкт MailAddress

    Subject: визначає тему листа

    IsBodyHtml: вказує, чи містить лист вміст з кодом html

Використовуємо ці класи та виконаємо надсилання листа:

Using System; using System.Net; using System.IO; використовуючи System.Threading.Tasks; using System.Net.Mail; namespace NetConsoleApp (class Program (static void Main(string args)) (// відправник - встановлюємо адресу та відображається в листі ім'я MailAddress from = new MailAddress(" [email protected]", "Tom"); // кому відправляємо MailAddress to = new MailAddress(" [email protected]"); // створюємо об'єкт повідомлення MailMessage m = new MailMessage(from, to); // тема листа m.Subject = "Тест"; // текст листа m.Body = "

Лист-тест роботи smtp-клієнта

// лист представляє код html m.IsBodyHtml = true; // адресу smtp-сервера та порт, з якого надсилатимемо лист SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587); // логін та пароль smtp.Credentials = new NetworkCredential(" [email protected]", "mypassword"); smtp.EnableSsl = true; smtp.Send(m); Console.Read(); ) ) )

Для відправки застосовується метод Send() , який передається об'єкт MailMessage.

Також ми можемо використовувати асинхронну версію надсилання за допомогою методу SendMailAsync:

Using System; using System.Net; using System.IO; використовуючи System.Threading.Tasks; using System.Net.Mail; namespace NetConsoleApp ( class Program ( static void Main(string args) ( SendEmailAsync().GetAwaiter(); Console.Read(); ) private static async Task SendEmailAsync() ( MailAddress from = new MailAddress(" [email protected]", "Tom"); MailAddress to = new MailAddress(" [email protected]"); MailMessage m = New MailMessage(from, to); m.Subject = "Тест"; m.Body = "Лист-тест 2 роботи smtp-клієнта"; SmtpClient , 587); [email protected]", "mypassword"); smtp.EnableSsl = true; await smtp.SendMailAsync(m); Console.WriteLine("Лист відправлений");

Додавання вкладень

До листа ми можемо прикріпити вкладення за допомогою властивості Attachments. Кожне вкладення представляє об'єкт System.Net.Mail.Attachment:

MailAddress from = new MailAddress(" [email protected]", "Tom"); MailAddress to = new MailAddress(" [email protected]"); MailMessage m = новий MailMessage(from, to);

Командир судна 14 жовтня 2013 о 19:29

Програмне відправлення email, використовуючи різні сервіси

  • .NET,

Дуже часто доводиться стикатися з відправкою електронних листівз програмного коду. За прикладами далеко не треба ходити.

Ця стаття є підказкою і не відкриває нічого нового, але перш ніж її писати, подивився схоже в інтернеті і був досить здивований тому, що майже скрізь пропонують або не працююче або застаріле рішення, або написано неписьменно.

Перше, що не варто робити за цими прикладами – це використовувати System.Web.Mail, який вже давно застарів, а починаючи з Visual Studio 2010 бібліотеку System.Web навіть і не додати, не знаючи повного шляхудо відповідної DLL.
Замість цього пропонується використовувати бібліотеку System.Net.
using System.Net; using System.Net.Mail;
Отже, найпростіше, воно ж найважливіше і найчастіше використовується - це відправлення листа зі свого поштового сервера, на якому настроєно SMTP-клієнт. Як ви розумієте, сервер може бути як і той, на якому працює програма, так і віддалений, на якому у вас є право надсилати листи без додаткової авторизації.

Приклад коду для надсилання листа з локальної машини:
", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; mm.IsBodyHtml = false; using (SmtpClient sc = new SmtpClient("127.0.0.1")) поштового сервера та порт, якщо потрібно sc.Send(mm); ) )

За допомогою поштових служб, таких як Gmail, Yandex, Mail.ru і т.д. все те саме, тільки додаються параметри з авторизацією.

SMTP-сервер: smtp.gmail.com
Порт: 587
using (MailMessage mm = новий MailMessage("Name ", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; EnableSsl=true;sc.DeliveryMethod=SmtpDeliveryMethod.Network;sc.UseDefaultCredentials=false;sc.Credentials=new NetworkCredential(" [email protected]", "GmailPassword"); sc.Send(mm); ) )

SMTP-сервер: smtp.yandex.ru
Порт: 25
using (MailMessage mm = новий MailMessage("Name ", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; EnableSsl=true;sc.DeliveryMethod=SmtpDeliveryMethod.Network;sc.UseDefaultCredentials=false;sc.Credentials=new NetworkCredential(" [email protected]", "YandexPassword"); sc.Send(mm); ) )

SMTP-сервер: smtp.mail.ru
Порт: 25
using (MailMessage mm = новий MailMessage("Name ", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; EnableSsl=true;sc.DeliveryMethod=SmtpDeliveryMethod.Network;sc.UseDefaultCredentials=false;sc.Credentials=new NetworkCredential(" [email protected]", "MailRuPassword"); sc.Send(mm); ) )
Якщо у вас Поштова скринькана сервісі mail.ru закінчується на inbox.ru, list.ru або bk.ru, відповідно змінюється і адреса SMTP-сервера (smtp.inbox.ru, smtp.list.ru і smtp.bk.ru).

Як ви бачите, щоб використовувати будь-який інший поштовий сервіс у ваших програмах, необхідно тільки з'ясувати адресу SMTP-сервера і порт, а також правила авторизації.

Необхідно також пам'ятати, що майже всі сторонні поштові послуги накладають ліміти на кількість надісланих листів у період часу.

email, відправка листів, smtp

Однією з найбільш потрібних функцій на сайті є форма заявки або замовлення, дані з якої надсилаються на пошту власнику сайту. Як правило, такі форми є простими і складаються з двох трьох полів для введення даних. Як створити таку форму замовлення? Тут потрібне використання мови розмітки HTML та мови програмування PHP.

Мова розмітки HTML сама по собі нескладна, потрібно лише розібратися в тому як і де ставити ті чи інші теги. З мовою програмування PHP все трохи складніше.

Для програміста створити таку форму не важко, а ось HTML верстальнику може здатися складним деякі дії.

Створюємо форму відправлення даних у html

Перший рядок буде наступним

Це важливий елемент форми. У ньому ми вказуємо яким способом будуть передаватися дані та якого файлу. У цьому випадку все передається методом POST файлу send.php. Програма в цьому файлі відповідно повинна прийняти дані, вони будуть утримуватися в масиві, і відправити їх на вказану email адресу.

Повернемося до форми. Другий рядок міститиме поле для введення ПІБ. Має наступний код:

Тип форми text, тобто, користувач зможе ввести або скопіювати сюди текст з клавіатури. Під параметром name міститься назва форми. В даному випадку це fio, саме під таким ім'ям буде передаватися все, що користувач введений у поле. Параметр placeholder вказує на те, що буде записано в цьому полі як пояснення.

Наступний рядок:

Тут практично все те ж саме, але ім'я для поля вказано email, а в поясненні вказано, щоб користувач у цю форму ввів свою адресу електронної пошти.

Наступним рядком буде кнопка "надіслати":

І останнім рядком у формі буде тег

Тепер зберемо всі разом.





Тепер зробимо так, щоб поля у формі стали обов'язковими для заповнення. Маємо наступний код:





Створюємо файл, який приймає дані з HTML форми

Це буде файл із ім'ям send.php

У файлі першому етапі потрібно прийняти дані з пост масиву. Для цього створюємо дві змінні:

$fio = $_POST["fio"];
$email = $_POST["email"];

Перед назвами змінних у php ставиться знак $, наприкінці кожного рядка ставиться крапка з комою. $_POST це масив у який передаються даний з форми. У формі html при цьому вказаний метод надсилання method = "post". Так, прийнято дві змінні з форми html. Для цілей захисту свого сайту потрібно провести ці змінні через кілька фільтрів – функцій php.

Перша функція перетворює всі символи, які користувач спробує додати до форми:

При цьому нові змінні в PHP не створюються, а використовуються вже існуючі. Що зробить фільтр, він перетворює символ "<" в "<". Также он поступить с другими символами, встречающимися в html коде.

Друга функція декодує url, якщо користувач спробує додати його у форму.

$fio = urldecode($fio);
$email = urldecode($email);

Третьою функцією ми видалимо прогалини з початку і кінця рядка, якщо такі є:

$ fio = trim ($ fio);
$ email = trim ($ email);

Існують інші функції, що дозволяють відфільтрувати змінні php. Їх використання залежить від того, наскільки ви побоюєтеся того, що зловмисник спробує додати програмний код до цієї форми відправлення даних на пошту html.

Перевірка даних, що передаються від HTML форми у файл PHP

Для того, щоб перевірити, чи цей код працює, чи передаються дані можна просто їх вивести на екран за допомогою функції echo:

echo $fio;
echo "
";
echo $email;

Другий рядок тут потрібний для того, щоб розділити виведення змінних php на різні рядки.

Надсилаємо отримані дані з форми HTML на пошту за допомогою PHP

Для надсилання даних на пошту потрібно скористатися функцією mail у PHP.

mail("на яку адресу відправити", "тема листа", "Повідомлення (тіло листа)","From: з якого email відправляється лист \r\n");

Наприклад, потрібно надіслати дані на email власника сайту чи менеджера [email protected]

Тема листа має бути зрозумілою, а повідомлення листа має містити те, що вказав користувач у формі HTML.

mail(" [email protected]", "Заявка із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected]\r\n");

Необхідно додати умову, яка перевірить чи відправилася форма за допомогою PHP на вказану адресу електронної пошти.

if (mail(" [email protected]", "Замовлення із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected]\r\n"))
{
echo "повідомлення успішно надіслано";
) else (
}

Таким чином, програмний код файлу send.php, який відправить дані HTML форми на пошту, буде виглядати наступним чином:

$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$ fio = trim ($ fio);
$ email = trim ($ email);
// echo $ fio;
// echo "
";
// echo $ email;
if (mail(" [email protected]", "Заявка із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected]\r\n"))
( echo "повідомлення успішно надіслано");
) else (
echo "при надсиланні повідомлення виникли помилки";
}?>

Три рядки для перевірки, чи передаються дані у файл закоментовані. При необхідності їх можна видалити, тому що вони були потрібні тільки для налагодження.

Поміщаємо HTML та PHP код відправлення форми в один файл

У коментарях до цієї статті багато хто запитує про те, як зробити, щоб і HTML форма і PHP код відправки даних на пошту знаходилися в одному файлі, а не двох.

Для реалізації такої роботи потрібно помістити HTML код форми у файл send.php і додати умову, яка перевірятиме наявність змінних у масиві POST (цей масив передається з форми). Тобто якщо змінні в масиві не існують, то потрібно показати користувачеві форму. Інакше потрібно прийняти дані з масиву та надіслати їх адресату.

Давайте подивимося, як змінити PHP код у файлі send.php:



Форма заявки із сайту


//перевіряємо, чи існують змінні в масиві POST
if(!isset($_POST["fio"]) and !isset($_POST["email"]))(
?>





) else (
//показуємо форму
$fio = $_POST["fio"];
$email = $_POST["email"];
$fio = htmlspecialchars($fio);
$email = htmlspecialchars($email);
$fio = urldecode($fio);
$email = urldecode($email);
$ fio = trim ($ fio);
$ email = trim ($ email);
if (mail(" [email protected]", "Заявка із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected]\r\n"))(
echo "Повідомлення успішно надіслано";
) else (
echo "При надсиланні повідомлення виникли помилки";
}
}
?>



Існування змінної в POST масиві ми перевіряємо PHP функцією isset(). Знак оклику перед цією функцією в умові означає заперечення. Тобто якщо змінної не існує, то треба показати нашу форму. Якби я не поставив знак оклику, то умова дослівно означало б - "якщо існує, то показати форму". А це неправильно у нашому випадку. Звичайно, ви можете перейменувати його в index.php. Якщо будуть перейменовувати файл, то не забудьте перейменувати назву файлу і в рядку

. Форма повинна посилатися на цю сторінку, наприклад index.php. До коду я додав заголовок сторінки.

Часті помилки, що виникають під час відправки PHP форми з сайту

Перша, напевно, найпопулярніша помилка, це коли ви бачите порожню білу сторінку без повідомлень. Це означає, що ви припустилися помилки в коді сторінки. Вам потрібно включити відображення всіх помилок в PHP і тоді ви побачите, де помилка. Додати до коду:

ini_set("display_errors","On");
error_reporting("E_ALL");

Файл send.php повинен запускатися лише на сервері, інакше код просто не працюватиме. Бажано, щоб це був не локальний сервер, оскільки він не завжди налаштований на надсилання даних на зовнішній поштовий сервер. Якщо ви запустите код на сервері, то вам відобразиться код PHP прямо на сторінці.

Таким чином, для коректної роботи я рекомендую розмістити файл send.php на хостинг сайту. Там, як правило, все налаштовано.

Ще одна часта помилка, коли з'являється повідомлення "Повідомлення успішно відправлено", а лист не надходить на пошту. У цьому випадку слід уважно перевірити рядок:

if (mail(" [email protected]", "Замовлення із сайту", "ПІБ:".$fio.". E-mail: ".$email ,"From: [email protected]\r\n"))

Замість [email protected] повинна бути email адреса на яку потрібно надіслати листа, а замість[email protected] має бути існуючий email даного сайту. Наприклад, для сайту сайт це буде . Тільки в цьому випадку лист із даними з форми буде надіслано.

Командир судна 14 жовтня 2013 о 19:29

Програмне відправлення email, використовуючи різні сервіси

Дуже часто доводиться стикатися з надсиланням електронних листів із програмного коду. За прикладами далеко не треба ходити.

Ця стаття є підказкою і не відкриває нічого нового, але перш ніж її писати, подивився схоже в інтернеті і був досить здивований тому, що майже скрізь пропонують або не працююче або застаріле рішення, або написано неписьменно.

Перше, що не варто робити за цими прикладами – це використовувати System.Web.Mail, який вже давно застарів, а починаючи з Visual Studio 2010 бібліотеку System.Web навіть не додати, не знаючи повного шляху до відповідної DLL.
Замість цього пропонується використовувати бібліотеку System.Net.
using System.Net; using System.Net.Mail;
Отже, найпростіше, воно ж найважливіше і найчастіше використовується - це надсилання листа зі свого поштового сервера, на якому налаштований SMTP-клієнт. Як ви розумієте, сервер може бути як і той, на якому працює програма, так і віддалений, на якому у вас є право надсилати листи без додаткової авторизації.

Приклад коду для надсилання листа з локальної машини:
", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; mm.IsBodyHtml = false; using (SmtpClient sc = new SmtpClient("127.0.0.1")) поштового сервера та порт, якщо потрібно sc.Send(mm); ) )

За допомогою поштових служб, таких як Gmail, Yandex, Mail.ru і т.д. все те саме, тільки додаються параметри з авторизацією.

SMTP-сервер: smtp.gmail.com
Порт: 587
using (MailMessage mm = новий MailMessage("Name ", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; EnableSsl=true;sc.DeliveryMethod=SmtpDeliveryMethod.Network;sc.UseDefaultCredentials=false;sc.Credentials=new NetworkCredential(" [email protected]", "GmailPassword"); sc.Send(mm); ) )

SMTP-сервер: smtp.yandex.ru
Порт: 25
using (MailMessage mm = новий MailMessage("Name ", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; EnableSsl=true;sc.DeliveryMethod=SmtpDeliveryMethod.Network;sc.UseDefaultCredentials=false;sc.Credentials=new NetworkCredential(" [email protected]", "YandexPassword"); sc.Send(mm); ) )

SMTP-сервер: smtp.mail.ru
Порт: 25
using (MailMessage mm = новий MailMessage("Name ", "[email protected]"))( mm.Subject = "Mail Subject"; mm.Body = "Mail Body"; EnableSsl=true;sc.DeliveryMethod=SmtpDeliveryMethod.Network;sc.UseDefaultCredentials=false;sc.Credentials=new NetworkCredential(" [email protected]", "MailRuPassword"); sc.Send(mm); ) )
Якщо у вас поштова скринька на сервісі mail.ru закінчується на inbox.ru, list.ru або bk.ru, то відповідно змінюється адреса SMTP-сервера (smtp.inbox.ru, smtp.list.ru і smtp.bk.ru ).

Як ви бачите, щоб використовувати будь-який інший поштовий сервіс у ваших програмах, необхідно тільки з'ясувати адресу SMTP-сервера і порт, а також правила авторизації.

Необхідно також пам'ятати, що майже всі сторонні поштові послуги накладають ліміти на кількість надісланих листів у період часу.

email, відправка листів, smtp

Добрий день. Оскільки графоманія у мене прогресує, вирішив додати ще одну статтю. Стаття буде, як завжди, з прикладами на C#, але більш-умілий VB"шник з легкістю перепише весь код під VB.NET.

Почнемо, мабуть

Для надсилання електронної пошти нам потрібно скористатися трьома об'єктами. System.Net.Mail.SmtpClient для надсилання повідомлення, System.Net.Mail.MailMessage для представлення повідомлення та System.Net.NetworkCredential для авторизації.

Створимо клієнт:

Var client = New SmtpClient("$Mail-Server-Address$", $Mail-Server-Port$);

Референція конструктора:

SmtpClient(string host, int port);

Створимо екземпляр класу MailMessage:

Var msg = New MailMessage("from", "to");

Тепер поставимо тему і вміст листа (до речі, все можна поставити і в конструкторі). А також логін та пароль smtp-клієнту. Потім відправимо листа методом Send нашого об'єкта client:

Var client = New SmtpClient("smtp.yandex.ru"); var msg = New MailMessage("from", "to"); msg.Subject="My test message"; msg.Body = "Hello, мій хлопець! Just imagine, що я just written a incredible program для того, щоб скористатися нею літературою до вас на 10000000000000000!"; msg.SubjectEncoding = Encoding.UTF8; msg.BodyEncoding = Encoding.UTF8; // пріоритет msg.Priority = MailPriority.High; // Тіло листа в html? msg.IsBodyHtml = false; client.Credentials = new NetworkCredential("login", "password"); client.Send(msg);

От і все. Не забудьте всі необхідні дані вказати правильно.


Коментарі ()

ruslang02 30

CoolHacker, чи можна у тебе взяти цей код для 3 частини веб-броузера?

Coolhacker 770 ruslang02 30

Дякую, я його використовуватиму для відправки посилань по e-mail
як у FireFox

LetSevI 10

Завантаження...
Top