Linux自动发送HTML格式并带附件的邮件(转)

1 篇文章 0 订阅

Linux自动下发送HTML格式并带附件的邮件

遇到问题:

统计报表实现基本思想,按处理流程顺序
1) 利用scp下载远程线上机器的Log日志文件  
2) 利用awk,sed,sort等Linux下命令过滤并且分析日志,生成基本的模板(template)文本。
3) 根据该模板(template)文本统计信息生成HTML格式的邮件正文。
4) 根据该模板(template)文本统计信息生成CVS、TXT、XLS格式的统计信息作为邮件附件。
5) 利用sendmail或者mutt命令发送邮件。
6) 利用crontab计划任务定时发送日报、周报、月报。
 
问题就出现在步骤5)。开始我尝试利用 mutt来实现发送HTML格式正文邮件并且附带附件:
 
mutt -e "my_hdr content-type:text/html" -s "邮件标题" -a 附件.xls receiver@123.com < mail.html
 
用outlook做客户端接收邮件,发现附件丢失了,变成了正文里的乱码,如果不加-e "my_hdr content-type:text/html"参数,附件成功又不能显示HTML格式邮件,期间google了各种mutt相关问题官方FAQ都无从知晓为什么,现在看来既有可能是mutt版本没有升级到1.5的一个bug,但自己不是admin也没法装最新版本的mutt,最终选择放弃使用mutt。
 

解决方法:

 
编写以下两个函数,其中sendmail()函数配好参数,就可以直接调用了。这样就可以发送带多媒体附件的HTML格式正文的邮件了。在此感谢@lingbing同学的帮助。
#发送多媒体附件的HTML格式正文的函数 (多媒体附件指非txt或者cvs格式的文件,例如excel的xls)
#$1: mail_from
#$2: mail_to 
#$3: subject 
#$4: content mimetype, such as "text/plain"
#$5: content 
#$6: attach mimetype, such as "text/csv"
#$7: attach display name
#$8: attach file path
function SendMailMultiMediaAttach(){
    local MSG_FILE="/tmp/mail.tmp"
 
    echo "From: $1" > $MSG_FILE
    echo "To: $2" >> $MSG_FILE
    echo "Subject: $3" >> $MSG_FILE
    echo "Mime-Version: 1.0" >> $MSG_FILE
    echo 'Content-Type: multipart/mixed; boundary="GvXjxJ+pjyke8COw"' >> $MSG_FILE
    echo "Content-Disposition: inline" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
    echo "Content-Type: $4" >> $MSG_FILE
    echo "Content-Disposition: inline" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "$5" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
    echo "Content-Type: $6" >> $MSG_FILE
	echo "Content-Transfer-Encoding: base64" >> $MSG_FILE
    echo "Content-Disposition: attachement; filename=$7" >> $MSG_FILE
    echo "" >> $MSG_FILE
    echo "" >> $MSG_FILE
    ${BIN_PATH}/base64 -e $8 >> $MSG_FILE
 
    cat $MSG_FILE | /usr/lib/sendmail -t
}
 
##! @TODO: 发送邮件
##! @AUTHOR: zhangxu
##! @VERSION: 1.0
##! @IN: 
##! @OUT: 
function sendMail()
{
	echo "Sending $Subject mail from $From to $To"
 
	from="from@123.com"
	to="receiver@123.com"
	subject="${Subject}"
	content_type="text/html"
	body=`cat $MAIL_HTML`
	attach_type="application/vnd.ms-excel"
	attach_name="${file_title}.xls"
	attach_path="${TEMP_DIR}/${file_title}.xls"
	SendMailMultiMediaAttach "$from" "$to" "$subject" "$content_type" "$body" "$attach_type" "$attach_name" "$attach_path"
 
	echo "Send mail done."
}
 
要注意以下几点:
1) 多媒体文件对应的格式可以从下面的链接参考,用于替换参数$6的mimetype。 http://www.w3schools.com/media/media_mimeref.asp
2) 如何判断自己的附件是不是纯文本的呢?Windows下如果可以用notepad记事本打开,或者Linux下可以用cat显示正常的都是可以用text/plain的MIME TYPE的,其他的一律需要用1)中提到的对应的编码格式,还要保证又base64编码再发送出去,邮件客户端或者接受者可以base64解码还原。这就是之所以Content-Transfer-Encoding: base64用 base64并且要用base64 -e <文件名>编码的原因,base64命令可以Google下并下载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在Linux自动发送电子邮件,您可以使用命令行工具如sendmail或mutt。以下是使用sendmail发送电子邮件的步骤: 1. 安装sendmail:在终端中输入sudo apt-get install sendmail命令来安装sendmail。 2. 创建邮件正文:使用文本编辑器创建一个包含电子邮件正文的文本文件。 3. 创建邮件头:使用文本编辑器创建一个包含电子邮件头信息的文本文件。邮件头应包括收件人地址,发件人地址,主题等。 4. 发送电子邮件:在终端中使用sendmail命令发送电子邮件。例如,sendmail -t < email.txt命令将发送email.txt文件中的电子邮件。 请注意,sendmail需要正确配置才能正常工作。如果您遇到任何问题,请参考sendmail文档或寻求帮助。 ### 回答2: 在Linux系统中,我们可以使用邮件客户端发送电子邮件。然而,当我们需要自动发送邮件时,我们需要使用脚本,而脚本编写使用的语言可能是Python、Perl、Bash或其他编程语言。 在下面的例子中,我们使用Bash编写了一个自动发送邮件的脚本,该脚本会检查系统日志文件中的错误,并自动发送错误报告给系统管理员。 #!/bin/bash # 设置邮件的配置参数 to="sysadmin@example.com" subject="系统日志错误报告" body="以下是最近24小时内的系统日志错误:\n $(grep error /var/log/syslog)" # 使用sendmail命令发送邮件 echo -e "$body" | sendmail -t $to -s $subject 上述脚本首先设置了邮件的配置参数,包括收件人地址、邮件主题和邮件正文内容。在正文内容中,使用grep命令筛选出最近24小时内日志中的错误信息,并将其作为邮件正文的一部分。 接着,该脚本使用echo命令将邮件正文输出到管道中,并使用sendmail命令发送邮件。sendmail命令的选项-t表示收件人地址由邮件头中的To字段提供,-s表示邮件主题由邮件头中的Subject字段提供。 为了使脚本能够自动发送邮件,我们需要使用定时任务工具,如Cron。在Cron中,我们可以设置该脚本每天运行一次,并让系统管理员定期查看遇到的错误。下面是设置自动运行脚本的Cron表达式: 0 0 * * * /path/to/script.sh 上述Cron表达式表示:脚本将在每天午夜12点自动运行。你可以使用其他时间间隔来自动运行脚本。 总之,在Linux系统中,我们可以使用邮件客户端发送电子邮件。当我们需要自动发送邮件时,我们需要使用脚本,并使用定时任务工具,如Cron,定期运行该脚本。通过这种方式,我们可以轻松地实现自动发送邮件,并帮助系统管理员及时发现和解决问题。 ### 回答3: Linux自动发送邮件Linux很普遍的一种应用,它可以帮助我们在服务器的日常运维管理中快速的对系统进行监控、告警等操作。下面是详细的操作步骤。 1. 安装邮件发送程序-“sendmail” 在Linux系统上发送邮件需要有“sendmail”这个程序的支持,因此我们需要在服务器上安装安sendmail程序。命令如下: sudo apt-get install sendmail 2. 配置邮件发送程序 安装完成sendmail程序后,需要设置邮件发送的配置信息,也即是将我们的邮件发送到哪里。这里我们配置为将邮件发送到本地的一个邮箱(例如penny@163.com)。在命令行中将sendmail.mc文件复制到sendmail.mc.original文件: sudo cp /etc/mail/sendmail.mc /etc/mail/sendmail.mc.original 然后编辑sendmail.mc文件,找到以下这行: dnl define(`SMTP_MAIL_HOST', `smtp.sendmail.org')dnl 将其替换为: define(`SMART_HOST', `smtp.163.com')dnl define(`RELAY_MAILER', `esmtp')dnl define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl define(`MASQUERADE_AS', `163.com')dnl 保存即可。 3. 生成新的文件并重启sendmail程序 我们需要重新生成一个sendmail.cf文件,以便使修改生效。命令如下: sudo m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf 然后重启sendmail服务,以生效配置信息。 sudo systemctl restart sendmail 4. 编写shell脚本,定制邮件发送程序 接下来,我们需要编写一个shell脚本,完成邮件发送的功能。下面是一个简单的例子: #!/bin/bash while true do echo "Your message" | mail -s "Subject" penny@163.com sleep 1800 # 30分钟发送一次 done 在新的一行输入以上代码,修改“Your message”为你要发送邮件内容,“Subject”为邮件的主题。 保存shell脚本到一个目录中,例如/home/penny/myscript.sh,运行以下命令,将该脚本授权为可执行权限: sudo chmod +x /home/penny/myscript.sh 接下来,我们可以使用crontab来定时执行该脚本,将发送邮件定期发送给指定邮箱。 5. 设置执行计划 使用crontab来配置shell脚本的执行计划,即定时发送邮件。运行以下命令打开crontab的编辑模式: sudo crontab -e 在编辑模式中,我们可以按照以下格式设置命令执行时间: * * * * * command 其中,*表示所有数据,也即是每一分钟都执行一次脚本,command为要执行的命令。 在这里,我们可以设置定时发送邮件的时间,比如每天的7:30执行,我们可以使用以下命令: 30 7 * * * /home/penny/myscript.sh 保存该crontab的配置信息,关闭编辑模式,这个时候,我们的脚本定时发送邮件所有设置完成了。 总之,Linux自动发送邮件可以帮助我们日常管理服务器的操作更加高效和方便,通过以上几个步骤就可以完成该功能的创建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值