Как стать автором
Обновить

Отправка почты из командной строки посредством 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.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.