Если вы можете использовать другие команды, я бы предложил 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-боксов.