首页 > 技术文章 > 使用mutt定时发送html格式的邮件

OverloadBachPunk 2021-03-03 18:43 原文

https://www.cnblogs.com/OverloadBachPunk/p/14472611.html中制作了一个基于mutt和python爬虫的每日要闻与天气自动发送脚本。不过这个脚本只发送新闻标题,如果能发送时附带上超链接,效果就更好了。

html格式的邮件写入

def write_email():
    today = datetime.datetime.today()
    #with open('today_info'+' '+today.strftime('%Y-%m-%d')+'.txt', 'a') as f:
    weather_list = get_weather()
    wbtop_list_url, wbtop_list  = get_weibotop10()
    hptop_list_url, hptop_list = get_huputop10()
    ezutop_list_url, ezutop_list = get_ezutop10()
    bdtop_list_url, bdtop_list = get_baidutop10()
    mail_msg = ''
    mail_msg+=('<div>今天是%d年%d月%d日,下面是今天的天气与各平台热点。</div>' %(today.year, today.month, today.day))
    mail_msg+=("<div><br></div>")

    mail_msg+=("<div>今日天气:</div>")
    tplt = "<div>{0:10}\t{1:5}\t{2:5}\t{3:5}\t{4:5}</div>"
    for each in weather_list:
        weatherInTime = each.split(",")
        mail_msg+=(tplt.format(weatherInTime[0],weatherInTime[2],weatherInTime[3],weatherInTime[4],weatherInTime[5], chr(12288)))
    mail_msg+=("<div><br></div>")

    mail_msg+=("<div>今日百度热点时事新闻:</div>")
    mail_msg+=("<ul>")
    for i in range(10):
        mail_msg+=('<li><a href="{}">{}</a></li>'.format(bdtop_list_url[i].strip('\n'), bdtop_list[i].strip('\n'), chr(12288)))
    mail_msg+=("</ul>")
    mail_msg+=("<div><br></div>")

    mail_msg+=("<div>今日微博热搜:</div>")
    mail_msg+=("<ul>")
    for i in range(1, len(wbtop_list)):
        mail_msg+=('<li><a href="{}">{}</a></li>'.format(wbtop_list_url[i].strip('\n'), wbtop_list[i].strip('\n'), chr(12288)))
    mail_msg+=("</ul>")
    mail_msg+=("<div><br></div>")

    mail_msg+=("<div>今日虎扑步行街热点:</div>")
    mail_msg+=("<ul>")
    for i in range(len(hptop_list)):
        mail_msg+=('<li><a href="{}">{}</a></li>'.format(hptop_list_url[i].strip('\n'), hptop_list[i].strip('\n'), chr(12288)))
    mail_msg+=("</ul>")
    mail_msg+=("<div><br></div>")

    mail_msg+=("<div>今日豆瓣鹅组热点:</div>")
    mail_msg+=("<ul>")
    for i in range(len(ezutop_list)):
        mail_msg+=('<li><a href="{}">{}</a></li>'.format(ezutop_list_url[i].strip('\n'), ezutop_list[i].strip('\n'), chr(12288)))
    mail_msg+=("</ul>")
    mail_msg+=("<div><br></div>")

    #print(mail_msg)
    return mail_msg

非常简单粗暴的写入。格式可以参考菜鸟教程和qq邮箱代码试图下的邮件内容。

mutt发送html格式的邮件

cat /home/lin/文档/today_info.html | mutt -s "今日天气与要文" -e 'set content_type="text/html"' $YOURADDRESS$

加上一个参数-e 'set content_type="text/html"'即可。

crontab无法执行的问题

经过测试,发现crontab无法在约定的时间执行shell脚本。通过sudo service cron status查看状况,发现报错:(CRON) info (No MTA installed, discarding output)。报错的主要原因是没有配置邮件服务器。

通过sudo apt-get install postfix安装了邮件服务器后,发现问题变成: warning: unable to look up public/pickup: No such file or directory。搜索了一下可能是权限不够的问题,于是给予权限:chmod +x everydaynews.sh。

然而还是没有解决问题。经过搜索,最后发现是还得需要配置好邮件客户端,这样报错信息可以通过邮件推送(比较针对运维),如果不配置的话把报错信息输入log文件里也可以。最后写成这样:

33 18 * * * python3 /home/lin/everydaynews.py >> /home/lin/log.txt

重新启动crontab,可以实现了。这一段可以参考下面的页面:
原文链接:https://blog.csdn.net/u012129468/article/details/77926701

推荐阅读