如何使用Linux命令行将文件作为电子邮件附件发送?

时间:2008-08-20 02:48:50

标签: linux email command-line

我创建了一个脚本,每天晚上在我的Linux服务器上运行,使用mysqldump将我的每个MySQL数据库备份到.sql文件,并将它们打包为一个压缩的.tar文件。我想要完成的下一步是通过电子邮件将该tar文件发送到远程电子邮件服务器以便妥善保管。我已经能够通过将备份文本文件传送到mailx来发送电子邮件中的原始脚本,如下所示:

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

cat回显备份文件的文本,该文本通过管道传输到mailx程序,并以收件人的电子邮件地址作为参数传递。

虽然这可以完成我的需要,但我认为它可能更好一步,有没有办法,使用shell脚本或其他方式将压缩的.tar文件作为发送到外发电子邮件消息附件这将不得不处理包含标题数据的非常长的电子邮件,并且通常会出现自动换行等问题。

26 个答案:

答案 0 :(得分:287)

这些笨蛋都不适合我。它认为电子邮件地址是attachemnt的一部分。不得不这样做:

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

答案 1 :(得分:78)

或者,失败的mutt:

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

答案 2 :(得分: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

答案 3 :(得分:40)

根据您的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 

答案 4 :(得分:28)

我使用mpack。

mpack -s subject file user@example.com

不幸的是,mpack不会将' - '识别为stdin的别名。但是以下工作,可以很容易地包装在(shell)别名或脚本中:

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

答案 5 :(得分: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/

答案 6 :(得分: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

答案 7 :(得分:12)

您可以使用mutt发送带附件的电子邮件

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

答案 8 :(得分:11)

我曾在Solaris上为ksh写过这个函数(使用Perl进行base64编码):

# 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
}

答案 9 :(得分: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/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文件自动解释为二进制文件。小心不要在一天内使用此功能超过15次,即使您向自己发送电子邮件,gmail中的垃圾邮件过滤器也可以将滥用电子邮件的域名列入黑名单,而不会让您选择让他们通过。并且你会发现它不再有效,或者它只能通过附件,或者电子邮件根本没有通过。如果您必须对此进行大量测试,请将它们分散几天,否则您将被标记为垃圾邮件发送者,此功能将无法再使用。

答案 10 :(得分:6)

此处有几个答案提示mailmailx,因此这更像是帮助您在上下文中解释这些内容的背景。

历史记录

Unix mail的起源可以追溯到贝尔实验室Unix™(1969年)早期历史的迷雾中,我们可能不希望在这里进入其完整的家谱。可以说有许多程序从mail继承代码或重新实现(或继承重新实现的代码),并且没有单一的代码库可以明确地标识为“{”{{1} }。

然而,该位置的竞争者之一肯定是“伯克利邮件”,最初称为mail,在2BSD中具有大写M(1978);但是在3BSD(1979)中,它也取代了小写的Mail命令,导致了一些新的混乱。 SVR3(1986)包括一个名为mail的衍生物。可能会添加mailx以使其独特且独特;但是,这也已被复制,重新实现和删除,因此没有单一的个人版本是明确的。

当天,在电子邮件中发送二进制文件的事实上的标准是uuencode。它仍然存在,但有许多可用性问题;如果可能的话,你应该发送MIME附件,除非你特别努力能够与20世纪80年代后期进行沟通。

MIME是在20世纪90年代初引入的,用于解决电子邮件的几个问题,包括支持单个字符集中除纯文本以外的各种类型的内容,这些内容仅适用于英语的一个子集(并且,我们被告知,夏威夷人)。这引入了对多部分消息,国际化,丰富内容类型等的支持,并在整个20世纪90年代迅速获得了关注。

Heirloom mail/mailx history notes在撰写本文时最有帮助,如果您涉及到这类内容,当然值得一读。)

当前产品

截至2018年,Debian有三个包,包括xmail命令。 (您可以搜索mailx。)

Provides: mailx

(我不是单独推荐Debian作为推荐;它是我使用的,所以我对它很熟悉;它提供了一种通过引用各自的包名来明确区分各种替代方法的方法。显然也是Ubuntu从中获取这些包的发行版。)

  • 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 是一个相对简单的bsd-mailx似乎支持发送MIME附件。请参阅其manual page并注意,默认情况下,这是您期望在* BSD系统上找到的,包括MacOS。
  • mailx现在被称为heirloom-mailx 支持使用s-nail发送MIME附件。请参阅其manual page,更常见的是Heirloom project
  • -a又名GNU Mailutils包含mail/mailx compatibility wrapper 支持使用mailutils发送MIME附件

考虑到这些问题,如果您需要可移植代码并且可能依赖于某种复杂的程序包,则可移植地发送MIME附件的简单方法是使用-A

答案 11 :(得分: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

答案 12 :(得分:2)

metamail有工具metasend

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

答案 13 :(得分:2)

我用过

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

这对我有用....

答案 14 :(得分:1)

mailx现在有附件的-a选项。

答案 15 :(得分: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.

.

答案 16 :(得分: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来回忆它以发送另一个文件......

答案 17 :(得分: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 `;

答案 18 :(得分: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

答案 19 :(得分:0)

根据您的邮件命令选项(使用man mail进行检查)和可以使用的版本

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

答案 20 :(得分:0)

Mailutils使这成为小菜一碟

echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
  • -A file附加文件
  • -M启用MIME,以便您可以具有附件和纯文本正文。

如果尚未安装,请运行

sudo apt install mailutils

答案 21 :(得分: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

答案 22 :(得分:0)

不是发送电子邮件的方法,但您可以使用在线Git服务器(例如Bitbucket或类似服务)。

这样,您可以使用git push命令,所有版本将以压缩和有组织的方式存储。

答案 23 :(得分:0)

加上我的2美分,我会编写自己的PHP脚本:

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

在该页面的示例中,有很多方法可以进行附件。

答案 24 :(得分:-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*

答案 25 :(得分:-1)

关于mutt的另一件事:默认情况下,它会在“发件人:”字段中使用您的地址和名称。 如果它不是您需要的,您可以创建包含如下字符串的备用muttrc文件:     设置自=“我的邮件守护程序”

将此文件与-F命令行选项一起使用。