299

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

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

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

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

4

25 に答える 25

304

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

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
于 2012-03-01T21:26:21.907 に答える
79

または、失敗した mutt:

gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz  | mail -s "MySQL DB" backup@email.com
于 2008-08-20T04:48:25.263 に答える
48

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 
于 2008-08-20T03:36:24.250 に答える
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

于 2008-08-20T03:05:57.147 に答える
29

私はmpackを使用しています。

mpack -s subject file user@example.com

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

mpack -s subject /dev/stdin loser@example.com < file
于 2009-09-24T07:00:08.187 に答える
14

私はかつて、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
}
于 2011-02-03T14:48:42.590 に答える
13

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

mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
于 2008-08-20T03:09:39.137 に答える
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 を使用して、HTML 本文に PDF が添付された電子メールを送信します。

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

于 2013-01-08T11:25:24.827 に答える
2

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

metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
于 2008-09-17T15:18:03.737 に答える
1

使った

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

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

于 2015-08-04T15:17:06.173 に答える
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
于 2017-01-22T13:23:24.930 に答える
0

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

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

于 2014-06-29T19:05:14.420 に答える
0

2セントを追加するだけで、独自のPHPスクリプトを作成します。

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

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

于 2012-09-24T18:34:06.337 に答える
0

これは、CentOS で 1 つの大きなログ ファイルを処理する方法です。

#!/bin/sh
MAIL_CMD="$(which mail)"
WHOAMI="$(whoami)"
HOSTNAME="$(hostname)"
EMAIL"your@email.address"
LOGDIR="/var/log/aide"
LOGNAME="$(basename "$0")_$(date "+%Y%m%d_%H%M")"

if cd ${LOGDIR}; then
  /bin/tar -zcvf "${LOGDIR}/${LOGNAME}".tgz "${LOGDIR}/${LOGNAME}.log" > /dev/null 2>&1
  if [ -n "${MAIL_CMD}" ]; then
  # This works too. The message content will be taken from text file below
  # echo 'Hello!' >/root/scripts/audit_check.sh.txt
  # echo "Attachment" | ${MAIL_CMD} -s "${HOSTNAME} Aide report" -q /root/scripts/audit_check.sh.txt -a ${LOGNAME}.tgz -S from=${WHOAMI}@${HOSTNAME} ${EMAIL}
    echo "Attachment" | ${MAIL_CMD} -s "${HOSTNAME} Aide report" -a "${LOGNAME}.tgz" -S from="${WHOAMI}@${HOSTNAME}" "${EMAIL}"
    /bin/rm "${LOGDIR}/${LOGNAME}.log"
  fi
fi
于 2015-09-04T13:31:29.950 に答える
0

mailx-a添付ファイルのオプションが追加されました。

于 2013-12-28T18:36:56.407 に答える