Linuxコマンドラインを使用してファイルを電子メールの添付ファイルとして送信するにはどうすればよいですか?


289

Linuxサーバーで毎晩実行するスクリプトを作成しました。このスクリプトを使用mysqldumpして、MySQLデータベースのそれぞれを.sqlファイルにバックアップし、それらを圧縮された.tarファイルとしてパッケージ化します。私が達成したい次のステップは、そのtarファイルを電子メールでリモートの電子メールサーバーに送信して、安全を確保することです。次のようにバックアップテキストファイルをパイプ処理することで、本文の生のスクリプトを電子メールで送信できましmailxた。

$ cat mysqldbbackup.sql | mailx backup@email.com

catmailx引数として渡された受信者の電子メールアドレスを使用してプログラムにパイプされるバックアップファイルのテキストをエコーします。

これは私が必要とするものを達成しますが、私はそれが1ステップ良くなると思います、シェルスクリプトなどを使用して、圧縮された.tarファイルを添付ファイルとして送信メールメッセージに送信する方法はありますか? これは、ヘッダーデータを含み非常に長い電子メールメッセージを処理しなければならず、多くの場合、ワードラップの問題などがあります。


1
MySQLデータベースをバックアップするスクリプトを共有できますか?
Almino Melo 2014

申し訳ありませんが、これをしばらく行っていません。私はそれを呼び出してmysqldumpから出力をメールに添付することを知っています(を使ってmutt)。出力をzip / tar.gzに圧縮するステップもあったかもしれません...
Kit Roed

1
純粋に好奇心が強い、なぜバックアップをscpまたはrsyncで電子メールで送信するのですか?
jchook 2018

回答:


298

muttのどれも私のために働きませんでした。電子メールアドレスは添付ファイルの一部であると考えていました。しなければならなかった:

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com

1
私はmutt 1.5.21(2010-09-15)を使用していますが、受信者の電子メールの後に-aパラメータを
付ける

openSUSE Leap 42.1でMutt 1.5.24(2015-08-30)を使用して私のために働きました。
Antonio Vinicius Menezes Medei

3
@fugitiveは「オプションの終わり」を意味します。見てみましょうunix.stackexchange.com/questions/11376/...
rynop

例外を確認して送信を再試行する方法はありますか?
ti034 2018

79

または、muttの失敗:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com

26
これにより、uuencodeされた部分が添付ファイルとしてではなくインラインで送信されます。ただし、多くのメールクライアントはこれを認識し、uuencodeされた部分を添付ファイルとして表示します。
FuePi

4
この日と年齢ではuuencodeを使用しないでください。MIMEは少し複雑ですが、はるかにユーザーフレンドリーです。
tripleee 2012

@DavidGiven:たとえば、この質問に対する他のすべての回答を(一目で)確認してください。
tripleee 2013

6
メールを使用していない!
ダビデは考える

次に、例:stackoverflow.com/questions/3317174/…text/htmlを、添付ファイルに適したMIMEタイプに置き換えます。(この具体的な例では、私は推測しapplication/gzipます。)
tripleee

43

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 

@KarelBílek:他のオプションはどうですか?
Nathan Fellman、2012年

どちらのソリューションもうまくいきません。Outlook 2013を含むメールを受信しましたが、メールにはファイル名のみが含まれています
Nick715

2
私のmanページは読む:-a, --append=HEADER: VALUE append given header to the message being sent
exhuma

2
ネイサン、デイビッドからの引用が間違っているようです-彼はmuttコマンドではなく、コマンドを使用しましたmail。また、他の人が指摘したように、mutt --はアドレスの前に引数を必要とするようです。そして、@ exhumaと私は実際に-aオプションが何をするかについて同意することがわかりますmail-私は1分間そこで混乱しました;)
nealmcb

7
-aの代わりに-Aを使用する必要があります: -a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILE attach FILE
Victor Perov

41

を見ると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


ありがとう!これでうまくいき、黙ってmuttにアクションを実行させるのに苦労しました。
キットRoed

10
以下の回答(stackoverflow.com/a/9524359/10608)を参照してください。muttの構文が変更されたため、今ではが必要--です。
アレクサンダーバード

29

このシナリオ用に作成されたSendEmailを使用します。Ubuntu用にパッケージ化されているので、利用可能だと思います

sendemail -f sender@some.where -t receiver@some.place -m "Here are your files!" -a file1.jpg file2.zip

http://caspian.dotconf.net/menu/Software/SendEmail/


私の例では、「sendemail」ではなく「sendEmail」である必要があると思います。
ダビット2014年

1
いいえはい-これは(Unixの世界で)コマンドラインツールは珍しく命名戦略である一方、ソース(カスピ海)は、少なくとも、このソフトウェアのUbuntuのパッケージは両方を提供し、大文字のEを使用していますsendemailし、sendEmail中に/usr/bin/
Fredrik Wendt 2014年

私のXubuntu 14.04.3がインストールされていませんSendEmail
Vitaly Zdanevich

3
コマンドを機能させるには、sudo apt install sendemailを使用してsendemailをインストールし、必須のfromフィールドに「-f required@email.com」を追加します。 sendemail -f mandatory@email.com-t to@some.one -m "Here are your files!" -a file1.jpg file2.zip
Sailendra Pinupolu 2016

28

私はmpackを使用します。

mpack -s subject file user@example.com

残念ながら、mpackは「-」をstdinのエイリアスとして認識しません。しかし、次の作業は、(シェル)エイリアスまたはスクリプトで簡単にラップできます。

mpack -s subject /dev/stdin loser@example.com < file

これはstdinのbashで機能します。:私は試していないので、私は、MPackのを持っていないmpack -s subject /dev/stdin loser@example.com <(stdout_generating_program)
thomasa88

23
 echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com

4
これは受け入れられる答えになるはずです。デフォルトのmailxを使用し、完全に機能します。Mutt v1.5.21は、cronの使用時に1MBを超える添付ファイルの送信を拒否します。
ジョセフ

EC2で動作するものを探していましたが、これは問題なく動作しました。
特異点

6
mailx適切に標準化されていません。それを推奨する答えは、この警告を指摘する必要があります。一般的に使用されている互換性のないバリアントが少なくとも3つあります。
tripleee

13

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
}

8
GNU / Linuxでは、base64エンコーディングにperlの代わりにコマンドを使用できます
MestreLion

12

muttを使用して、添付ファイル付きのメールを送信できます

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt

2
少なくともmutt 1.5.21(Ubuntu信頼)-a以降では、オプションを受信者の後 に置くmutt -s "Backup" backup@email.com -a mysqldbbackup.sql < message.txtか、または--rynopの回答に示されているように、受信者の前にオプションを使用する必要があります。
nealmcb

10

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のスパムフィルターにより、ドメインからのメールをブラックリストに載せることができます。そして、これが機能しなくなったり、添付ファイルのみを通過したり、電子メールがまったく届かなかったりすることがわかります。これについて多くのテストを行う必要がある場合は、何日にもわたって広げてください。そうしないと、スパマーと分類されて、この機能は機能しなくなります。


1
私にとっては、逆の方法で機能しました。(echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' user@domain.com
Vicky

uuencodeはない、適切に添付。それは単に他のテキストの真ん中にOomputerが読めるテキストの塊を埋め込むだけです。より良いメカニズムがなかったときにそれはうまく機能していましたが、それは20年以上前でした。
tripleee

9

いくつかの答えが示唆ここにありますmailmailx、これはあなたがコンテキストでこれらを解釈するのを助けるために、背景の詳細ですので。

歴史ノート

Unixの起源はmail、Bell Labs Unix™の初期の歴史(1969年?)の霧にさかのぼります。おそらく、ここでその完全な系譜に入るのは望めません。そこからコードを継承または再実装する(または再実装からコードを継承する)多くのプログラムがありmail、「the」と明確に識別できる単一のコードベースは存在しないと言えば十分でしょうmail

ただし、その立場の候補の1つは、確かMailに2BSD(1978)で大文字のMを使用して最初に呼び出された「Berkeley Mail」です。しかし、3BSD(1979)では、小文字のmailコマンドも置き換えられ、新しい混乱を招きました。SVR3(1986)には、と呼ばれる派生物が含まれていましたmailxxおそらくそれはユニークかつ明瞭にするために追加されました。しかし、これもコピーされ、再実装され、切断されているため、明確な個別バージョンはありません。

昔は、バイナリを電子メールで送信するための事実上の標準はでしたuuencode。それはまだ存在していますが、多くのユーザビリティの問題があります。可能であれば、1980年代後半と通信できるように特に努力しない限り、代わりにMIME添付ファイルを送信する必要があります。

MIMEは1990年代初頭に導入され、電子メールに関するいくつかの問題を解決するために導入されました。たとえば、英語のサブセットにしか適さない単一の文字セットのプレーンテキスト以外のさまざまなタイプのコンテンツのサポート(そして、ハワイ語) )。これにより、マルチパートメッセージ、国際化、リッチコンテンツタイプなどのサポートが導入され、1990年代を通じて急速に勢いを増しました。

家宝mail/ mailx歴史ノートはこれを作成するときに最も役立ちました、そしてあなたがその種のものに興味があるなら確かに読む価値があります。)

現在の提供物

2018年現在、Debianにはmailor mailxコマンドを含む3つのパッケージがあります。(で検索できます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がこれらのパッケージを取得します。)

これらの懸念により、コードを移植可能にする必要があり、やや複雑なパッケージに依存する可能性がある場合、MIME添付ファイルを移植可能に送信する簡単な方法はを使用することmuttです。


私はもともと適度に人気の重複した質問への答えとしてこれを投稿stackoverflow.com/questions/902591/...
tripleee

4

別の代替-Swaks(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

2

metamailにはmetasendツールがあります

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b

これは、ほとんどすべての場所にインストールされていましたが、ほとんど使用されていませんでした。長い間メンテナンスされていなかったため(そしてAFAIKのままです)、多くのプラットフォームのデファクトスタンダードツールセットから削除されました。
Tripleee

2

使った

echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c" 

これは私にとってはうまくいきました...


1

私は通常、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.

.

1

私にとって最短の方法は

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でそれを呼び出して別のファイルを送信できることです...


中括弧はあまり役に立ちませんが、完全に移植可能にするためには、変数を二重引用符で囲む必要があります。stackoverflow.com/questions/10067266/…
tripleee

1

ソースマシンから

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

0

私の2セントを追加するために、私は自分のPHPスクリプトを記述します。

http://php.net/manual/en/function.mail.php

そのページの例には、添付を行う方法がたくさんあります。


2
すべてのサーバーにPHPがインストールされているとは限りません。「独自のスクリプトを書く」パスを本当に使いたい場合は、perlまたはpythonが通常はデフォルトで使用できるので、はるかに適しています。
exhuma 2014年

shさらにユビキタスです。良い例のある回答を含む重複した質問があります。ここにあります。
tripleee

0

mailx持っていない-a添付ファイルのために今オプションを選択します。


2
「-a」オプションはヘッダー用です
Yves Martin

男メール[x]は、10/9/10のバージョン12.5(数年前)はっきり-aファイルがmessage.`に与えられたファイルを添付言う
fche

4
mailxdoのいくつかのバージョン。2つの実装があると思います。1つ-aは添付ファイル用、もう1つはヘッダー用です。
exhuma 2014年

1
UbuntuのmailxのバージョンはGNUからのもので、-aはヘッダーを追加することを意味します。 manpages.ubuntu.com/manpages/lucid/en/man1/mailx.1.html どのシステムとどのmailxが添付ファイルを実行しますか?
nealmcb 2015年

3
新しい実装では、「-a」はヘッダー用、「-A」は添付ファイル用です
Avi Mehenwal

0

電子メールを送信する方法ではありませんが、オンラインGitサーバー(Bitbucketなどのサービス)を使用できます。

このように、git pushコマンドを使用することができ、すべてのバージョンは圧縮され整理された方法で保存されます。


0

これは、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

なぜあなたは定義しているWHOAMIHOSTNAME 二回?
デビッドC.ランキン

これには、いくつかのシェルコーディングスタイルの誤りがあります。shellcheck.netはそれらのすべてではなく一部を指摘します。
tripleee

0

ファイルがテキストの場合、次のように本文で送信するのが最も簡単です。

sendmail recipient@example.com < message.txt

1
これは添付ファイルとして、またはメッセージ本文としても送信しません。Sendmailは、入力が完全で整形式のRFC5322電子メールメッセージであることを想定しており、そうでない場合は興味深い方法で失敗する可能性があります。
tripleee

0

mailxコマンドの使用

 echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com

sendmailを使用する

#!/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 `;

1
sendmailは良い例です。ここで見つけてよかったです。
Honza P.

「あなたの本文」の先頭に空の行が必要であることに注意してください。そうしないと、本文がヘッダーに表示されなくなったり、メッセージが完全に壊れたりする可能性があります。またuuencode、MIMEの使用を避けることについては、他の場所のメモも参照してください。
Tripleee

そして、eval全体の仕掛けの周りの怪物や謎のバッククォートはここでは完全に不要です。
tripleee

0

Mailutilsはこれを簡単なものにします

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file ファイルを添付
  • -M MIMEを有効にするので、添付ファイルとプレーンテキストの本文を持つことができます。

まだインストールされていない場合は、実行します

sudo apt install mailutils

0

メールコマンドオプション(で確認man mail)と実行できるバージョンに応じて

echo yourBody|mail -s yoursubject -A /your/attachment/file john@doe.com


これは、新しいものを追加することなく、既存の答えを複製するようで、最も注目すべき-Aオプションは、GNUに固有のmailutilsバージョンのmail私の答えだけでなく、@ rumpelの中で指摘されたとして
tripleee

-1

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*
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.