Как отправлять электронные письма с помощью библиотеки phpmailer

Установка

  1. Добавьте в ваш composer.json в раздел :

    "require" {
        "marvin255/bxmailer" "~1.0"
    }
  2. Если требуется автоматическое обновление модуля через composer, то добавьте в раздел :

    "scripts" {
        "post-install-cmd" ,
        "post-update-cmd" 
    }
  3. Выполните в консоли внутри вашего проекта:

  4. Если пункт 2 не выполнен, то скопируйте папку в папку вашего проекта. А папку в папку .

  5. Установите модуль в административном разделе 1С-Битрикс «Управление сайтом».

  6. Добавьте строку в вашего сайта.

Обычная

  1. Скачайте архив с репозиторием.
  2. Скопируйте папку в папку вашего проекта. А папку в папку .
  3. Установите модуль в административном разделе 1С-Битрикс «Управление сайтом».
  4. Добавьте строку в вашего сайта.

Class Features

  • Probably the world’s most popular code for sending email from PHP!
  • Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more
  • Integrated SMTP support — send without a local mail server
  • Send emails with multiple To, CC, BCC and Reply-to addresses
  • Multipart/alternative emails for mail clients that do not read HTML email
  • Add attachments, including inline
  • Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings
  • SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SSL and SMTP+STARTTLS transports
  • Validates email addresses automatically
  • Protect against header injection attacks
  • Error messages in over 50 languages!
  • DKIM and S/MIME signing support
  • Compatible with PHP 5.5 and later
  • Namespaced to prevent name clashes
  • Much more!

Копирование входящей и исходящей почты

Дублирование всей почты

Открываем конфигурационный файл mail.cf:

vi /etc/postfix/main.cf

Добавляем следующую строчку:

always_bcc = backup@domain.ru

* вся почта будет дублироваться на электронный ящик backup@domain.ru.

Перезапускаем postfix:

systemctl restart postfix

Для исходящих сообщений

Открываем конфигурационный файл:

vi /etc/postfix/main.cf

Добавляем следующее:

sender_bcc_maps = hash:/etc/postfix/sender_bcc_map

* при данной настройке все исходящие сообщения будут копироваться по правилам в файле /etc/postfix/sender_bcc_map;

Теперь открываем данный файл и вносим, примерно, следующее:

vi /etc/postfix/sender_bcc_map

user1@domain.ru backup1@domain.ru
@domain2.ru backup2@domain.ru

* в данном примере все сообщения от пользователя user1@domain.ru будут копироваться на почтовый ящик backup1@domain.ru; все письма от домена @domain2.ru будут копироваться на backup2@domain.ru.

Создаем карту:

postmap /etc/postfix/sender_bcc_map

И перезапускаем почтовый сервер:

systemctl restart postfix

Для входящих сообщений

Открываем конфигурационный файл:

vi /etc/postfix/main.cf

Добавляем следующее:

recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_map

* при данной настройке все входящие сообщения будут копироваться по правилам в файле /etc/postfix/recipient_bcc_map.

Теперь открываем данный файл и вносим, примерно, следующее:

vi /etc/postfix/recipient_bcc_map

user1@domain.ru backup1@domain.ru
@domain2.ru backup2@domain.ru

* в данном примере все сообщения пользователю user1@domain.ru будут копироваться на почтовый ящик backup1@domain.ru; все письма на домен @domain2.ru будут копироваться на backup2@domain.ru.

Создаем карту:

postmap /etc/postfix/recipient_bcc_map

И перезапускаем почтовый сервер:

systemctl restart postfix

A Simple Example

<?php 
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Load Composer's autoloader
require 'vendor/autoload.php';

// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
    $mail->isSMTP();                                            // Send using SMTP
    $mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
    $mail->Username   = 'user@example.com';                     // SMTP username
    $mail->Password   = 'secret';                               // SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` also accepted
    $mail->Port       = 587;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    // Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body in bold!';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

You’ll find plenty more to play with in the examples folder.

That’s it. You should now be ready to use PHPMailer!

String Attachments

The method works just like , but you pass the actual contents of the item instead of a file system path. The parameter is required as it’s used to provide a filename for the string data at the receiver end.

It also accepts the same other parameters as described above.

So, why use instead of ? Is it for text-only files? No, not at all. It’s primarily for databases and other non-file content. Data stored in a database is always stored as a string (or a BLOB: Binary Large OBject). You could query your database for an image stored as a BLOB and pass the resulting string to the .

If you want to use a remote URL for getting your content (for example getting PDF content from a remote URL), just do this:

$mail->addStringAttachment(file_get_contents($url), 'myfile.pdf');

Legacy versions

PHPMailer 5.2 (which is compatible with PHP 5.0 — 7.0) is no longer being supported, even for security updates. You will find the latest version of 5.2 in the 5.2-stable branch. If you’re using PHP 5.5 or later (which you should be), switch to the 6.x releases.

Upgrading from 5.2

The biggest changes are that source files are now in the folder, and PHPMailer now declares the namespace . This has several important effects – read the upgrade guide for more details.

Minimal installation

While installing the entire package manually or with Composer is simple, convenient, and reliable, you may want to include only vital files in your project. At the very least you will need src/PHPMailer.php. If you’re using SMTP, you’ll need src/SMTP.php, and if you’re using POP-before SMTP, you’ll need src/POP3.php. You can skip the language folder if you’re not showing errors to users and can make do with English-only errors. If you’re using XOAUTH2 you will need src/OAuth.php as well as the Composer dependencies for the services you wish to authenticate with. Really, it’s much easier to use Composer!

History

  • PHPMailer was originally written in 2001 by Brent R. Matzelle as a SourceForge project.
  • Marcus Bointon (coolbru on SF) and Andy Prevost (codeworxtech) took over the project in 2004.
  • Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski.
  • Marcus created his fork on GitHub in 2008.
  • Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013.
  • PHPMailer moves to the PHPMailer organisation on GitHub in 2013.

What’s changed since moving from SourceForge?

  • Official successor to the SourceForge and Google Code projects.
  • Test suite.
  • Continuous integration with Travis-CI.
  • Composer support.
  • Public development.
  • Additional languages and language strings.
  • CRAM-MD5 authentication support.
  • Preserves full repo history of authors, commits and branches from the original SourceForge project.

Отправка писем через SMTP

Для того чтобы отправлять письма через SMTP, достаточно добавить настройки SMTP в конец массива файла /protected/config/mail.php, пример отправки писем через gmail:

'Mailer' => 'smtp',
'Host' => 'smtp.gmail.com',
'Port' => 465,
'SMTPSecure' => 'ssl',
'SMTPAuth' => true,
'Username' => 'yourEmail@gmail.com',
'Password' => '********',

В итоге файл настроек /protected/config/mail.php примет следующий вид:

<?php return array(
    'viewPath' => 'application.views.mail',
    'layoutPath' => 'application.views.layouts',
    'baseDirPath' => 'webroot.images.mail',
    'savePath' => 'webroot.assets.mail',
    'testMode' => false,
    'layout' => 'mail',
    'CharSet' => 'UTF-8',
    'AltBody' => Yii::t('YiiMailer', 'You need an HTML capable viewer to read this message.'),

    'language' => array(
        'authenticate' => Yii::t('YiiMailer', 'SMTP Error: Could not authenticate.'),
        'connect_host' => Yii::t('YiiMailer', 'SMTP Error: Could not connect to SMTP host.'),
        'data_not_accepted' => Yii::t('YiiMailer', 'SMTP Error: Data not accepted.'),
        'empty_message' => Yii::t('YiiMailer', 'Message body empty'),
        'encoding' => Yii::t('YiiMailer', 'Unknown encoding: '),
        'execute' => Yii::t('YiiMailer', 'Could not execute: '),
        'file_access' => Yii::t('YiiMailer', 'Could not access file: '),
        'file_open' => Yii::t('YiiMailer', 'File Error: Could not open file: '),
        'from_failed' => Yii::t('YiiMailer', 'The following From address failed: '),
        'instantiate' => Yii::t('YiiMailer', 'Could not instantiate mail function.'),
        'invalid_address' => Yii::t('YiiMailer', 'Invalid address'),
        'mailer_not_supported' => Yii::t('YiiMailer', ' mailer is not supported.'),
        'provide_address' => Yii::t('YiiMailer', 'You must provide at least one recipient email address.'),
        'recipients_failed' => Yii::t('YiiMailer', 'SMTP Error: The following recipients failed: '),
        'signing' => Yii::t('YiiMailer', 'Signing Error: '),
        'smtp_connect_failed' => Yii::t('YiiMailer', 'SMTP Connect() failed.'),
        'smtp_error' => Yii::t('YiiMailer', 'SMTP server error: '),
        'variable_set' => Yii::t('YiiMailer', 'Cannot set or reset variable: ')
    ),

    'Mailer' => 'smtp',
    'Host' => 'smtp.gmail.com',
    'Port' => 465,
    'SMTPSecure' => 'ssl',
    'SMTPAuth' => true,
    'Username' => 'yourEmail@gmail.com',
    'Password' => '********',
);

Отправка письма вызывается как и в обычном режиме:

$mail = new YiiMailer();
$mail->setFrom('from@example.com', 'Test User');
$mail->setTo('to@example.com');
$mail->setSubject('Тема письма');
$mail->setBody('Содержание письма');
if ($mail->send()) {
    Yii::app()->user->setFlash('contact','Письмо успешно отправлено');
} else {
    Yii::app()->user->setFlash('error','Ошибка при отправке письма: ' . $mail->getError());
}

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

$mail->setSmtp('smtp.gmail.com', 465, 'ssl', true, 'yourEmail@gmail.com', '********');

Подробнее:

$mail = new YiiMailer();
$mail->setSmtp('smtp.gmail.com', 465, 'ssl', true, 'yourEmail@gmail.com', '********');
$mail->setFrom('from@example.com', 'Test User');
$mail->setTo('to@example.com');
$mail->setSubject('Тема письма');
$mail->setBody('Содержание письма');
if ($mail->send()) {
    Yii::app()->user->setFlash('contact','Письмо успешно отправлено');
} else {
    Yii::app()->user->setFlash('error','Ошибка при отправке письма: ' . $mail->getError());
}

Security

Please disclose any vulnerabilities found responsibly — report any security problems found to the maintainers privately.

PHPMailer versions prior to 5.2.22 (released January 9th 2017) have a local file disclosure vulnerability, CVE-2017-5223. If content passed into is sourced from unfiltered user input, relative paths can map to absolute local file paths and added as attachments. Also note that (just like , , , etc) should not be passed user-sourced params either! Reported by Yongxiang Li of Asiasecurity.

PHPMailer versions prior to 5.2.20 (released December 28th 2016) are vulnerable to CVE-2016-10045 a remote code execution vulnerability, responsibly reported by Dawid Golunski, and patched by Paul Buonopane (@Zenexer).

PHPMailer versions prior to 5.2.18 (released December 2016) are vulnerable to CVE-2016-10033 a critical remote code execution vulnerability, responsibly reported by Dawid Golunski.

See SECURITY for more detail on security issues.

Localization

PHPMailer defaults to English, but in the language folder you’ll find many translations for PHPMailer error messages that you may encounter. Their filenames contain ISO 639-1 language code for the translations, for example for French. To specify a language, you need to tell PHPMailer which one to use, like this:

// To load the French version
$mail->setLanguage('fr', '/optional/path/to/language/directory/');

We welcome corrections and new languages — if you’re looking for corrections to do, run the PHPMailerLangTest.php script in the tests folder and it will show any missing translations.

Замена сообщения

Данные письма для транспорта передаются через объект сообщения, который тоже можно заменить с помощью события. Вместе с событием так же передается объект оригинального сообщения, а также все исходные параметры письма.

use Bitrix\Main\EventManager;
use Bitrix\Main\Event;

EventManager::getInstance()->addEventHandler('marvin255.bxmailer', 'createMessage', 'createMessageHandler');
function createMessageHandler(Event $event)
{
    //$event->getParameter('messageContainer');
    //$event->getParameter('to');
    //$event->getParameter('subject');
    //$event->getParameter('message');
    //$event->getParameter('additional_headers');
    //$event->getParameter('additional_parameters');
    $event->setParameter('messageContainer', new MyAwesomeMessage);
}

Для того, чтобы все заработало, класс должен реализовывать интерфейс .

Защита от спама

Спамеры очень часто для рассылки используют плохо написанные формы отправки почты на PHP. Дело в том, что стандарт допускает использование нескольких получателей, которые могут быть перечислены через запятую в заголовке «To», а также использование произвольного количества специальных заголовков с именем «Сс» (копия) и «Bcc» (скрытая копия). Предположим, что в Вашей форме есть поле темы, которое без изменений транслируется в заголовок «Subject». Для того чтобы отправить произвольное сообщение на тысячу адресов, спамеру достаточно в поле Subject вписать примерно такой текст:

Таким образом отправляемое письмо будет дополнено заголовками «Cc» и почтовая программа, обнаружив все эти заголовки в тексте письма, примется рассылать его всем получателям из списка. Аналогичная ситуация и с переменными и — любое из них при удачном стечении обстоятельств может быть использовано злоумышленниками в своих интересах.

Борьба с этим явлением может вестись двумя способами:

  1. Проверка всего пользовательского ввода и фильтрация опасных символов (т.е символов «\r» и «\n»). Эти символы нужно либо заменять на пробелы, либо отказываться обрабатывать некорректно введенные параметры. Например, замену можно выполнить так:

  2. Выполнение кодирования Base64, помимо прочего, защищает и от спамеров, т.к. «вытягивает» закодированный текст в одну строку.

Конфигурация среды выполнения

Поведение функций Mail зависит от настроек в PHP. ini:

Имя По умолчанию Описание Изменчива
mail.add_x_header «0» Добавить X-PHP-исходный скрипт, который будет включать UID сценария, за которым следует имя файла. Для PHP 5.3.0 и выше PHP_INI_PERDIR
mail.log NULL Путь к файлу журнала, в котором будут регистрироваться все вызовы mail (). Журнал включает полный путь к сценарию, номер строки, адрес и заголовки. Для PHP 5.3.0 и выше PHP_INI_PERDIR
SMTP «localhost» Только для Windows: DNS-имя или IP-адрес SMTP-сервера PHP_INI_ALL
smtp_port «25» Только для Windows: номер порта SMTP. Для PHP 4.3.0 и выше PHP_INI_ALL
sendmail_from NULL Только для Windows: указывает адрес «from», который будет использоваться при отправке почты из Mail () PHP_INI_ALL
sendmail_path «/usr/sbin/sendmail -t -i» Указывает, где можно найти программу Sendmail. Эта директива работает также под Windows. Если задано, SMTP, смтп_порт и сендмаил_фром игнорируются PHP_INI_SYSTEM

Как настроить подключение SMTP

Чтобы настроить нормальную отправку писем, нужно установить плагин WP Mail SMTP. Он позволяет переконфигурировать стандартный PHP Mailer так, чтобы была возможность подключаться к SMTP серверу. Также, советую использовать его, если вы пользуетесь локальным сервером.

Настройка WP Mail SMTP

А вот описание опций

  • From Email — email отправителя. Вводим логин от почты полностью как на изображении вверху
  • From Name — Имя отправителя. Можете поставить сюда что хотите, например, адрес вашего сайта
  • Mailer — выбираем
  • Return Path — оставляем пустым
  • SMTP Host — адрес SMTP сервера. Вводим
  • SMTP Port — порт SMTP сервера. Вводим
  • Шифрование— тип шифровки писем. Выбираем
  • Авторизация— авторизация. Выбираем
  • Username — логин от почты. Значение должно совпадать с From Email
  • Password — пароль от почты

Установка и настройка почтового сервера

Установка Postfix

apt-get update && apt-get install postfix

В процессе установки будут заданы вопросы относительно настройки

Важно выбрать тип Internet Site. Это необходимо сделать для того, чтобы Postfix сгенерировал файл и сразу начал работу

В противном случае, Вам необходимо будет настраивать его вручную.

Установка Sendmail

Sendmail устанавливается примерно так же

apt-get update && apt-get install sendmail

Потом его сконфигурировать

sendmailconfig

После всего этого перезагрузить сервер

reboot

Что делать, если email не доходит

  1. Проверить правильность адреса, куда почта должна придти;
  2. Проверить папку Спам;
  3. Выждать пару минут.

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

Как проверить отправку email в PHP

3 команды, которые нужно ввести в консоль SSH последовательно:

php -a
mail ('', "Test Mailer", "Test mail from php mailer");
exit;
  1. Создать файл ;
  2. Прописать туда:
    <?php mail ('', "Test Mailer", "Test mail from php mailer");
  3. Запустить файл командой
    php -f test_email.php

Если на данном этапе возникает ошибка, попробуйте переустановить и правильно сконфигурировать Postfix или Sendmail.

History

  • Marcus Bointon (coolbru on SF) and Andy Prevost (codeworxtech) took over the project in 2004.
  • Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski.
  • Marcus created his fork on GitHub in 2008.
  • Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013.
  • PHPMailer moves to the PHPMailer organisation on GitHub in 2013.

What’s changed since moving from SourceForge?

  • Official successor to the SourceForge and Google Code projects.
  • Test suite.
  • Continuous integration with Travis-CI.
  • Composer support.
  • Public development.
  • Additional languages and language strings.
  • CRAM-MD5 authentication support.
  • Preserves full repo history of authors, commits and branches from the original SourceForge project.

A Simple Example

<?php 
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

// Load Composer's autoloader
require 'vendor/autoload.php';

// Instantiation and passing `true` enables exceptions
$mail = new PHPMailer(true);

try {
    //Server settings
    $mail->SMTPDebug = SMTP::DEBUG_SERVER;                      // Enable verbose debug output
    $mail->isSMTP();                                            // Send using SMTP
    $mail->Host       = 'smtp1.example.com';                    // Set the SMTP server to send through
    $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
    $mail->Username   = 'user@example.com';                     // SMTP username
    $mail->Password   = 'secret';                               // SMTP password
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;         // Enable TLS encryption; `PHPMailer::ENCRYPTION_SMTPS` encouraged
    $mail->Port       = 587;                                    // TCP port to connect to, use 465 for `PHPMailer::ENCRYPTION_SMTPS` above

    //Recipients
    $mail->setFrom('from@example.com', 'Mailer');
    $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress('ellen@example.com');               // Name is optional
    $mail->addReplyTo('info@example.com', 'Information');
    $mail->addCC('cc@example.com');
    $mail->addBCC('bcc@example.com');

    // Attachments
    $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
    $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name

    // Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'This is the HTML message body in bold!';
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

    $mail->send();
    echo 'Message has been sent';
} catch (Exception $e) {
    echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}

You’ll find plenty more to play with in the examples folder.

That’s it. You should now be ready to use PHPMailer!

Отправка email в ASP.NET Core

Последнее обновление: 15.03.2017

На данный момент .NET Core по умолчанию не предоставляет готового функционала для работы с протоколом SMTP, поэтому нам надо использовать сторонние решения,
например, MailKit, SendGrid. Либо использовать зависимости полноценного .NET Framework в виде функциональности пространства имен System.Net.Smtp, но в этом
случае мы уйдем от кроссплатформенности в строну одноплатформенного решения.

В данном случае мы будем использовать MailKit как наиболее простое и в то же время довольно насыщенное в плане функциональности решение.
Для его установки добавим в проект через NuGet соответствующий пакет:

using MimeKit;
using MailKit.Net.Smtp;
using System.Threading.Tasks;
namespace SocialApp.Services
{
    public class EmailService
    {
        public async Task SendEmailAsync(string email, string subject, string message)
        {
            var emailMessage = new MimeMessage();

            emailMessage.From.Add(new MailboxAddress("Администрация сайта", "login@yandex.ru"));
            emailMessage.To.Add(new MailboxAddress("", email));
            emailMessage.Subject = subject;
            emailMessage.Body = new TextPart(MimeKit.Text.TextFormat.Html)
            {
                Text = message
            };
            
            using (var client = new SmtpClient())
            {
                await client.ConnectAsync("smtp.yandex.ru", 25, false);
                await client.AuthenticateAsync("login@yandex.ru", "password");
                await client.SendAsync(emailMessage);

                await client.DisconnectAsync(true);
            }
        }
    }
}

Для создания объекта отправляемого сообщения используется класс MimeMessage. Для определения отправителя в его коллекцию From
добавляется объект MailboxAddress. Теоретически может быть указано несколько отправителей.

Все получатели письма добавляются в коллекцию To также в виде объекта MailboxAddress.

Тело сообщения, которое представлено свойством Body, может представлять как простой текст, так и какое-то другое содержимое. Например, в данном случае указано,
что сообщение будет иметь формат html.

Для простого текста мы могли бы указать:

emailMessage.Body = new TextPart("Plain")
{
    Text = message
};

Либо использовать значение .

Непосредственно отправление производится с помощью класса . Причем весь процесс разбивается на ряд этапов:

  1. Подключение к серверу

  2. Аутентификация (при ее необходимости)

  3. Собственно отправка сообщения

  4. Отключение

При подключении в метод передаются smtp-адрес сервера, номер порта, и логическое значение, указывающее, будет ли применяться SSL. В данном случае
SSL не применяется, поэтому стоит значение .

Для аутентификации в метод передаются наши логин и пароль на сервере.

Хотя здесь все методы асинхронные, но это необязательно. Мы можем использовать и синхронный API:

using (var client = new SmtpClient())
{
    client.Connect("smtp.yandex.ru", 25, false);
    client.Authenticate("login@yandex.ru", "password");
    client.Send(emailMessage);
	client.Disconnect(true);
}

После определения класса мы можем его использовать, например, в контроллере:

public class HomeController : Controller
{
	public async Task SendMessage()
	{
		EmailService emailService = new EmailService();
		await emailService.SendEmailAsync("somemail@mail.ru", "Тема письма", "Тест письма: тест!");
		return RedirectToAction("Index");
	}
	
	//............................
}

НазадВперед

Дополнительные настройки перед отправкой письма

Задать layout

Перед отправкой письма можно установить макет (layout) отличный от того, что указан в основных настройках расширения, например в зависимости от вызванного пользователем действия (action), макет письма будет отличаться:

$mail->setLayout('layoutName');

Задать view

Так же при отправке письма можно использовать свое представление (view):

$mail->setView('viewName');
$mail->setData(
    array(
        'header' => 'Привет, это тест', 
        'body' => 'Текст тестового письма'
    )
);

Список получателей

Указывать получателей можно в массиве, пример:

$mail->setTo('test@example.com');
$mail->setTo(array('test@example.com', 'test2@example.com'));
$mail->setTo(array('test@example.com' => 'Test User', 'test2@example.com'));

Отправка писем с вложением

Для отправки писем с вложением используется метод setAttachment(), который принимает имя файла или массив из файлов для вложения:

$mail->setAttachment('/path/to/file.pdf');
$mail->setAttachment(array('/path/to/file.pdf', '/file2.doc'));
$mail->setAttachment(array('/path/to/file.pdf' => 'Good file', '/file2.doc' => 'Good doc file'));

Тестовый режим

Для проверки содержимого письма можно включить тестовый режим, в основном файл настроек /protected/config/mail.php нужно включить testMode и указать папку для сохранения писем:

'savePath' => 'webroot.assets.mail',
'testMode' => true,

Подробный пример отправки писем через (SMTP)

К
¾Ã½ÃÂÃÂþûûõà(Controller):

$mail = new YiiMailer();
//ÃÂÃÂûø ýðÃÂÃÂÃÂþùúø ýõ ÷ðôðýàò ÃÂðùûõ 
$mail->setSmtp('smtp.gmail.com', 465, 'ssl', true, 'yourEmail@gmail.com', '********');
$mail->setLayout('layoutName');
$mail->setView('viewName');
$mail->setSubject('âõüð ÿøÃÂÃÂüð');
$mail->setData(
    array(
        'header' => 'ÃÂÃÂøòõÃÂ, ÃÂÃÂþ ÃÂõÃÂÃÂ', 
        'body' => '

âõúÃÂàÃÂõÃÂÃÂþòþóþ ÿøÃÂÃÂüð!


)
);
$mail->setAttachment(array(‘/path/to/file.pdf’=>’Good file’));
$mail->setFrom(‘from@example.com’, ‘Test User’);
$mail->setTo(array(‘test@example.com’, ‘test2@example.com’));
if ($mail->send()) {
Yii::app()->user->setFlash(‘contact’,’ÃÂøÃÂÃÂüþ ÃÂÃÂÿõÃÂýþ þÃÂÿÃÂðòûõýþ’);
} else {
Yii::app()->user->setFlash(‘error’,’ÃÂÃÂøñúð ÿÃÂø þÃÂÿÃÂðòúõ ÿøÃÂÃÂüð: ‘ . $mail->getError());
}

ÃÂðúõà(Layout) (/protected/views/layouts/layoutName.php):

<?php echo $content ?>

ÃÂÃÂõôÃÂÃÂðòûõýøõ (View) (/protected/views/mail/viewName.php):

Как написать скрипт отправки почты через SMTP

Создание функции для работы с открытым SMTP-соединением

function get_data($smtp_conn)
{
$data="";
while($str = fgets($smtp_conn,515))
{
$data .= $str;
if(substr($str,3,1) == " ") { break; }
}
return $data;
}
?>

Создание письма

$header.="X-Mailer: The Bat! (v3.99.3) Professional\r\n"; 
$header.="Reply-To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('sender')))."?= >\r\n";
$header.="X-Priority: 3 (Normal)\r\n";
$header.="Message-ID: \r\n";

Замените @domain.com на домен, на котором расположена ваша почта.

$header.="To: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('recipient')))."?= >\r\n";
$header.="Subject: =?windows-1251?Q?".str_replace("+","_",str_replace("%","=",urlencode('check')))."?=\r\n";
 $header.="MIME-Version: 1.0\r\n";
 $header.="Content-Type: text/plain; charset=utf-8\r\n";
 $header.="Content-Transfer-Encoding: 8bit\r\n";
 ?>

Замените check на тему письма.

$text="привет, проверка связи.";

Замените  привет, проверка связи на текст вашего письма.

Отправка письма

$smtp_conn = fsockopen("smtp.mail.ru", 25,$errno, $errstr, 10);
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,"EHLO vasya\r\n");

Если есть желание – замените vasya на имя своего ПК. Но можно и не заменять, эта информация – только для самого сервера.

$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,"AUTH LOGIN\r\n");
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,base64_encode("login")."\r\n");

Замените login на ваш логин на почтовом сервере

$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,base64_encode("password")."\r\n");

Замените password на ваш пароль на почтовом сервере.

$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
$size_msg=strlen($header."\r\n".$text);
fputs($smtp_conn,"MAIL FROM:> SIZE=".$size_msg."\r\n");
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,"RCPT TO:>\r\n");
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,"DATA\r\n");
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,$header."\r\n".$text."\r\n.\r\n");
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
fputs($smtp_conn,"QUIT\r\n");
$data = get_data($smtp_conn);
//$code = substr($data,0,3);
//echo ($code);
?>

Этот скрипт можно использовать для отправки почты через SMTP с любого хостинга или сервера.

Contributing

Please submit bug reports, suggestions and pull requests to the GitHub issue tracker.

We’re particularly interested in fixing edge-cases, expanding test coverage and updating translations.

If you found a mistake in the docs, or want to add something, go ahead and amend the wiki — anyone can edit it.

If you have git clones from prior to the move to the PHPMailer GitHub organisation, you’ll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone:

git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git

Please don’t use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained.

Inline Attachments

In detail, here is the function to add an embedded attachment:

$mail->addEmbeddedImage($filename, $cid);

The process of connecting image tags to content identifiers is a bit complicated, but the method can do most of the work for you.

Using HTML Email

First we’ll create a basic HTML message:

<?php 
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
$mail->setFrom('from@example.com', 'Your Name');
$mail->addAddress('myfriend@example.net', 'My Friend');
$mail->Subject = 'An HTML Message';
$mail->isHTML(true);
$mail->Body = 'Hello, my friend! This message uses HTML!';
$mail->AltBody = "Hello, my friend! This message uses plain text !";

This sets the alternative body ( for short). If you use this feature, the message will automatically use the MIME type , which builds the message in a way that MIME-compliant clients can use to pick the format the recipient prefers.

Support

  • PHPMailer project home: https://github.com/PHPMailer/PHPMailer
  • PHPMailer documentation start: https://github.com/PHPMailer/PHPMailer/wiki
  • PHPMailer code examples: https://github.com/PHPMailer/PHPMailer/tree/master/examples
  • PHPMailer troubleshooting guide: https://github.com/PHPMailer/PHPMailer/wiki
  • PHPMailer bug reports (not «how do I…» questions!): https://github.com/PHPMailer/PHPMailer/issues
  • Many email standards are applicable to PHPMailer, including:
    • MIME RFCs , ,

Функция mail()

Отправка почтовых сообщений в большинстве скриптов выполняется системной функцией . Описание синтаксиса функции mail всегда можно найти в оригинальном руководстве. Эта функция принимает всего 5 параметров, из которых три являются обязательными, а остальные два — опциональными:

  • — Электронный адрес получателя сообщения
  • — Тема сообщения
  • — Тело сообщения
  • — дополнительные заголовки
  • — дополнительные параметры

На самом деле функция просто формирует строку следующего вида:

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

  1. Закодировать поле Subject с использованием base64, как в примере выше.
  2. Закодировать поле To.
  3. В случае необходимости создать , самостоятельно сформировав все необходимые заголовки (например, добавив поле «From:») и разделив эти заголовки парой символов «\r\n».

После этого сформированный набор параметров можно передавать на вход функции mail().

Installation & loading

PHPMailer is available on Packagist (using semantic versioning), and installation via Composer is the recommended way to install PHPMailer. Just add this line to your file:

"phpmailer/phpmailer": "~6.1"

or run

composer require phpmailer/phpmailer

Note that the folder and the script are generated by Composer; they are not part of PHPMailer.

If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on the package in your .

Alternatively, if you’re not using Composer, copy the contents of the PHPMailer folder into one of the directories specified in your PHP configuration and load each class file manually:

<?php 
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require 'path/to/PHPMailer/src/Exception.php';
require 'path/to/PHPMailer/src/PHPMailer.php';
require 'path/to/PHPMailer/src/SMTP.php';

If you’re not using the class explicitly (you’re probably not), you don’t need a line for the SMTP class.

If you don’t speak git or just want a tarball, click the ‘zip’ button on the right of the project page in GitHub, though note that docs and examples are not included in the tarball.

Contributing

Please submit bug reports, suggestions and pull requests to the GitHub issue tracker.

We’re particularly interested in fixing edge-cases, expanding test coverage and updating translations.

If you found a mistake in the docs, or want to add something, go ahead and amend the wiki — anyone can edit it.

If you have git clones from prior to the move to the PHPMailer GitHub organisation, you’ll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone:

git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git

Please don’t use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained.

Ссылка на основную публикацию