如何使用Linux命令行将文件作为电子邮件附件发送?
我创建了一个每晚在Linux服务器上运行的脚本,它使用如何使用Linux命令行将文件作为电子邮件附件发送?,linux,email,command-line,Linux,Email,Command Line,我创建了一个每晚在Linux服务器上运行的脚本,它使用mysqldump将我的每个MySQL数据库备份到.sql文件,并将它们打包为一个压缩的.tar文件。我想完成的下一步是通过电子邮件将tar文件发送到远程电子邮件服务器进行安全保管。我已经能够通过管道将备份文本文件发送到mailx来发送正文中的原始脚本,如下所示: $ cat mysqldbbackup.sql | mailx backup@email.com cat回显备份文件的文本,该文本通过管道传输到mailx程序,并将收件人的电子邮
mysqldump
将我的每个MySQL数据库备份到.sql文件,并将它们打包为一个压缩的.tar文件。我想完成的下一步是通过电子邮件将tar文件发送到远程电子邮件服务器进行安全保管。我已经能够通过管道将备份文本文件发送到mailx
来发送正文中的原始脚本,如下所示:
$ cat mysqldbbackup.sql | mailx backup@email.com
cat
回显备份文件的文本,该文本通过管道传输到mailx
程序,并将收件人的电子邮件地址作为参数传递
虽然这满足了我的需要,但我认为这可能会更好一步,是否有任何方法,使用shell脚本或其他方式,要将压缩后的.tar文件作为附件发送到发送的电子邮件中?这将比必须处理包含标题数据且经常有文字包装问题等的很长电子邮件要好得多。从查看
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
显示,您可以使用它发送带有附件的电子邮件
mutt -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
mutt-s“备份”-一个mysqldbbackup.sqlbackup@email.com
根据您的linux版本,它可能被称为邮件。上面引用@David的话:
mail -s "Backup" -a mysqldbbackup.sql backup@email.com < message.txt
或者,失败的mutt:
gzip -c mysqldbbackup.sql | uuencode mysqldbbackup.sql.gz | mail -s "MySQL DB" backup@email.com
metamail具有metasend工具
metasend -f mysqlbackup.sql.gz -t backup@email.com -s Backup -m application/x-gzip -b
我用mpack
mpack -s subject file user@example.com
不幸的是,mpack不将“-”识别为stdin的别名。但是,下面的工作可以完成,并且可以轻松地包装在(shell)别名或脚本中:
mpack -s subject /dev/stdin loser@example.com < file
mpack-s主题/dev/stdinloser@example.com<文件
我曾经在Solaris上为ksh编写过此函数(使用Perl进行base64编码):
#用法:电子邮件_附件至cc主题正文附件_文件名
电邮(附件){
至=“$1”
cc=“$2”
主题=“3美元”
body=“$4”
filename=“${5:-''}”
boundary=“\u====\ uBlah\u===\ u$(日期+%Y%m%d%H%m%S)\u===\ u
{
打印--“到:$To”
打印--“抄送:$Cc”
打印--“主题:$Subject”
打印--“内容类型:多部分/混合;边界=\”$boundary“
打印--“Mime版本:1.0”
打印--“
打印--“这是MIME格式的多部分邮件。”
打印--“
打印--“--$boundary”
打印--“内容类型:文本/普通;字符集=ISO-8859-1”
打印--“
打印--“$body”
打印--“
如果[[-n“$filename”&&&f“$filename”&&r“$filename”];则
打印--“--$boundary”
打印--“内容传输编码:base64”
打印--“内容类型:应用程序/八位字节流;名称=$filename”
打印--“内容处置:附件;文件名=$filename”
打印--“
打印--“$(perl-MMIME::Base64-e'open F,shift;@lines=;close F;打印MIME::Base64::encode(join(q{},@lines))”'$filename)”
打印--“
fi
打印--“${boundary}--”
}|/usr/lib/sendmail-oi-t
}
没有一只小狗为我工作。它认为电子邮件地址是附件的一部分。我们必须做:
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- recipient@domain.com
加上我的2美分,我将编写自己的PHP脚本: 在该页面的示例中,有很多方法可以制作附件。使用mailx发送带有一个纯文本附件的纯文本正文电子邮件: 下面是与上面相同的命令,没有换行符
( /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>
更改test.sh顶部的导出变量以反映您的地址和文件名
下载测试pdf文档并将其放入名为pdf-test.pdf的/home/el
制作一个名为/home/el/email_body.htm的文件,并将此行放入其中:
<html><body><b>this is some bold text</b></body></html>
这是一些粗体文本
确保pdf文件具有足够的755权限
运行脚本/test.sh
检查您的电子邮件收件箱,文本应为HTML格式,pdf文件自动解释为二进制文件。注意不要在一天内使用此功能超过15次,即使你将电子邮件发送给自己,gmail中的垃圾邮件过滤器也可以将一个域名中的大量电子邮件列入黑名单,而不会让你选择让它们通过。你会发现这不再有效,或者它只允许通过附件,或者电子邮件根本无法通过。如果您必须对此进行大量测试,请将它们分散几天,否则您将被标记为垃圾邮件发送者,此功能将不再起作用。我使用SendEmail,它是为此场景创建的。它是为Ubuntu打包的,所以我认为它是可用的
sendmail-fsender@some.where-treceiver@some.place-m“这是您的文件!”-a file1.jpg file2.zip
mailx
现在有一个用于附件的-a
选项。不是发送电子邮件的方法,但您可以使用在线Git服务器(例如Bitbucket或类似服务)来发送电子邮件
这样,您可以使用git push命令,所有版本都将以压缩和组织的方式存储。我通常只在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.
.
对我来说最短的路是
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
好的方面是,我可以回忆它与发送另一个文件 我用过
echo 'These are contents of my mail' | mailx -s 'This is my email subject' -a /path/to/attachment_file.log email_id@example.com
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
这对我来说很有效……这就是我在CentOS中处理一个大日志文件的方式:
#!/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
源计算机
在目标计算机上。将收到的邮件正文另存为db.sql.gz.b64;然后
如果文件为文本,则可以通过以下方式在正文中发送:
sendmail recipient@example.com < message.txt
sendmailrecipient@example.com
如果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*
*#/垃圾箱/垃圾箱
文件路径=$1
文件名=$2
echo "Start of Body" && uuencode log.cfg readme.txt | mail -s "subject" "a@b.c"
#!/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
mysqldump --defaults-extra-file=sql.cnf database | gzip | base64 | mail me@myemail.com
base64 -D -i db.sql.gz.b64 | gzip -d | mysql --defaults-extra-file=sql.cnf
sendmail recipient@example.com < message.txt
*#!/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*
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
echo "Message Body Here" | mailx -s "Subject Here" -a file_name user@example.com
#!/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 `;
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
echo "Body" | mail.mailutils -M -s "My Subject" -A attachment.pdf mail@example.org
sudo apt install mailutils