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

Возникла задача отправить письмо с аттачем из 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 ""

Tracedump:

newBaseSize: 16pt
newBaseSizeInPt: 16