останнє оновлення: 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-клієнт. Як ви розумієте, сервер може бути як і той, на якому працює програма, так і віддалений, на якому у вас є право надсилати листи без додаткової авторизації.
Приклад коду для надсилання листа з локальної машини:
За допомогою поштових служб, таких як Gmail, Yandex, Mail.ru і т.д. все те саме, тільки додаються параметри з авторизацією.
SMTP-сервер: smtp.gmail.com
Порт: 587
using (MailMessage mm = новий MailMessage("Name
SMTP-сервер: smtp.yandex.ru
Порт: 25
using (MailMessage mm = новий MailMessage("Name
SMTP-сервер: smtp.mail.ru
Порт: 25
using (MailMessage mm = новий MailMessage("Name
Якщо у вас Поштова скринькана сервісі 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
Перший рядок буде наступним
Тепер зберемо всі разом.
Тепер зробимо так, щоб поля у формі стали обов'язковими для заповнення. Маємо наступний код:
Створюємо файл, який приймає дані з 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. Якщо будуть перейменовувати файл, то не забудьте перейменувати назву файлу і в рядку