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

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

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

cat将备份文件的文本与传入收件人的电子邮件地址作为参数的mailx程序相呼应。

虽然这完成了我所需要的,但我认为这可能会更好一些, 有没有办法使用shell脚本或其他方式将压缩的.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。

 mpack -s subject file user@example.com 

不幸的是,mpack不能识别“ – ”作为标准input的别名。 但是下面的工作,可以很容易地包装在一个(shell)别名或脚本中:

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

我使用为此场景创build的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/

  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发送带有附件的电子邮件

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

我曾经在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 } 

用一个纯文本附件发送一个明文本体电子邮件与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

确保你已经安装和configuration了sendmail。

确保你已经安装了uuencode并可用: https : //unix.stackexchange.com/questions/16277/how-do-i-get-uuencode-to-work

创build一个名为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顶部的导出variables以反映您的地址和文件名。

下载一个testingpdf文件,并把它放在/home/el名为pdf-test.pdf

创build一个名为/home/el/email_body.htm的文件,并在其中放置以下行:

 <html><body><b>this is some bold text</b></body></html> 

确保PDF文件有足够的755权限。

运行脚本./test.sh

检查您的电子邮件收件箱,文本应该是HTML格式,PDF文件自动解释为二进制文件。 小心不要使用这个function,即使你把电子邮件发送给你自己,Gmail中的垃圾邮件filter也可以将一个域名邮件列入黑名单而不会给你一个让他们通过的选项。 而且你会发现这不再起作用,或者它只能通过附件,或者电子邮件根本就没有通过。 如果您必须对此进行大量testing,请将其分散出去,否则您将被标记为垃圾邮件发送者,此function将不再起作用。

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@bc" 

这对我来说效果不错

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

我通常只在RHEL上使用邮件命令。 我已经试过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来调用它来发送另一个文件…

如果文件是文本,则可以在主体中将其发送为:

 sendmail recipient@example.com < message.txt 

另一个select – 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美分,我会写我自己的PHP脚本:

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

在这个页面的例子中有很多方法可以做附件。

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

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

这就是我在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 

来自源机器

 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 

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

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

还有一件事是关于mutt :默认情况下,它会在“From:”字段中使用您的地址和名称。 如果不是你所需要的,你可以创build一个包含如下string的替代muttrc文件:set from =“My mail daemon”

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