отправка почты из скриптов
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
отправка почты из скриптов
Разборка с этой темой нужна для корректной рассылкой почтовых сообщений с этого вот форума, из phpBB.
Но представляет интерес и сама по себе.
Итак, задача: послать корректно русскоязычные письма из PHP скрипта ... или даже не из PHP скрипта, а как-то другим образом из командной строки.
Но представляет интерес и сама по себе.
Итак, задача: послать корректно русскоязычные письма из PHP скрипта ... или даже не из PHP скрипта, а как-то другим образом из командной строки.
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: отправка почты из скриптов
Прежде всего, во-первых, чтобы посылать почту вообще, на хосте должен быть установлен почтовый агент: sendmail или exim4, на выбор. Всё это есть в стандартных дистрибутивах, как-то так:
Код: Выделить всё
root@277938:~# aptitude search sendmail | grep ' sendmail'
p dhis-mx-sendmail-engine - Dynamic Host Information System - sendmail MX engine
p sendmail - powerful, efficient, and scalable Mail Transport Agent (metapackage)
idA sendmail-base - powerful, efficient, and scalable Mail Transport Agent (arch independent files)
c sendmail-bin - powerful, efficient, and scalable Mail Transport Agent
idA sendmail-cf - powerful, efficient, and scalable Mail Transport Agent (config macros)
p sendmail-doc - powerful, efficient, and scalable Mail Transport Agent (documentation)
root@277938:~# aptitude search exim4
i exim4 - метапакет для упрощения установки Exim MTA (v4)
i A exim4-base - общие файлы для всех пакетов Exim MTA (v4)
i A exim4-config - конфигурация для Exim MTA (v4)
v exim4-config-2 -
p exim4-daemon-heavy - Exim MTA (v4) демон с дополнительными возможностями, включая exiscan-acl
i A exim4-daemon-light - облегчённая версия Exim MTA (v4)
p exim4-dev - header files for the Exim MTA (v4) packages
p exim4-doc-html - documentation for the Exim MTA (v4) in html format
p exim4-doc-info - documentation for the Exim MTA (v4) in info format
v exim4-localscanapi-2.0 -
Код: Выделить всё
root@277938:~# which sendmail
/usr/sbin/sendmail
root@277938:~# which exim4
/usr/sbin/exim4
Код: Выделить всё
root@277938:~# ps -A | grep sendmail
root@277938:~# ps -A | grep exim4
24938 ? 00:00:00 exim4
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: отправка почты из скриптов
Установка и настройка sendmail под Ubuntu
Настройка EXIM4 для отправки почтовых сообщений в Linux03 июня 2013 г.
Последнее обновление: 07.12.2018
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: отправка почты из скриптов
Если мы используем sendmail, то первейшим делом делаем:
Код: Выделить всё
root@277938:~# sendmailconfig
Configure sendmail with the existing /etc/mail/sendmail.conf? [Y]
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Configure sendmail with the existing /etc/mail/sendmail.mc? [Y]
Updating sendmail environment ...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Could not open /etc/mail/databases(No such file or directory), creating it.
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...
Checking filesystem, this may take some time - it will not hang!
... Done.
Checking for installed MDAs...
sasl2-bin not installed, not configuring sendmail support.
To enable sendmail SASL2 support at a later date, invoke "/usr/share/sendmail/update_auth"
Creating/Updating SSL(for TLS) information
Creating /etc/mail/tls/starttls.m4...
You already have sendmail certificates
*** *** *** WARNING *** WARNING *** WARNING *** WARNING *** *** ***
Everything you need to support STARTTLS (encrypted mail transmission
and user authentication via certificates) is installed and configured
but is *NOT* being used.
To enable sendmail to use STARTTLS, you need to:
1) Add this line to /etc/mail/sendmail.mc and optionally
to /etc/mail/submit.mc:
include(`/etc/mail/tls/starttls.m4')dnl
2) Run sendmailconfig
3) Restart sendmail
Checking {sendmail,submit}.mc and related databases...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/databases...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Creating /etc/mail/Makefile...
Reading configuration from /etc/mail/sendmail.conf.
Validating configuration.
Writing configuration to /etc/mail/sendmail.conf.
Writing /etc/cron.d/sendmail.
Disabling HOST statistics file(/var/lib/sendmail/host_status).
Creating /etc/mail/sendmail.cf...
Creating /etc/mail/submit.cf...
Informational: confCR_FILE file empty: /etc/mail/relay-domains
Informational: confCT_FILE file empty: /etc/mail/trusted-users
Updating /etc/mail/access...
Informational: ALIAS_FILE file empty: /etc/mail/aliases
Updating /etc/mail/aliases...
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
Reload the running sendmail now with the new configuration? [Y]
Reloading sendmail ...
Код: Выделить всё
root@277938:/var/mail# systemctl restart sendmail
root@277938:/var/mail# systemctl status sendmail
* sendmail.service - LSB: powerful, efficient, and scalable Mail Transport Agent
Loaded: loaded (/etc/init.d/sendmail; generated)
Active: active (running) since Thu 2019-12-26 16:26:50 MSK; 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 21956 ExecStart=/etc/init.d/sendmail start (code=exited, status=0/SUCCESS)
Tasks: 1 (limit: 544)
Memory: 7.2M
CGroup: /system.slice/sendmail.service
`-22042 sendmail: MTA: accepting connections
Dec 26 16:26:46 277938.local systemd[1]: Starting LSB: powerful, efficient, and scalable Mail Transport Agent...
Dec 26 16:26:47 277938.local su[22029]: (to smmsp) root on none
Dec 26 16:26:47 277938.local su[22029]: pam_unix(su:session): session opened for user smmsp by (uid=0)
Dec 26 16:26:48 277938.local su[22029]: pam_unix(su:session): session closed for user smmsp
Dec 26 16:26:48 277938.local sm-mta[22042]: starting daemon (8.15.2): SMTP+queueing@00:10:00
Dec 26 16:26:50 277938.local sendmail[21956]: Starting Mail Transport Agent (MTA): sendmail.
Dec 26 16:26:50 277938.local systemd[1]: Started LSB: powerful, efficient, and scalable Mail Transport Agent.
Код: Выделить всё
root@277938:/etc/php/7.3/apache2# php -r "mail('o.tsiliuric@yandex.ru', 'test from server', 'test');"
You have new mail in /var/mail/root
Или отправляем так:
Код: Выделить всё
root@277938:/etc/php/7.3/apache2# echo "Тестовое письмо" | sendmail 'o.tsiliuric@yandex.ru'
Видно, что это сообщение в UTF-8 отображается в какой-то байтовой кодировке, искажается...От: root@277938.local
Тело: Тестовое РїРёСЃСЊРјРѕ
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: отправка почты из скриптов
Позже техподдержка нашего хостера перевела работу на exim4:
Утверждают, что он проще в настройках.
Важно, для контроля принимающей стороной актуальных мэйлов, настройки записей DNS для хоста. Я в этом ничего не понимаю, но только фиксирую:
Отправка почты:
Или так:
Все домены приняли и показали письма.
Но некоторые (большинство из них в Thunderbird) представляют тело письма как:
Код: Выделить всё
root@277938:~# systemctl status exim4
● exim4.service - LSB: exim Mail Transport Agent
Loaded: loaded (/etc/init.d/exim4; generated)
Active: active (running) since Sun 2019-12-29 21:21:25 MSK; 23h ago
Docs: man:systemd-sysv-generator(8)
Tasks: 1 (limit: 544)
Memory: 8.1M
CGroup: /system.slice/exim4.service
└─24938 /usr/sbin/exim4 -bd -q30m
Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.
Важно, для контроля принимающей стороной актуальных мэйлов, настройки записей DNS для хоста. Я в этом ничего не понимаю, но только фиксирую:
Код: Выделить всё
Список DNS-записей
Хост Тип Значение
_domainkey.linux-ru.ru TXT t=s; o=~;
_dmarc.linux-ru.ru TXT v=DMARC1; p=none
linux-ru.ru A 185.178.47.95
linux-ru.ru TXT v=spf1 a mx ~all
Код: Выделить всё
root@277938:~# php -r "mail('o.tsiliuric@yandex.ru', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej-tsil@yandex.ru', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej@rambler.ua', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej.tsil@mail.ru', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej.tsil@gmail.com', 'Тестовое письмо с вашего сайта', 'Привет.' );"
root@277938:~# php -r "mail('olej.tsil@yahoo.com', 'Тестовое письмо с вашего сайта', 'Привет.' );"
Код: Выделить всё
root@277938:~# echo "тестирование нового Exim4" | mail -s 'тест' o.tsiliuric@yandex.ru
Но некоторые (большинство из них в Thunderbird) представляют тело письма как:
Т.е. осталось разобраться с кодировкой UTF-8.тестирование РЅРѕРІРѕРіРѕ Exim4
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: отправка почты из скриптов
Как грамотно отправлять почту из скрипт ... — на PHP)
Отправка почты из скриптов на PHP — вещь, которая очень часто встречается в веб-приложениях. К сожалению, как показывает практика, большинство разработчиков используют эту функцию неправильно, допуская в своих скриптах одни и те же ошибки. В результате оказывается, что письмо получателю пришло в неверной кодировке, просто не дошло, или дошло, но отображается совсем не так, как этого хотел автор.
- Olej
- Писатель
- Сообщения: 18656
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: отправка почты из скриптов
Скрипт PHP для Linux, где всё и вся представляется в UNICODE UTF-8:
Код: Выделить всё
root@277938:~# cat test2.php
<?php
ini_set( 'display_errors', 1 );
error_reporting( E_ALL );
$to = "o.tsiliuric@yandex.ru";
$subject = "Тестовое письмо с вашего сайта, Привет";
$message = "Текст письма русскоязычный";
$from = "script@linux-ru.ru";
$type = "text/plain; charset=utf-8";
$headers = "From:" . $from . "\n" . "Content-Type:" . $type;
mail( $to, $subject, $message, $headers );
echo "Test email sent\n";
?>
Отправка:
Код: Выделить всё
root@277938:~# php test2.php
Test email sent
Вот теперь это то что надо!От: script@linux-ru.ru
Тема: Тестовое письмо с вашего сайта, Привет
Кому: o.tsiliuric@yandex.ru
Текст письма: Текст письма русскоязычный
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя