Pull to refresh

Отправка почты из командной строки посредством msmtp

msmtp — простой консольный клиент для отправки сообщений электронной почты по протоколу SMTP.

Поскольку в сети достаточно статей про настройку msmtp через файлы конфигурации, рассмотрим возможность отправки сообщений без использования таких файлов. Это может потребоваться, например, когда адрес отправителя и данные аутентификации формируется непосредственно в скрипте перед отправкой (запрашиваются из БД и т.п.)

В данной статье рассматривается отправка почты через публичные серверы smtp на примере версии 1.4.31

Публичные серверы обычно предоставляют порты для обычного и защищенного обмена по протоколу SMTP. При обычном передача сообщений протокола идет открытым текстом. При защищенном — шифруется SSL.

Для обычного обмена как правило используется стандартный порт 25. Пример простейшего скрипта для отправки представлен ниже:

#!/bin/sh

MAIL_SERVER=smtp.from.ru
MAIL_PORT=25
MAIL_DATE=`date +"%d %b %Y %T"`
MAIL_FROM=user@from.ru
MAIL_TO=user@to.ru
MAIL_PASSWORD=12345678
MAIL_SUBJECT="Email notice"
MAIL_TEXT="This is a test Это тест"
MAIL_MESSAGE="Date: ${MAIL_DATE}
\nFrom: ${MAIL_FROM}
\nTo: ${MAIL_TO}
\nSubject: ${MAIL_SUBJECT}
\nContent-Type: text/plain; charset=UTF-8
\n\n${MAIL_TEXT}"

echo -e ${MAIL_MESSAGE} | /usr/bin/msmtp --host=${MAIL_SERVER} \
--port=${MAIL_PORT} --auth=login --user=${MAIL_FROM} \
--passwordeval="echo ${MAIL_PASSWORD}" \
-f ${MAIL_FROM} ${MAIL_TO} -d


В данном примере тело сообщения формируется в переменной MAIL_MESSAGE. Отправка сообщения производится на 25 порт сервера smtp.from.ru. Для авторизации в данном случае используются имя пользователя и пароль. В качестве имени пользователя используется адрес отправителя. Такая процедура авторизации является обычной практикой для публичных серверов. Пароль в примере передается открытым текстом, что не очень хорошо. Возможные способы защиты пароля можно найти в сети, например здесь.
Ключ -d используется для отладки обмена с сервером.

Для защищенного обмена обычно используется порт 465. При обмене с использованием SSL (SMTPS) предыдущий пример требуется немного изменить:
#!/bin/sh

MAIL_SERVER=smtp.from.ru
MAIL_PORT=465
MAIL_DATE=`date +"%d %b %Y %T"`
MAIL_FROM=user@from.ru
MAIL_TO=user@to.ru
MAIL_PASSWORD=12345678
MAIL_SUBJECT="Email notice"
MAIL_TEXT="This is a test Это тест"
MAIL_MESSAGE="Date: ${MAIL_DATE}
\nFrom: ${MAIL_FROM}
\nTo: ${MAIL_TO}
\nSubject: ${MAIL_SUBJECT}
\nContent-Type: text/plain; charset=UTF-8
\n\n${MAIL_TEXT}"

echo -e ${MAIL_MESSAGE} | /usr/bin/msmtp --host=${MAIL_SERVER} 
--port=${MAIL_PORT} --tls=on --tls-certcheck=off --tls-starttls=off --auth=login --user=${MAIL_FROM} --passwordeval="echo ${MAIL_PASSWORD}" -f ${MAIL_FROM} ${MAIL_TO} -d


В данном примере отличается номер порта MAIL_PORT, а также добавились следующие опции:
--tls=on, включает TLS туннель;
--tls-certcheck=off, без проверки сертификата (проверка сертификата выходит за рамки данной статьи);
--tls-starttls=off, данная опция выполняет немедленный запуск TLS при старте обмена с сервером;

msnmp может включать TLS туннель STARTTLS SMTP командой из обычного режима. При этом для обмена с сервером используется стандартный порт 25 (иногда 587). Чтобы включить данный режим в предыдущем примере необходимо изменить номер порта MAIL_PORT=587 и включить опцию --tls-starttls=on (можно удалить из параметров командной строки, поскольку эта опция включена в настройках программы по умолчанию)

К сожалению, программа не умет отсылать письма с вложениями. Тело письма с вложениями нужно формировать самостоятельно. Следующий пример, демонстрирует отправку такого письма:
#!/bin/sh

MAIL_SERVER=smtp.from.ru
MAIL_PORT=465
MAIL_DATE=`date +"%d %b %Y %T"`
MAIL_FROM=user@from.ru
MAIL_TO=user@to.ru
MAIL_PASSWORD=12345678
MAIL_SUBJECT="Email notice"
MAIL_TEXT="This is a test Это тест"
BOUNDARY=`date +%s|md5sum`
MAIL_BOUNDARY="0__=${BOUNDARY:0:32}"
MAIL_MIMETYPE="video/ogg"
MAIL_FILE="video.avi"
MAIL_ATTACH=`uuencode -m ${MAIL_FILE} ${MAIL_FILE} | sed '1d'`
MAIL_MESSAGE="Date: ${MAIL_DATE}
\nFrom: ${MAIL_FROM}
\nTo: ${MAIL_TO}
\nSubject: ${MAIL_SUBJECT}
\nMime-Version: 1.0
\nContent-Type: multipart/mixed; boundary="${MAIL_BOUNDARY}"
\nContent-Disposition: inline
\n\n
\n--${MAIL_BOUNDARY}
\nContent-Type: text/plain; charset=UTF-8
\nContent-Disposition: inline
\n\n
\n${MAIL_TEXT}
\n\n
\n--${MAIL_BOUNDARY}
\nContent-Type: ${MAIL_MIMETYPE}; name="${MAIL_FILE}"\n
\nContent-Disposition: attachment; filename="${MAIL_FILE}"\n
\nContent-Transfer-Encoding: base64\n
\n\n
\n${MAIL_ATTACH}
\n--${MAIL_BOUNDARY}
\n"

echo -e ${MAIL_MESSAGE} | /usr/bin/msmtp --host=${MAIL_SERVER} \
--port=${MAIL_PORT} --auth=login --user=${MAIL_FROM} \
--passwordeval="echo ${MAIL_PASSWORD}" \
-f ${MAIL_FROM} ${MAIL_TO} -d


В этом примере параметры командной строки msmtp такие же, как в первом скрипте.
Сообщение состоит из двух секций, разделяемых специальной меткой MAIL_BOUNDARY.
Секция с текстом сообщения находится непосредственно в теле письма.
Вложение в данном примере представляет собой секцию с содержимым видеофайла, кодированную base64 при помощи утилиты uuencode.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.