Linux コマンドラインを使用してファイルを電子メールの添付ファイルとして送信するにはどうすればよいですか?
-
08-06-2019 - |
質問
Linux サーバーで毎晩実行するスクリプトを作成しました。 mysqldump
各 MySQL データベースを .sql ファイルにバックアップし、圧縮された .tar ファイルとしてパッケージ化します。私が達成したい次のステップは、その tar ファイルを電子メール経由でリモート電子メール サーバーに送信し、保管することです。バックアップテキストファイルをパイプして、本文の生のスクリプトを電子メールに送信することができました。 mailx
そのようです:
$ cat mysqldbbackup.sql | mailx backup@email.com
cat
にパイプされたバックアップ ファイルのテキストをエコーします。 mailx
受信者の電子メール アドレスを引数として渡すプログラム。
これで必要なことは実現できましたが、もう一歩改善できる可能性があると思います。 シェル スクリプトなどを使用して、圧縮された .tar ファイルを送信電子メール メッセージに送信する方法はありますか? アタッチメント? これにより、ヘッダー データが含まれ、ワードラップの問題などが頻繁に発生する非常に長い電子メール メッセージを処理する必要がなくなります。
解決
雑なものはどれも私には役に立ちませんでした。電子メールアドレスが添付ファイルの一部であると考えられていました。しなければならなかった:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
他のヒント
または、失敗したマット:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
見てから man mailx
, 、mailx プログラムにはファイルを添付するオプションがありません。mutt などの別のプログラムを使用することもできます。
echo "This is the message body" | mutt -a file.to.attach -s "subject of message" recipient@domain.com
Mutt のコマンドライン オプションは次のように表示できます。 mutt -h
.
Linux のバージョンによっては、メールと呼ばれる場合があります。上記の @David を引用すると、次のようになります。
mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
または:
cat message.txt | mail -s "Backup" -a mysqldbbackup.sql backup@email.com
私はエムパックを使っています。
mpack -s subject file user@example.com
残念ながら、mpack は '-' を stdin のエイリアスとして認識しません。ただし、次の場合は機能し、(シェル) エイリアスまたはスクリプトで簡単にラップできます。
mpack -s subject /dev/stdin loser@example.com < file
このシナリオ用に作成された SendEmail を使用します。Ubuntu用にパッケージ化されているので、利用できると思います
sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
使用できます 雑種 添付ファイル付きのメールを送信するには
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
私はかつて、Solaris 上の ksh 用に次の関数を作成しました (base64 エンコードに Perl を使用)。
# usage: email_attachment to cc subject body attachment_filename
email_attachment() {
to="$1"
cc="$2"
subject="$3"
body="$4"
filename="${5:-''}"
boundary="_====_blah_====_$(date +%Y%m%d%H%M%S)_====_"
{
print -- "To: $to"
print -- "Cc: $cc"
print -- "Subject: $subject"
print -- "Content-Type: multipart/mixed; boundary=\"$boundary\""
print -- "Mime-Version: 1.0"
print -- ""
print -- "This is a multi-part message in MIME format."
print -- ""
print -- "--$boundary"
print -- "Content-Type: text/plain; charset=ISO-8859-1"
print -- ""
print -- "$body"
print -- ""
if [[ -n "$filename" && -f "$filename" && -r "$filename" ]]; then
print -- "--$boundary"
print -- "Content-Transfer-Encoding: base64"
print -- "Content-Type: application/octet-stream; name=$filename"
print -- "Content-Disposition: attachment; filename=$filename"
print -- ""
print -- "$(perl -MMIME::Base64 -e 'open F, shift; @lines=<F>; close F; print MIME::Base64::encode(join(q{}, @lines))' $filename)"
print -- ""
fi
print -- "--${boundary}--"
} | /usr/lib/sendmail -oi -t
}
mailx を使用して、平文の添付ファイルを 1 つ含む平文の本文メールを送信します。
(
/usr/bin/uuencode attachfile.txt myattachedfilename.txt;
/usr/bin/echo "Body of text"
) | mailx -s 'Subject' youremail@gmail.com
以下は、改行を除いた上記と同じコマンドです。
( /usr/bin/uuencode /home/el/attachfile.txt myattachedfilename.txt; /usr/bin/echo "Body of text" ) | mailx -s 'Subject' youremail@gmail.com
ファイルがあることを確認してください /home/el/attachfile.txt
この内容で定義されます:
<html><body>
Government discriminates against programmers with cruel/unusual 35 year prison
sentences for making the world's information free, while bankers that pilfer
trillions in citizens assets through systematic inflation get the nod and
walk free among us.
</body></html>
uuencode をお持ちでない場合は、これをお読みください。 https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
Linux では、sendmail を使用して PDF 添付ファイルを含む HTML 本文の電子メールを送信します。
ksh がインストールされていることを確認してください。 yum info ksh
sendmail がインストールされ、設定されていることを確認してください。
uuencode がインストールされ、利用可能であることを確認してください。 https://unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work
という名前の新しいファイルを作成します test.sh
それをホームディレクトリに置きます。 /home/el
次のコードを入れます test.sh
:
#!/usr/bin/ksh
export MAILFROM="el@defiant.com"
export MAILTO="youremail@gmail.com"
export SUBJECT="Test PDF for Email"
export BODY="/home/el/email_body.htm"
export ATTACH="/home/el/pdf-test.pdf"
export MAILPART=`uuidgen` ## Generates Unique ID
export MAILPART_BODY=`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: multipart/alternative; boundary=\"$MAILPART_BODY\""
echo ""
echo "--$MAILPART_BODY"
echo "Content-Type: text/plain; charset=ISO-8859-1"
echo "You need to enable HTML option for email"
echo "--$MAILPART_BODY"
echo "Content-Type: text/html; charset=ISO-8859-1"
echo "Content-Disposition: inline"
cat $BODY
echo "--$MAILPART_BODY--"
echo "--$MAILPART"
echo 'Content-Type: application/pdf; name="'$(basename $ATTACH)'"'
echo "Content-Transfer-Encoding: uuencode"
echo 'Content-Disposition: attachment; filename="'$(basename $ATTACH)'"'
echo ""
uuencode $ATTACH $(basename $ATTACH)
echo "--$MAILPART--"
) | /usr/sbin/sendmail $MAILTO
上部のエクスポート変数を変更します。 test.sh
アドレスとファイル名を反映します。
テスト用の PDF ドキュメントをダウンロードして配置します /home/el
pdf-test.pdf という名前
/home/el/email_body.htm というファイルを作成し、その中に次の行を追加します。
<html><body><b>this is some bold text</b></body></html>
PDF ファイルに十分な 755 権限があることを確認してください。
スクリプトを実行する ./test.sh
電子メールの受信箱を確認すると、テキストは HTML 形式であり、PDF ファイルはバイナリ ファイルとして自動的に解釈されます。この機能を使用するのは 1 日に 15 回を超えないように注意してください。たとえ自分にメールを送信したとしても、Gmail のスパム フィルターはメールを送信するドメインをブラックリストに登録し、メールを通過させるオプションを提供しない可能性があります。そして、これが機能しなくなったり、添付ファイルのみが通過したり、電子メールがまったく届かなかったりすることがわかります。これに関して多くのテストを行う必要がある場合は、数日に分けてテストしてください。そうしないと、スパム送信者としてレッテルを貼られ、この機能が機能しなくなります。
ここに示唆する答えがいくつかあります mail
または mailx
したがって、これは文脈の中でこれらを解釈するのに役立つ背景です。
歴史的メモ
Unixの起源 mail
Bell Labs Unix™ の初期の歴史 (1969 年?) の霧の中に遡り、おそらくここでその完全な系図に立ち入ることは期待できません。コードを継承または再実装する (または再実装からコードを継承する) プログラムがたくさんあると言えば十分でしょう。 mail
そして、明確に「その」と識別できる単一のコードベースは存在しないこと mail
.
しかし、その地位を争う候補者の 1 つは確かに、最初に呼ばれた「バークレー メール」です。 Mail
2BSD (1978) では大文字の M が付きます。しかし 3BSD (1979) では、小文字が置き換えられました。 mail
コマンドも同様であり、新たな混乱を引き起こしています。SVR3 (1986) には、と呼ばれる派生物が含まれていました。 mailx
. 。の x
おそらく、ユニークで明確にするために追加されたものと思われます。しかし、これも現在ではコピーされ、再実装され、破壊されているため、決定的な単一のバージョンは存在しません。
昔は、 デファクト 電子メールでバイナリを送信するための標準は、 uuencode
. 。それはまだ存在していますが、使いやすさに多くの問題があります。1980 年代後半と通信できるように特別に努力しない限り、可能であれば、代わりに MIME 添付ファイルを送信する必要があります。
マイム これは、電子メールに関するいくつかの問題を解決するために 1990 年代初頭に導入されました。これには、実際には英語 (およびハワイ語) のサブセットにのみ適した単一文字セットのプレーン テキスト以外のさまざまなタイプのコンテンツのサポートが含まれます。 。これにより、マルチパート メッセージ、国際化、リッチ コンテンツ タイプなどのサポートが導入され、1990 年代を通じて急速に普及しました。
( 家宝 mail
/mailx
歴史メモ これを作成するときに最も役立ちました。そのようなことに興味がある場合は、確かに読む価値があります)。
現在の製品
2018 年の時点で、Debian には 3 つのパッケージがあります。 mail
または mailx
指示。(検索できます Provides: mailx
.)
debian$ aptitude search ~Pmailx
i bsd-mailx - simple mail user agent
p heirloom-mailx - feature-rich BSD mail(1)
p mailutils - GNU mailutils utilities for handling mail
(私は Debian を推奨として取り上げているわけではありません。それは私が使っているものなので、よく知っています。また、それぞれのパッケージ名を参照することで、さまざまな代替案を明確に区別する手段を提供します。明らかに、Ubuntu がこれらのパッケージを取得するディストリビューションでもあります。)
bsd-mailx
は比較的単純ですmailx
どちらがするのか ない MIME 添付ファイルの送信をサポートしているようです。それを参照してください マニュアルページ これは、MacOS を含む *BSD システムでデフォルトで見つかると予想されるものであることに注意してください。heirloom-mailx
今呼ばれていますs-nail
そして する MIME 添付ファイルの送信をサポート-a
. 。それを参照してください マニュアルページ そしてより一般的には 家宝プロジェクトmailutils
別名 GNU メールユーティリティ が含まれていますmail
/mailx
互換性ラッパー どれの する MIME 添付ファイルの送信をサポート-A
これらの懸念があるため、コードを移植可能にする必要があり、やや複雑なパッケージに依存できる場合、MIME 添付ファイルを移植可能に送信する簡単な方法は次のとおりです。 使用 mutt
.
別の選択肢 - スワクス (SMTP 用スイスアーミーナイフ)。
swaks -tls \
--to ${MAIL_TO} \
--from ${MAIL_FROM} \
--server ${MAIL_SERVER} \
--auth LOGIN \
--auth-user ${MAIL_USER} \
--auth-password ${MAIL_PASSWORD} \
--header "Subject: $MAIL_SUBJECT" \
--header "Content-Type: text/html; charset=UTF-8" \
--body "$MESSAGE" \
--attach mysqldbbackup.sql
metamail には、metasend ツールがあります
metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
私が使用した
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
そしてこれは私にとってはうまくいきました....
mailx
持っています -a
添付ファイルのオプションが追加されました。
私は通常、RHEL では mail コマンドのみを使用します。mailx を試してみましたが、かなり効率的です。
mailx -s "Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com
This is the content of my msg.
.
私にとっての最短の方法は
file=filename_or_filepath;uuencode $file $file|mail -s "optional subject" email_address
したがって、あなたの例では次のようになります
file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s "file with magnets" ph.gachoud@gmail.com
良い点は、それを思い出すことができることです Ctrl+R 別のファイルを送信するには...
ソースマシンから
mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com
宛先マシン上。受信したメール本文を名前を付けて保存 db.sql.gz.b64;それから..
base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
mailxコマンドを使用する
echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com
センドメールを使用する
#!/bin/ksh
fileToAttach=data.txt
`(echo "To: user@company.com"
echo "Cc: user@company.com"
echo "From: Application"
echo "Subject: your subject"
echo your body
uuencode $fileToAttach $fileToAttach
)| eval /usr/sbin/sendmail -t `;
2 セント追加するために、独自の PHP スクリプトを作成します。
http://php.net/manual/en/function.mail.php
このページの例には、添付を行うためのさまざまな方法があります。
電子メールを送信する方法ではありませんが、オンライン Git サーバー (例:Bitbucket または同様のサービス)。
このようにして、使用できます git push
コマンドを使用すると、すべてのバージョンが圧縮されて整理された方法で保存されます。
CentOS で 1 つの大きなログ ファイルを処理する方法は次のとおりです。
MAIL="`whereis mail | awk '{print $2}'`"
WHOAMI="`whoami`"
HOSTNAME="`hostname`"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="`basename "$0"`_`date "+%Y%m%d_%H%M"`"
# Arhiveerime ning kui hästi, saadame edasi:
/bin/tar -zcvf ${LOGDIR}/${LOGNAME}.tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
if [ $? -eq 0 ]; then
cd ${LOGDIR}
# This works too. The message content will be taken from text file below
# echo 'Hello!' >/root/scripts/audit_check.sh.txt
# echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
echo "Arhiivifail manuses" | ${MAIL} -s "${HOSTNAME} Aide report" -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
/bin/rm "${LOGDIR}/${LOGNAME}.log"
fi
ファイルがテキストの場合は、次のように本文で送信するのが最も簡単です。
sendmail recipient@example.com < message.txt
Mailutils を使えばこれは簡単です
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
-A file
ファイルを添付します-M
MIME を有効にすると、添付ファイルとプレーンテキストの本文を含めることができます。
まだインストールされていない場合は、実行します
sudo apt install mailutils
もう一つについて mutt
:デフォルトでは、「From:」フィールドにあなたの住所と名前が使用されます。それが必要でない場合は、次のような文字列を含む代替の muttrc ファイルを作成できます。set from="私のメールデーモン"
このファイルを次のように使用します -F
コマンドラインオプション。
Mutt が動作しない、またはインストールされていない場合は、これを試してください。
*#!/bin/sh
FilePath=$1
FileName=$2
Message=$3
MailList=$4
cd $FilePath
Rec_count=$(wc -l < $FileName)
if [ $Rec_count -gt 0 ]
then
(echo "The attachment contains $Message" ; uuencode $FileName $FileName.csv ) | mailx -s "$Message" $MailList
fi*