Спам
По данным компании Pingdom, из 107 триллионов писем, отправленных за 2010 год, 89,1% были спамом. Для борьбы со спамом были разработаны различные механизмы (чёрные списки отправителей, серые списки (требующие повторного обращения почтового сервера для отправки), контекстные фильтры). Одним из последствий внедрения средств борьбы со спамом стала вероятность «ошибочного положительного» решения относительно спама (часть писем, не являющихся спамом, стала помечаться как спам). В случае агрессивной антиспам-политики (уничтожение писем, кажущихся спамом, в автоматическом режиме без уведомления отправителя/получателя) это приводит к труднообнаружимым проблемам с прохождением почты (т.к. сообщения удаляются или проходят в зависимости от эвристических алгоритмов).
- Статья Спам
- Каталог продуктов и проектов ИБ — Антиспам
- Статья Антиспам технологии
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.
File Attachments
The command to attach a local file is simply , where contains the path to the file you want to send, and can be placed anywhere between and sending the message. Note that you cannot use a URL for the path — you may only use local filesystem path. See notes on string attachments below for how to use remote content.
The $path may be a relative one (from your script, not the PHPMailer class) or a full path to the file you want to attach. If you want to send content from a database or web API (e.g. a remote PDF generator), do not use this method — use instead.
If you want more options or you want to specify encoding and the MIME type of the file, then you can use three more parameters, all of which are optional:
$mail->addAttachment($path, $name, $encoding, $type);
is a little more technical, but with this parameter you can set the type of encoding of the attachment. The default is . Other types that are supported include: , , & . Generally any binary file (e.g. an image) should use ; text-based attachments will usually use .
is the MIME type of the attached file. Content types are defined not necessarily by file suffixes (i.e., or ), but a MIME type (MIME = Multipurpose Internet Mail Extensions) is used. This parameter makes it possible change the MIME type of an attachment from the default value of (which works with every kind of file, but means the receiver may not handle it correctly) to a more specific MIME type, such as for a JPEG photo, for instance. You don’t usually need to set this yourself as PHPMailer will map it from the file extension automatically.
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');
Современная архитектура (SMTP)
Релеи
Для своих пользователей сервера почтовой системы являются релеями (пользователи отправляют почту не на сервера почтовой системы адресата, а на «свой» почтовый сервер, который передаёт письма далее). Во многих сетях провайдеров интернета возможность отправлять письма по протоколу SMTP за пределы сети закрыта (из-за использования этой возможности троянами, вирусами). В этом случае провайдер предоставляет свой SMTP-сервер, через который и направляется вся почта за пределы сети. Открытым релеем при этом считается такой релей, который не проверяет, является ли пользователь «своим» (проверка может осуществляться как на основании адреса пользователя, так и на основании идентификации паролем/сертификатом).
Маршрутизация почты
Почтовый сервер, при обработке письма, действует по следующему алгоритму: для домена-получателя ищутся все MX-записи. Они сортируются в порядке убывания приоритета. Если адрес почтового сервера совпадает с одним из узлов, указанных в MX-записях, то все записи с приоритетом меньшим приоритету узла в mx-записи (а так же MX-запись самого узла) отбрасываются, а доставка осуществляется на первый отвечающий узел (узлы пробуются в порядке убывания приоритета).
Если сеть имеет различные DNS-сервера (например, внешние — в интернете, и локальные — в собственных пределах), то возможна ситуация, когда «внутренние» DNS-сервера в качестве наиболее приоритетного получателя указывают на недоступный в интернете сервер, куда и перенаправляется почта с релея, указанного как узел-получатель для интернета. Подобное разделение позволяет осуществлять маршрутизацию почты по общим правилам между серверами, не имеющими выхода в интернет.
В случае Microsoft Exchange, для маршрутизации почты между несколькими серверами внутри органзации используется информация о получателях из Active Directory. Версии Microsoft Exchange 2000, 2003 используют понятие группа маршрутизации (и задаваемые вручную соединители между группами), начиная с Exchange 2007 маршрутизация осуществляется исходя из информации о топологии Active Directory (т.е. маршрутизация осуществляется согласно настройкам репликации между узлами Active Directory)
Почтовый сервер Proofpoint Sendmail поддерживает файл конфигурации mailertable, позволяющий задать правила пересылки почты минуя DNS.
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.5"
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, you
can download PHPMailer as a zip file, (note that docs and examples are not included in the zip file), then 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. Even if you’re not using exceptions, you do still need to load the class as it is used internally.
Коммерческое использование
Пошаговое прохождение электронной почты от отправителя получателю (без использования proxy сервера):
- Создание письма;
- Соединение почтового клиента с SMTP Simple Mail Transfer Protocol — Простой протокол передачи почты-сервером отправителя;
- Передача SMTP-серверу информации о том, кому предназначается почта и кто является отправителем;
- Проверка SMTP-сервером корректности данных об адресате и отправителе и принятие письма (с заголовками и телом письма);
- Постановка письма в очередь доставки;
- Попытка соединения SMTP-сервера отправителя с почтовыми серверами адресата, имеющими наибольший приоритет. Если попытка неудачна, делаются ещё попытки соединения с резервными почтовыми серверами домена адресата;
- Передача письма в случае удачного соединения с почтовым сервером домена адресата, либо постановка в очередь для попытки переслать письмо позже, в случае неудачи;
- Прием SMTP-сервером домена адресата письма
- Проверка письма на предмет его похожести на спам
- Передача его модулю, который занимается хранением писем и выдачей их адресатам по протоколу POP3, IMAP или другим;
- Соединение адресата с POP3 или IMAP сервером, аутентификация и получение письма адресатом.
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'; //Create an instance; 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 = 'smtp.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_SMTPS; //Enable implicit TLS encryption $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` //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 <b>in bold!</b>'; $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 to play with in the examples folder, which covers many common scenarios including sending through gmail, building contact forms, sending to mailing lists, and more.
That’s it. You should now be ready to use PHPMailer!
Новости
2020: Власти РФ одобрили законопроект о блокировке электронной почты и мессенджеров
28 января 2020 года стало известно, что Правительство РФ подготовило положительный проект официального отзыва на законопроект сенатора Андрея Клишаса о блокировке опасных переписок по электронной почте. Законопроект будет поддерживаться властями при условии его доработки. Подробнее .
Минкомсвязи не поддержало инициативу по блокировке электронной почты и мессенджеров
8 ноября 2019 года стало известно, что Министерство цифрового развития, связи и массовых коммуникаций РФ не поддержало законопроект о блокировке электронной почты за распространение незаконной информации. Подробнее .
В РФ может быть введена блокировка электронной почты пользователей
9 октября 2019 года стало известно, что в России может быть введена блокировка пользователей сервисов электронной почты и мессенджеров, занимающихся распространением запрещенной информации. Подробнее .
Описание
- Отправка письма с помощью SMTP, либо через mail() по вашему выбору
- Отправка прикрепленных к письму файлов (любое количество)
- Возможности отправки многим адресатам через To, CC или BCC
- Возможность получить исходный текст письма без отправки, либо после отправки для ведения логов. При отправке через SMTP возращает весь диалог общения с сервером
- Проверка синтаксиса email адресов
- Возможность установить запрос о прочтении письма
- Отправка писем в текстовом формате или в HTML
- Отправка нескольких разных писем за одно соединение с сервером, при отправке через SMTP
- Поддержка email адресов в национальных доменах (рф и любых других).
Одновременная отправка нескольких писем
Давайте немного модифицируем предыдущий пример так, чтобы отправить несколько писем!
Python
import os
import smtplib
import sys
from configparser import ConfigParser
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
importos importsmtplib importsys fromconfigparserimportConfigParser defsend_email(subject,body_text,emails) «»» Send an email base_path=os.path.dirname(os.path.abspath(__file__)) config_path=os.path.join(base_path,»email.ini») ifos.path.exists(config_path) cfg=ConfigParser() cfg.read(config_path) else print(«Config not found! Exiting!») sys.exit(1) host=cfg.get(«smtp»,»server») from_addr=cfg.get(«smtp»,»from_addr») BODY=»\r\n».join(( «From: %s»%from_addr, «To: %s»%’, ‘.join(emails), «Subject: %s»%subject, «», body_text )) server=smtplib.SMTP(host) server.sendmail(from_addr,emails,BODY) server.quit() if__name__==»__main__» emails=»mike@someAddress.org»,»someone@gmail.com» subject=»Test email from Python» body_text=»Python rules them all!» send_email(subject,body_text,emails) |
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, run the PHPMailerLangTest.php script in the tests folder and it will show any missing translations.
Отправка письма в HTML-формате
Большинству задач вышеприведённого скрипта отправки mail`ов хватает, но мы пойдём дальше, и научимся отправлять письма в HTML-формате. В этом также нет ничего сложного:
<?php if (mail('test@example.com', 'Письмо из скрипта', '<html><head><title>Вася, привет</title></head><body bgcolor="#feeffe"><font color="blue">Привет Василий, как дела?</font><br /><font color="green">Я умею отправлять письма с помощью php! И скоро научусь отправлять письма с помощью php с вложениями! Это будет круто!</font></body></html>', "From: ivan@example.com\r\n Content-type: text/html; charset=utf-8\r\n X-Mailer: PHP mail script" )) { echo 'Письмо успешно отправлено!'; }else{ echo 'При отправке письма возникла ошибка'; } ?>
Обратите внимание! После каждого заголовка стоит конструкция \r\n — это так обозначается перенос строки. А тот перенос, что вы видите — это обычное выравнивание, дабы удобно было читать код
Т.е. смело можно написать так:
...mail('test@example.com', 'Письмо из скрипта', '(аштиэмэль...)', "From: ivan@example.com\r\nContent-type: text/html; charset=utf-8\r\nX-Mailer: PHP mail script")...
И ещё обратите внимание на то, что escape-последовательности (а именно так называются конструкции вида \r\n) работают только с двойными кавычками!
Что же нового в этом скрипте? Ну, во-первых, мы в заголовках указали тип содержимого (HTML) и кодировку. Во-вторых, просто в теле написали нужный нам html-код
Всё просто!
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 SMTPS and SMTP+STARTTLS transports
- Validates email addresses automatically
- Protects against header injection attacks
- Error messages in over 50 languages!
- DKIM and S/MIME signing support
- Compatible with PHP 5.5 and later, including PHP 8.1
- Namespaced to prevent name clashes
- Much more!
PHPMailer
PHPMailer — полнофункциональный PHP — класс, который выполняет все необходимые задачи по подготовке и рассылке сообщений по электронной почте. В том числе и с использованием SMTP и кодирования сообщений.
Основные зарактеристики:
- самый популярный способ для отправки электронной почты в PHP
- используется многими проектами с открытым исходным кодом: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomlaи др.
- интегрированная поддержка SMTP — отправка без локального почтового сервера
- возможность отправлять электронные письма с несколькими TO, CC, BCC и REPLY-TO
- многостраничные / альтернативные электронные письма для почтовых клиентов, которые не читают HTML-адрес электронной почты
- поддержка разных кодировок: UTF-8, 8-битных, base64, двоичных и др
- аутентификация SMTP с помощью механизмов LOGIN, PLAIN, NTLM, CRAM-MD5 и Google XOAUTH2 через SSL и TLS-транспорт
- сообщения об ошибках на 47 языках (в том числе Русский, Иврит)
- поддержка подписей DKIM и S / MIME
- совместимость с PHP 5.0 и более поздними версиями
Многие разработчики PHP используют в своем коде электронную почту. Единственная функция PHP, которая поддерживает — функция mail (). Тем не менее, он не предоставляет никакой возможности для использования популярных функций, таких как электронные письма и вложения на основе HTML.
Правильно форматировать электронную почту достатчно сложно. Существует множество пересекающихся стандартов, протоколов RFC, требующих жесткой привязки к достаточно сложным правилам форматирования и кодирования. Подавляющее большинство программ, которые можно найти в Интернете, использущих PHP — функцию mail () напрямую, содержат большое количество ошибок, так как ата задача сложна. Также не имеет смысла делать то самостоятельно.
Функция PHP mail() обычно использует локальный почтовый сервер, как правило, с помощью бинарного файла sendmail на платформах Linux, BSD и OS X, однако Windows обычно не включает локальный почтовый сервер. Встроенная в PHPMailer SMTP-поддержка позволяет отправлять электронную почту на любых платформах ( в том числе: Windows) без локального почтового сервера.
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, <b>my friend</b>! 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 , ,