Портрет 4X_Pro
Онлайн
Мультиблог
4X_Pro
Записки лишнего человека

Компьютерное

Почтовая рассылка с собственного сервера

4X_Pro

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


  1. Первое, что следует сделать — это настроить запись обратного DNS (она же reverse DNS, она же запись PTR-типа). Сделать это обычно можно через интерфейс хостинга. Если там подобной опции нет, то придется обратиться в техподдержку. Проверить корректность работы обратного DNS можно на MxToolbox.
  2. Если ваш хостер поддерживает IPv6, обязательно создайте в DNS запись типа AAAA с вашим IPv6-адресом. Без него могут не проходить письма на GMail.
  3. Убедитесь, что в заголовках письма есть строка Precedence: bulk.
  4. Обязательно указывайте в полях From и To имена получателя и отправителя. Убедитесь, что они и поле Subject корректно кодируются в Base64, если содержат кириллицу или какие-то спецсимволы (и наоборот, если там только латиница и пробелы, они НЕ ДОЛЖНЫ кодироваться). Для этого, возможно, потребуется модифицировать скрипт отправки в CMS, через которую делается рассылка.  
  5. Если есть возможность, реализуйте отписку одним кликом и пропишите адрес для нее в поле заголовка  List-Unsubscribe: <URL>.
  6. Сделайте SPF-запись для своего домена. Делается она следующим образом: в редакторе DNS нужно создать запись TXT-типа такого вида (запись создается для корня домена):
    v=spf1 ip4:ваш_IP ip6:ваш_IPv6 a mx ~all
    Если вы используете привязку домена к Яндекс.Почте, то запись нужно чуть изменить:
     v=spf1 ip4:ваш_IP ip6:ваш_IPv6 include:_spf.yandex.ru a mx ~all
  7. Установите OpenDKIM, настройте его работу для подписи отправляемых писем и сделайте необходимые записи в DNS. Описание процесса настройки для postfix (внимание: нужно использовать вариант с chroot, если у вас настройки postfix по умолчанию) и для sendmail в Ubuntu.
  8. Создайте DMARC-запись (в  редакторе DNS нужно создать запись типа TXT для имени _dmarc) такого вида:  
    v=DMARC1; p=quarantine; sp=reject; rua=mailto:postmaster@ваш.домен; fo=s; ruf=mailto:postmaster@ваш.домен
    (вместо postmaster может быть другой адрес, главное, чтобы он существовал и был в этом же домене)
  9. Если у вас используется сертификат для HTTPS, настройте его использование и для отправки почты через TLS-соединение вместо обычного SMTP (однако не все сертификаты допускают такое использование). Пример настройки для Postfix.
  10. Регулярно проверяйте логи сервера (обычно это /var/log/mail.log или /var/log/messages.log) на предмет ошибок почты и неработающих адресов (по коду ошибки 550) и удаляйте их из списка рассылки. (Особенно это важно для Mail.Ru, который после примерно двух десятков попыток отправки писем на несуществующие адреса на какое-то время блокирует дальнейший прием писем с сервера.)
  11. Для проверки корректности SPF и DKIM записей можно использовать сервисы MxToolbox и Valimail. С помощью MxToolbox можно также удостовериться, что сервер не внесен в черные списки.
  12. Для проверки доставляемости писем и корректности их заголовков хорошо подходит сервис Mail-Tester.com

Если выполнить все эти пункты, то доля дошедших до подписчиков писем значительно повысится.

SSHFS вместо FTP

4X_Pro

Довольно часто мне приходится заниматься отладкой скриптов прямо на рабочем сервере. Обычно в этом случае я использовал Filezilla, который хорош всем, кроме одного: после каждого изменения какого-либо файла он требует подтвердить его загрузку на сервер, на что и время теряется, и очень раздражает лишнее переключение между окнами. И вот недавно нашел другой вариант: использовать sshfs. Если есть подключение к серверу по SSH, то с ее помощью можно работать с удаленными файлами так же как с локальными. Все изменения будут отправляться на сервер сразу же после сохранения в редакторе, без каких-либо дополнительных действий или подтверждений. В результате отладка ускоряется в разы!

Чтобы использовать sshfs, нужно сначала установить соответствующий пакет. В Debian и Ubuntu это делается так: Читать далее…

Отправка уведомлений на почту и в Telegram

4X_Pro

При написании shell-скриптов, работающих по cron, иногда бывает нужно отправить пользователю уведомление о какой-то ситуации. Простейший способ — отправить EMail с помощью команды mail (работает, если на сервере установлен какой-либо MTA, например, postfix, и пакет mailutils; если MTA нет, можно воспользоваться утилитой msmtp, которая отправляет почту через внешний почтовый сервер):

echo "Текст сообщения" | mail -s "Тема сообщения" admin@example.com

Но иногда требуется сообщить о чем-либо более оперативно, чтобы уведомление пришло на мобильный телефон. Лучшим решением в этом случае является отправка SMS через шлюз EMail=>SMS, но бесплатных шлюзов сейчас не осталось. Поэтому я нашел другое решение: отправлять сообщения в Telegram с помощью Bot API. Делается это так: Читать далее…

Буфер обмена в Putty под Linux

4X_Pro

Каждый, кто пользовался SSH-клиентом Putty под Linux, сталкивался с тем, что в ней не работают привычные способы работы с буфером обмена: ни Ctrl+C/Ctrl+V, ни Ctrl+Ins/Shift+Ins, ни меню по правой кнопке мыши. Тем не менее, поддержка буфера обмена в Putty все же имеется. Делается это так: просто выделяем нужный текст мышью и щелкаем по выделению левой кнопкой. Все, данные в буфере! Но чтобы вставить их оттуда куда-либо еще, например, в текстовый редактор, нужно нажать не Ctrl+V, как обычно, а щелкнуть средней кнопкой (или колесиком) мыши. Аналогично, если нужно вставить данные в Putty из другой программы, тоже нужно щелкать средней кнопкой мыши по окну Putty.

Решение проблемы с mysql_connect в PHP 7

4X_Pro

Как известно, в PHP7 окончательно удалили расширение mysql, и теперь функции вида mysql_connect, mysql_query вызывают ошибку "Call to undefined function". Тем не менее, еще встречается код, который использует именно эти функции, и который, зачастую, бывает сложно быстро исправить. Заставить работать такой код на PHP7 достаточно просто — нужно определить эти функции самостоятельно и вызывать в них соответствующие функции из расширения MySQLi. Недавно столкнулся с такой ситуацией и сделал небольшой файл mysql.php, в котором объявил наиболее часто используемые функции.

Подключить его можно следующим образом:

if (version_compare(PHP_VERSION, '7.0.0','>=')) include 'mysql.php';

Абсолютный URL на PHP

4X_Pro

К моему большому удивлению, в PHP нет готовой функции для построения абсолютного URL по относительному и базовому. Пришлось писать ее самому. И вот что получилось: Читать далее…

Собственный сервис оптимизации загрузки сайтов

4X_Pro
Рад сообщить, что сегодня запустил собственный сервис для оптимизации времени загрузки сайтов: 2Seconds.Ru. Он позволяет легко и быстро получить список всех CSS и JavaScript страницы (если они прописаны через теги link и script), минифицировать их и склеить в один файл. Кроме того, сервис позволяет автоматически встраивать в CSS графические файлы меньше указанного размера с помощью data:uri.

Удаление файлов старше N дней

4X_Pro

Часто требуется удалить только те файлы, которые последний раз изменялись раньше определенного количества дней. Например, старые файлы сессий или временные файлы. В Linux это делается достаточно просто командой

find путь -type f -mtime +дни -print | xargs rm -f

Здесь find находит по указанному пути. все файлы со временем модификации более чем указанное количество дней назад, выводит их список, который передается утилите xargs, которая для каждого полученного аргумента вызывает rf -f. В случае, если команда выполняется через cron, пути нужно прописывать полностью, например:

/usr/bin/find ./ -type f -mtime +2 -print | /usr/bin/xargs /bin/rm -f

Как перейти на формат WebP с минимальными изменениями сайта

4X_Pro

Некоторое время назад появился новый формат для графических изображений — WebP. Этот формат обладает рядом преимуществ по сравнению с JPEG: поддерживает как сжатие с потерями, так и сжатие без потерь, а также прозрачность изображений (альфа-канал), и во многих случаях сжимает изображения эффективнее (на моих сайтах — изображения в WebP получаются 30-35% меньше). Но к сожалению, полностью перейти на этот формат пока не так просто. Во-первых, сейчас его полноценно поддерживают только Web-броузеры, работающие на основе WebKit, а Firefox и IE/Edge — нет. Во-вторых, исправить на уже существующем сайте расширения всех файлов с .jpg на .webp может быть весьма трудоемкой задачей. Но недавно я нашел интересное решение, которое предложил Vincent Orback на Github: использовать подмену JPEG на WebP с помощью mod_rewrite. Для этого добавим в .htaccess такие строки: Читать далее…

Безопасный редирект или как защититься от спамвертайзинга

4X_Pro
Сегодня получил письмо от хостера, в котором говорилось, что на один из моих сайтов поступила жалоба на спамвертайзинг, и приводился пример спамного письма. Из него выяснилось, что на самом деле спамом рекламируется совершенно другой сайт, а от моего используется только скрипт, который делал редирект со статусом 301 на указанный ему в параметрах адрес.
Таким образом, в современных условиях наличие на сайте скрипта, который позволяет делать редирект без какой-либо проверки, небезопасно. Возникла мысль, как можно его защитить, но при этом не слишком усложнять. Решение нашлось быстро: передаем в скрипт редиректа два параметра, один из которых — это сам URL, второй — хеш, который считается от URL и некоторой строки-ключа. Редирект происходит только тогда, когда рассчитанный на основе URL хеш совпадет с переданным, в остальных случаях выдается ошибка 404. (Естественно, при этом придется поправить все те места на сайте, где генерируется ссылка на скрипт с редиректом, чтобы рассчитать и добавить хеш.) В результате получаем вот такой скрипт: Читать далее…

Страницы:
Задать вопрос

Здесь можно задать мне вопрос или спросить совета по любой теме, затронутой в блогах или на форуме. После того, как я отвечу, вопрос и ответ появятся в соответствующем разделе. Но не забываем, что я — сторонник slow life, поэтому каких-либо сроков ответов не обещаю. Самые интересные вопросы станут основой для новых тем на форуме или записей в блоге.
Сразу предупреждаю: глупости, провокации, троллинг и тому подобное летит прямо в /dev/null.