私はAmazon Linuxを使用してbashスクリプトを生成しています。電子メールで添付ファイルを送信しようとしました。
(cat $TFILE1; uuencode $output_file $output_file) | mailx -s "$subject" "$to_email"
しかし、私が経験している問題は、添付ファイルが(少なくともGmailでは)「noname」という名前で表示されることです。 "$output_file"変数と同じ名前で添付ファイルを表示する方法はありますか?
答え1
添付ファイルに問題があることがmail
わかりました。これをmailx
試してくださいmutt
。添付ファイルをうまく処理し、ファイル名をそのままにしてください。
mutt -a "$attachment_file" -s "$subject" -- "$to_email" < "$TFILE1"
"$TFILE1"
電子メールメッセージの本文はどこにありますか?/dev/null
添付ファイルのみを送信するにはに変更してください。
答え2
mpack
添付ファイル名を入力ファイル名と同じに設定します。したがって、たとえば(-a
インライン以外の添付ファイルの場合は、-s
件名設定、-c
MIMEタイプ設定、1.png
添付するファイル、anthony@localhost
送信する電子メールアドレス):
mpack -a -s 'test mpack' -c image/png 1.png anthony@localhost
1.png
ファイル名を電子メールで送信してください。
Content-Type: image/png; name="1.png"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="1.png"
Content-MD5: EGqHjkvvXXcaO+41lBN2uA==
したがって、ファイル名を正しく指定してくださいmpack
。
別のオプションは、メッセージを完全に制御したい場合ですmime-construct
。
答え3
uuencode
1990年代初頭の残骸なので、適切なMIMEツールを使用することは可能であれば避けるべきです。
残念ながらまだありません。実はMIMEメッセージを送信するための標準の単純なUnixコマンドラインユーティリティ。近いmutt
ですが(まだ基本的にインタラクティブなプログラムなので、スクリプトがMTAにメッセージを送信するだけであればかなりの容量が含まれています)。
最新のスクリプト言語を使用して、ほんの数行のコードでテキスト本文部分とバイナリ添付ファイルを含むいくつかの部分で構成されるメッセージを送信するツールです。ベアシェルスクリプトでは、コードは少しかさばりますが、操作を正しく実行するのに十分なMIMEについて十分に知っていることがしばしば問題です。つまり、MIMEメッセージの全体的な構造と、使用したい本文のサブタイプをエンコードする方法を理解する必要があります。
( printf 'From: %s\nTo: %s\nSubject: %s\n' "$sender" "$recipient" "$subject"
printf 'Mime-Version: 1.0\nContent-type: multipart/mixed; boundary="foooobar"\n'
printf '\n--foooobar\n\n'
cat "$TFILE1"
printf '\n--foooobar\nContent-type: application/octet-stream; name="%s"\n' "${output_file##*/}"
printf 'Content-transfer-encoding: base64\n\n'
base64 "$output_file"
printf '\n--foooobar--\n' ) |
sendmail -t
これはデフォルトの7ビットUS-ASCIIテキストで機能します。特に、ヘッダーに8ビットのテキストが必要な場合は、さまざまな追加のバリエーションがあります(人間が読めるテキストの場合はRFC 2047、ファイル名の場合はRFC 2047など)。 RFC 2231)、この時点ではこれらの詳細をカプセル化する言語に切り替える必要があるため、詳細を理解したり心配する必要はありません。
実際のコミットへの依存関係を除いて、base64
これは純粋に組み込み関数であり、非常に基本的なシェルユーティリティです。最後のスラッシュのすべてを削除するには、最新のシェルでsendmail
パラメータ拡張を使用する必要が${output_file##*/}
ありますが、非常に古いシェルを使用している場合はそれを使用する必要がありますbasename
。