Отправить письмо, используя «sendmail» с uuencode и имея тему вместе с - PullRequest
3 голосов
/ 09 ноября 2011

Я пытаюсь отправить письмо с вложением, используя sendmail. Проблема в том, что я не могу отправить строку темы вместе с этим.

Следующая командная строка запускает две почты вместо одной - одну с «Subject : Report», а другую с вложением:

/usr/bin/gmime-uuencode "/tmp/url_by_ip.txt" "Report.txt" | echo "Subject: Report" | /usr/sbin/sendmail <sender> <receiver>

Ответы [ 4 ]

9 голосов
/ 09 ноября 2011

Если вы можете использовать другие команды, я бы предложил mutt, который может легко обрабатывать вложения:

mutt -a file_to_attach -s "your subject" recipient@test.com < /tmp/mail_content

Если вы застряли с /usr/sbin/sendmail, тогда вам нужно сделать гораздо больше.,sendmail не имеет понятия вложений и рассматривает содержимое электронной почты как простой текст US-ASCII (подробности см. в этом ответе ).

Для отправки прикрепленных файлов с sendmail вам потребуетсяотформатировать содержимое почты как сообщение MIME.Некоторые примеры см. В этой ветке форума на unix.com .


Чтобы помочь вам в этом, вот быстрый непроверенный пример использования bash.Для краткости я жестко закодировал переменные, но вы можете довольно легко преобразовать пример в скрипт / функцию, которая принимает соответствующие переменные в качестве аргументов.

#!/bin/bash
# --- user params ---
MAILFROM="peter.gibbons@initech.com"
MAILTO="bill.lumbergh@initech.com"
SUBJECT="TPS Report"
BODY_FILE="/home/peter/coversheey.txt"  # file holding mail body
ATT_FILE="/tnp/url_by_ip.txt"   # file to attach
ATT_AS_FILE="Report.txt"   # name to attach as

# --- generated values ---
BOUNDARY="unique-boundary-$RANDOM"
BODY_MIMETYPE=$(file -ib $BODY_FILE | cut -d";" -f1)   # detect mime type
ATT_MIMETYPE=$(file -ib $ATT_FILE | cut -d";" -f1)     # detect mime type
ATT_ENCODED=$(base64 < $ATT_FILE)  # encode attachment

# --- generate MIME message and pipe to sendmail ---
cat <<EOF | /usr/sbin/sendmail $MAILTO
MIME-Version: 1.0
From: $MAILFROM
To: $MAILTO
Subject: $SUBJECT
Content-Type: multipart/mixed; boundary="$BOUNDARY"

--$BOUNDARY
Content-Type: $BODY_MIMETYPE
Content-Disposition: inline

$(cat $BODY_FILE)
--$BOUNDARY
Content-Type: $ATT_MIMETYPE; name="$ATT_AS_FILE"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$ATT_AS_FILE"

$ATT_ENCODED
--$BOUNDARY
EOF

Конечно, если вы счастливы использоватьязык сценариев более высокого уровня (Python, Ruby, Perl, ...), тогда будут существующие модули, которые уже сделают вам тяжелую работу.

ps. Также есть утилита mpack , котораявыполняет преобразование MIME за вас, но AFAIK по умолчанию оно не приходит в большинстве * nix-боксов.

2 голосов
/ 17 ноября 2012

Создайте файл с вашим почтовым заголовком, например, mail.txt:

Subject: here is the subject

Вот скрипт для отправки электронного письма:

#!/bin/bash
cat mail.txt > mail_to_send
cat attachment | uuencode attachment >> mail_to_send
sendmail recipient@example.com < mail_to_send
rm mail_to_send
0 голосов
/ 09 ноября 2011

Возможно, вы хотите, чтобы некоторые утилиты отправляли MIME почту? Существует библиотека vmime C ++ , многие языки сценариев (Python, Ruby, Perl, Ocaml, ...) имеют пакеты для MIME. Есть также команды, которые можно использовать в сценариях оболочки, например mpack и многие другие.

0 голосов
/ 09 ноября 2011

Попробуйте это:

mail -s 'Report' myemail@yahoo.com < tmp/url_by_ip.txt

...