msmtp — простой консольный клиент для отправки сообщений электронной почты по протоколу SMTP.
Поскольку в сети достаточно статей про настройку msmtp через файлы конфигурации, рассмотрим возможность отправки сообщений без использования таких файлов. Это может потребоваться, например, когда адрес отправителя и данные аутентификации формируется непосредственно в скрипте перед отправкой (запрашиваются из БД и т.п.)
В данной статье рассматривается отправка почты через публичные серверы smtp на примере версии 1.4.31
Публичные серверы обычно предоставляют порты для обычного и защищенного обмена по протоколу SMTP. При обычном передача сообщений протокола идет открытым текстом. При защищенном — шифруется SSL.
Для обычного обмена как правило используется стандартный порт 25. Пример простейшего скрипта для отправки представлен ниже:
В данном примере тело сообщения формируется в переменной MAIL_MESSAGE. Отправка сообщения производится на 25 порт сервера smtp.from.ru. Для авторизации в данном случае используются имя пользователя и пароль. В качестве имени пользователя используется адрес отправителя. Такая процедура авторизации является обычной практикой для публичных серверов. Пароль в примере передается открытым текстом, что не очень хорошо. Возможные способы защиты пароля можно найти в сети, например здесь.
Ключ -d используется для отладки обмена с сервером.
Для защищенного обмена обычно используется порт 465. При обмене с использованием SSL (SMTPS) предыдущий пример требуется немного изменить:
В данном примере отличается номер порта MAIL_PORT, а также добавились следующие опции:
--tls=on, включает TLS туннель;
--tls-certcheck=off, без проверки сертификата (проверка сертификата выходит за рамки данной статьи);
--tls-starttls=off, данная опция выполняет немедленный запуск TLS при старте обмена с сервером;
msnmp может включать TLS туннель STARTTLS SMTP командой из обычного режима. При этом для обмена с сервером используется стандартный порт 25 (иногда 587). Чтобы включить данный режим в предыдущем примере необходимо изменить номер порта MAIL_PORT=587 и включить опцию --tls-starttls=on (можно удалить из параметров командной строки, поскольку эта опция включена в настройках программы по умолчанию)
К сожалению, программа не умет отсылать письма с вложениями. Тело письма с вложениями нужно формировать самостоятельно. Следующий пример, демонстрирует отправку такого письма:
В этом примере параметры командной строки msmtp такие же, как в первом скрипте.
Сообщение состоит из двух секций, разделяемых специальной меткой MAIL_BOUNDARY.
Секция с текстом сообщения находится непосредственно в теле письма.
Вложение в данном примере представляет собой секцию с содержимым видеофайла, кодированную base64 при помощи утилиты uuencode.
Поскольку в сети достаточно статей про настройку 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.