Отправка письма с аттачем из скрипта

Возникла задача отправить письмо с аттачем из bash-скрипта, который запускается по cron'у. В принципе, есть простое решение: поставить пакет metamail и звать на помощь команду metasend. К сожалению, это не наш путь, т.к. скрипт должен выполняться на генте, с которой проблем нет, и на старом-старом ASPLinux'е, пакеты к которому уже не найдёшь.

Творческое почесывание макушки привело к такому решению:

#####################################################################
#
## Part 2. Mail report.
#
#####################################################################
 
 
MAILFROM="from@some.tld"
MAILTO="to@another.tld dst@theother.tld"
SUBJECT="Server data `date +%F\ %X`"
BODY="${SUBJECT}"
ATTACH="/tmp/top_secret_data.txt"
MAILPART=`uuidgen` ## Generates Unique ID
 
(
    echo "From: $MAILFROM"
    echo "To: $MAILTO"
    echo "Subject: $SUBJECT"
    echo "MIME-Version: 1.0"
    echo "Content-Type: multipart/mixed; boundary=\"$MAILPART\""
    echo ""
    echo "--$MAILPART"
    echo "Content-Type: text/plain; charset=ISO-8859-1"
    echo ""
    echo $BODY
    echo ""
    echo "--$MAILPART"
    echo 'Content-Type: text/csv; name="'new_server_$(basename $ATTACH)'"'
    echo "Content-Transfer-Encoding: base64"
    echo 'Content-Disposition: attachment; filename="'new_server_$(basename $ATTACH)'"'
    echo ""
    openssl base64 -in $ATTACH
    echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO

Что важно в данном решении:

  • используется только три команды: echo, openssl и sendmail. Мне еще ни разу не встречались системы в которых не было бы этих команд, т.е. решение в высшей степени портабольно.
  • Если _тело_ письма (т.е. непосредственно его текст) должно содержать альтернативные представления, например, html и plain-text, необходимо завести еще один разделитель, с помощью которого разделять вхождения альтернативных представленией. Т.е. вместо:
    echo "Content-Type: text/plain; charset=ISO-8859-1"
    echo ""
    echo $BODY
    echo ""

надо указать что-то типа такого:

    echo "Content-Type: multipart/alternative; boundary=\"$MAILPART_BODY\""
    echo ""
    echo "--$MAILPART_BODY"
    echo "Content-Type: text/plain; charset=ISO-8859-1"
    echo ""
    echo $PLAIN_TEXT_BODY
    echo "--$MAILPART_BODY"
    echo "Content-Type: text/html; charset=ISO-8859-1"
    echo "Content-Disposition: inline"
    echo $HTML_TEXT_BODY
    echo "--$MAILPART_BODY--"
    echo ""

sys/отправка_письма_с_аттачем_из_скрипта.txt · Последние изменения: 2013-08-24 22:41 — Andrew A. Sabitov