273

私は毎晩実行するスクリプトを私のLinuxサーバー上で実行しています。mysqldump各MySQLデータベースを.sqlファイルにバックアップし、それらを圧縮された.tarファイルとしてまとめてパッケージ化します。私が達成したいと思う次のステップは安全のために電子メールを通して遠隔の電子メールサーバにそのtarファイルを送ることです。バックアップテキストファイルを以下の場所にパイプすることで、本文の生のスクリプトに電子メールを送信することができました。mailxそのようです:

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

catにコピーされたバックアップファイルのテキストをエコーします。mailx受取人のEメールアドレスを引数として渡したプログラム。

これは私が必要とすることを達成する一方で、私はそれが一歩上がるかもしれないと思う、シェルスクリプトなどを使用して、圧縮された.tarファイルを電子メールとして送信電子メールメッセージに送信する方法はありますか。愛着これは、ヘッダデータを含み、しばしば折り返しの問題などを含む非常に長いEメールメッセージを処理しなければならないことに勝るでしょう。


  • MySQLデータベースをバックアップするスクリプトを共有できますか? - Almino Melo
  • すみません、私は今しばらくこれをしていません。私はそれが呼び出しを含むことを知っていますmysqldumpそして、その出力を電子メールに添付します。mutt)出力をzip / tar.gzに圧縮するステップさえあったかもしれません... - Kit Roed
  • stackoverflow.com/questions/17359/… - Girdhar Singh Rathore
  • 好奇心旺盛です、なぜあなたのバックアップとscpやrsyncを電子メールで送ったのでしょうか。 - jchook

25 답변


284

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

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


  • 私と同じです - Muttの構文が変わったかもしれないように見えます.. - Nick
  • Mutt 1.5.21(2010-09-15)を使用していますが、受信者のメールアドレスの後に-aパラメータが必要です - nurettin
  • Mutt 1.5.20(2009-06-14)、魅力のように働く! - Kreker
  • openSUSE Leap 42.1でMutt 1.5.24(2015-08-30)を使っていました。 - Antonio Vinicius Menezes Medei
  • @fugitiveは「オプションの終わり」を意味します。を見てみましょうunix.stackexchange.com/questions/11376/… - rynop

78

あるいは、失敗したmutt:

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


  • これは、エンコードされていない部分を送信します列をなしてではなく愛着。多くのメールクライアントはこれを認識しています表示添付ファイルとしてエンコードされていない部分 - FuePi
  • この日と年齢ではuuencodeを使用しないでください。 MIMEはもう少し複雑ですが、はるかにユーザーフレンドリーです。 - tripleee
  • @トリプリー:それを行う方法の例は素晴らしいだろう... - David Given
  • @DavidGiven:たとえば、この質問に対する他のすべての回答を(一目で)参照してください。 - tripleee
  • どれもメールを使っていません! - David Given

40

見てからman mailxmailxプログラムにはファイルを添付するためのオプションがありません。あなたはmuttのような他のプログラムを使うことができます。

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

muttのコマンドラインオプションは次のように表示されます。mutt -h


  • ありがとうございます。それはトリックをしました、私は静かに行動を起こすためにつぶやくことができませんでした。 - Kit Roed
  • ビアバムもうまくいきます - njzk2
  • muttメールを送信するために、私のためにnanoエディタを開きます。 - Jonas
  • 下記の答えを参照してください(stackoverflow.com/a/9524359/10608なぜなら、構文がmuttのために変更されたようです。--。 - Alexander Bird

38

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 


  • 全然私のために働かない。 - Karel Bílek
  • @ KarelBí lek:他の選択肢はどうですか。 - Nathan Fellman
  • 私のマンページは読みます:-a, --append=HEADER: VALUE append given header to the message being sent - exhuma
  • ネイサン、ダビデからのあなたの引用は間違っているようです - 彼はmuttコマンドではなくmail。また他の人が指摘しているように、muttは今や--アドレスの前の引数。そして、@ exhumaと私は実際には-aオプションインmailします - 私はちょっとそこで混乱しました;) - nealmcb
  • -aの代わりに-Aを使用してください。-a, --append=HEADER: VALUE append given header to the message being sent -A, --attach=FILE attach FILE - Victor Perov

28

私はmpackを使います。

mpack -s subject file user@example.com

残念ながら、mpackは ' - 'を標準入力の別名として認識しません。しかし、次のように動作し、(シェル)エイリアスまたはスクリプトに簡単にラップできます。

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


  • これはstdinに対してbashでうまくいく可能性があります。私はmpackを持っていないので、試したことはありません。mpack -s subject /dev/stdin loser@example.com <(stdout_generating_program) - thomasa88

27

このシナリオ用に作成された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"の代わりにあなたの例では。 - Davit
  • はい、いいえ - ソース(caspian)は大文字のEを使いますが、これは(Unixの世界では)コマンドラインツールの一般的な命名方法ではありません。少なくともこのソフトウェアのUbuntuパッケージは両方を提供します。sendemailそしてsendEmail/usr/bin/。 - Fredrik Wendt
  • 私のXubuntu 14.04.3はインストールされていませんSendEmail - Vitaly Zdanevich
  • それをインストールしてください。 - tripleee
  • " sudo apt install sendemail" sendemailをインストールして" -f mandatory@email.com"コマンドが機能するための必須のfromフィールド。sendemail -f mandatory@email.com-t to@some.one -m "Here are your files!" -a file1.jpg file2.zip - Sailendra Pinupolu

22

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


  • これは受け入れられた答えであるはずです。デフォルトのmailxを使用して完璧に動作します。 cronを使用しているときにMutt v1.5.21が> 1MBの添付ファイルを送信することを拒否します。 - Joseph
  • 私はEC2で動作するものを探していました、そしてこれはうまくいきました。 - singularity
  • mailx正しく標準化されていません。それを推薦するどんな答えでもこの警告を指摘するべきです。一般的に使用される互換性のない少なくとも3つの亜種があります。 - tripleee

11

私はかつて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
}


  • GNU / Linuxでは、次のものを使うことができます。base64エンコードのためのperlの代わりのコマンド - MestreLion

10

あなたが使用することができますつぶやく添付ファイル付きの電子メールを送信する

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


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

9

平文の添付ファイルを含む平文の本文の電子メールをmailxで送信します。

(
  /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/elpdf-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のスパムフィルタはそれらを通過させるオプションを与えずに電子メールを吐き出すドメインをブラックリスト化できます。そして、あなたはこれがもはやうまくいかないか、または添付ファイルを通過させるだけであるか、またはEメールがまったく届かないことに気付くでしょう。あなたがこれについて多くのテストをしなければならないならば、何日もかけてそれらを広げなければスパマーと分類されるでしょう、そしてこの機能はもう働かないでしょう。


  • 私にとってはそれは逆のやり方で働いた。(echo 'Email Body'; uuencode filename filename) | mailx -s 'Subject' user@domain.com - Vicky
  • uuencodeですではない適切に添付ファイル。それは単に他のテキストの真ん中にテキストのコンピュータ可読ブロブを埋め込むだけです。これ以上のメカニズムがなかった場合は正常に機能していましたが、それは20年以上前のことです。 - tripleee

6

ここにいくつかの答えがありますmailまたはmailxそのため、これは文脈の中でこれらを解釈するのを助けるためのより多くの背景です。

歴史ノート

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

しかし、その立場を争っている人の一人は、もともと「Berkeley Mail」と呼ばれていましたMail2BSD(1978)では大文字のMを使っています。しかし3BSD(1979)では、小文字に置き換えられましたmail同様に命令して、いくつかの新しい混乱を引き起こします。 SVR3(1986)は次のように呼ばれる派生物を含んでいましたmailx。のxおそらくそれを独特かつ明確にするために加えられた。しかし、これもまた、コピーされ、再実装され、そして断片化されているので、決定的な単一のバージョンは存在しません。

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

MIME1990年代初頭に導入されたのは、英語のサブセットにしか適していない単一の文字セットのプレーンテキスト以外のさまざまな種類のコンテンツのサポートなど、電子メールに関するいくつかの問題を解決するためです。 。これにより、マルチパートメッセージ、国際化、リッチコンテンツタイプなどのサポートが導入され、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 Mailutilsを含むmail/mailx互換性ラッパーどっちするMIME添付ファイルの送信をサポート-A

これらの問題を考慮して、コードを移植可能にする必要があり、多少複雑なパッケージに依存する可能性がある場合、MIME添付ファイルを移植可能に送信する簡単な方法は次のとおりです。つかいますmutt



4

もう一つの選択肢 - 最悪(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


2

私が使った

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

そしてこれは私のためにうまくいきました....


1

mailxありますか-a添付ファイルのオプション


  • " -a"オプションはヘッダー用です - Yves Martin
  • man mail [x]、version 12.5 of 10/9/10(数年前)は明らかに-a fileと言います。与えられたファイルをメッセージに添付します。 - fche
  • 一部のバージョンmailx行う。 2つの実装があると思います。一つに-a添付ファイル用ですが、ヘッダー用です。 - exhuma
  • UbuntuのmailxのバージョンはGNUから来ていて、-aはヘッダを追加することを意味します。manpages.ubuntu.com/manpages/lucid/en/man1/mailx.1.htmlどのシステムとどのmailxが添付ファイルを作成しますか? - nealmcb
  • 新しい実装では "-a"です。ヘッダ用で、「 - A」です。添付ファイルです - Avi Mehenwal

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別のファイルを送信する


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


1

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 `;


  • sendmailがその良い例です。 - Honza P.

0

私の2セントを追加するために、私は私自身のPHPスクリプトを書くと思います:

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

そのページの例で添付ファイルを作成する方法はたくさんあります。


  • すべてのサーバーにPHPがインストールされているとは限りません。あなたが本当に「自分のスクリプトを書く」に行きたいのなら、 path、次にperlまたはpythonがデフォルトで利用可能なのではるかに適しています。 - exhuma
  • shもっと遍在的です。良い例がある答えと重複した質問があります。これが私のものです。 - tripleee

0

電子メールを送信する方法ではありませんが、そのためにはオンラインのGitサーバー(例:Bitbucketまたは類似のサービス)を使用できます。

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


0

これが私がCentOSの一つの大きなログファイルを使ってやっている方法です:

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


  • なぜあなたは定義していますかWHOAMIそしてHOSTNAME 二度? - David C. Rankin
  • 指摘していただきありがとうございます。これはコピー/貼り付け間違いです - dagorv
  • これにはシェルコーディングスタイルの誤りがいくつかあります。shellcheck.netそれらのいくつかを指摘しますが、すべてではありません。 - tripleee

0

ファイルがテキストの場合は、本文で最も簡単に送信できます。

sendmail recipient@example.com < message.txt


  • これは添付ファイルとしても、メッセージ本文としても送信しません。 Sendmailは、その入力が完全で整形式のRFC5322メールメッセージであることを期待しており、それが正しくないと面白い方法で失敗するかもしれません。 - tripleee

-1

もう一つのことmutt:デフォルトでは "From:"フィールドにあなたのアドレスと名前を使います。 それがあなたが必要とするものではないならば、あなたはこのようなストリングを含む代替のmuttrcファイルを作成することができます:     from = "私のメールデーモン"

このファイルを使って-Fコマンドラインオプション


-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*

リンクされた質問


関連する質問

最近の質問