他のコマンドを使用できる場合は、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 MIME 変換を行うmpackユーティリティもありますが、私の知る限り、ほとんどの *nix ボックスにはデフォルトで付属していません。