我创建了一个脚本,该脚本每天晚上在Linux服务器上运行,该脚本使用mysqldump将每个MySQL数据库备份到.sql文件并将它们打包为压缩的.tar文件。我要完成的下一步是通过电子邮件将该tar文件发送到远程电子邮件服务器以进行保管。通过将备份文本文件传输到mailx,我已经能够在正文中向电子邮件发送原始脚本,如下所示:
1
| $ cat mysqldbbackup.sql | mailx backup@email.com |
cat会回显备份文件的文本,该文本通过管道传输到mailx程序,将接收者的电子邮件地址作为参数传递。
虽然这完成了我所需要的,但我认为它可能会更好,是否可以使用shell脚本或其他方式发送压缩的.tar文件作为附件发送到外发电子邮件中?这样就不必处理非常长的电子邮件,其中包含标头数据并且经常出现换行问题等。
一个笨蛋都没有为我工作。它以为电子邮件地址是附件的一部分。不得不做:
1
| echo"This is the message body" | mutt -a"/path/to/file.to.attach" -s"subject of message" -- recipient@domain.com |
或者,失败的mutt:
1
| gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s"MySQL DB" backup@email.com |
根据您的linux版本,它可能称为mail。要在上面引用@David:
1
| mail -s"Backup" -a mysqldbbackup.sql backup@email.com < message.txt |
,或者:
1
| cat message.txt | mail -s"Backup" -a mysqldbbackup.sql backup@email.com |
从man mailx来看,mailx程序没有附加文件的选项。您可以使用其他程序,例如mutt。
1
| echo"This is the message body" | mutt -a file.to.attach -s"subject of message" recipient@domain.com |
mutt的命令行选项可以用mutt -h显示。
我使用为这种情况创建的SendEmail。它是为Ubuntu打包的,因此我认为它可用
sendemail -f sender@some.where -t receiver@some.place -m"Here are your files!" -a file1.webp file2.zip
http://caspian.dotconf.net/menu/Software/SendEmail/
我使用mpack。
1
| mpack -s subject file user@example.com |
不幸的是,mpack无法将\\'-\\'识别为stdin的别名。但是下面的工作,可以很容易地用(shell)别名或脚本包装:
1
| mpack -s subject /dev/stdin loser@example.com < file |
1
| echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com |
我曾经在Solaris上为ksh编写了此函数(使用Perl进行base64编码):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| # 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
} |
您可以使用mutt发送带有附件的电子邮件
1
| mutt -s"Backup" -a mysqldbbackup.sql backup@email.com < message.txt |
发送带有一个带有mailx的纯文本附件的纯文本正文电子邮件:
1 2 3 4
| (
/usr/bin/uuencode attachfile.txt myattachedfilename.txt;
/usr/bin/echo"Body of text"
) | mailx -s 'Subject' youremail@gmail.com |
以下与上面的命令相同,没有换行符
1
| ( /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内容:
1 2 3 4 5 6
| <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上,发送带有PDF附件并带有sendmail的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中放置以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| #!/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文档,并将其放入名为pdf-test.pdf
的/home/el中,制作一个名为/home/el/email_body.htm的文件,并将其放在ne:
1
| <html><body>this is some bold text</body></html> |
确保pdf文件具有足够的755权限。
运行脚本./test.sh
检查您的电子邮件收件箱,文本应为HTML格式的文件,而pdf文件会自动解释为二进制文件。注意,即使您将电子邮件发送给自己,一天也不能超过15次使用此功能,但是gmail中的垃圾邮件过滤器会在一个域中将产生电子邮件的邮件列入黑名单,而没有让您选择允许它们通过的功能。而且您会发现它不再起作用,或者它只能通过附件,或者电子邮件根本无法通过。如果您必须对此进行大量测试,请将其分散几天,否则您将被标记为垃圾邮件发送者,此功能将不再起作用。
这里有几个答案建议使用mail或mailx,因此,更多的背景知识可帮助您在上下文中解释这些内容。
历史记录
Unix mail的起源可追溯到贝尔实验室Unix早期历史的迷雾
另一种选择-Swaks(瑞士军刀用于SMTP)。
1 2 3 4 5 6 7 8 9 10 11
| 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 |
元邮件具有metasend
1
| metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b |
工具
我使用了
1
| echo"Start of Body" && uuencode log.cfg readme.txt | mail -s"subject""a@b.c" |
,这对我来说效果很好....
对我而言,最快捷的方法是
1
| file=filename_or_filepath;uuencode $file $file|mail -s"optional subject" email_address |
,因此在您的示例中,它将是
1
| file=your_sql.log;gzip -c $file;uuencode ${file}.gz ${file}|mail -s"file with magnets" ph.gachoud@gmail.com |
文件...
我通常只在RHEL上使用mail命令。我已经尝试过mailx,它非常有效。
1 2 3 4 5 6
| mailx -s"Sending Files" -a First_LocalConfig.conf -a
Second_LocalConfig.conf Recipient@myemail.com
This is the content of my msg.
. |
从源计算机
1
| mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com |
在目标计算机上。将收到的邮件正文另存为db.sql.gz.b64;然后..
1
| base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf |
Mailutils可以轻松做到这一点
1
| echo"Body" | mail.mailutils -M -s"My Subject" -A attachment.pdf mail@example.org |
- -A file附加文件
- -M启用MIME,以便您可以具有附件和纯文本主体。
如果尚未安装,请运行
1
| sudo apt install mailutils |
只需加上2美分,我就可以编写自己的PHP脚本:
http://php.net/manual/en/function.mail.php
有该页面上的示例中有很多方法来进行附件。
不是一种发送电子邮件的方法,但是您可以为此使用在线Git服务器(例如Bitbucket或类似服务)。
这样,您可以使用git push命令,所有版本都可以以压缩和有组织的方式存储。
根据您的邮件命令选项(使用man mail进行检查)和版本,您可以执行
echo yourBody|mail -s yoursubject -A /your/attachment/file john@doe.com
这是我在CentOS中处理一个大日志文件的方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| 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 |
如果文件是文本,则可以通过以下方式在体内最简单地发送它:
1
| sendmail recipient@example.com < message.txt |
使用mailx命令
1
| echo"Message Body Here" | mailx -s"Subject Here" -a file_name user@example.com |
使用sendmail
1 2 3 4 5 6 7 8 9 10 11
| #!/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 `; |
mailx现在确实具有用于附件的-a选项。
如果mutt无法正常工作或未安装,请尝试以下操作-
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| *#!/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* |