最近在工作时,需要实现在公司开发的调度系统上实现:将每天产生的游戏数据查询统计出,并发送邮件给数据分析的开发人员。

考虑到python语言的简洁易上手,在我没有任何python基础的情况下,十分轻松的完成了这个脚本功能。

下面放出代码,展示了通过python发送html邮件的模板:

1.生成数据:

 #!/usr/bin/env python
# -*-coding: UTF-8 -*-
import MySQLdb
import sys from constant import DB_PARAMS_91
from db_utils import new_execsqlr def query_data():
try:
sql =
result = new_execsqlr(sql, DB_PARAMS_91) #这里调用的是公司内部封的数据库查询模块,内部用的是MySQLdb
print result
return [x.split("\t") for x in filter(is_warning_column, result)]
except MySQLdb.Error, e:
print "Mysql Error %d: %s" % (e.args[0], e.args[1])
sys.exit(1) # 过滤结果中的信息
def is_warning_column(x):
return ("mysql" not in x) and ("ds" not in x) and ("Warning" not in x)

2.拼接html模板(注意html的样式最好只写在标签内,大部分的邮箱都不支持外联css样式,而且js脚本也不会起作用):

 #!/usr/bin/env python
# encoding:utf-8
import sys sys.path.append("..")
sys.path.append("../..")
sys.path.append("../../..")
sys.path.append("../../../..")
from consume_data import query_data # 将sql语句拼接到html中:注意样式只能嵌套在标签中,不能写在head和css中
def get_html_msg():
result = query_data()
head = """<head><meta charset="utf-8">
</head>""" th = """<body>""""""
<div class="container" style = "margin-left:calc(50% - 372px);">
<table border="1" style = "text-align: center;border-collapse:collapse;">
<tbody>
<tr bgcolor = "#E3E3E3">
<th colspan="11" style = " padding: 2px 5px; font-size: 10px;">广告推广每日监控报表邮件</th>
</tr>
<tr bgcolor = "#E3E3E3">
<th rowspan="2" style = " padding: 2px 5px; font-size: 10px;">date</th>
<th colspan="5" style = " padding: 2px 5px; font-size: 10px;">iOS</th>
<th colspan="5" style = " padding: 2px 5px; font-size: 10px;">Android</th>
</tr>
<tr bgcolor = "#E3E3E3">
<th style = " padding: 2px 5px; font-size: 10px;">点击PV</th>
<th style = " padding: 2px 5px; font-size: 10px;">当日激活</th>
<th style = " padding: 2px 5px; font-size: 10px;">当日注册</th>
<th style = " padding: 2px 5px; font-size: 10px;">当日创角</th>
<th style = " padding: 2px 5px; font-size: 10px;">当日付费</th>
<th style = " padding: 2px 5px; font-size: 10px;">点击PV</th>
<th style = " padding: 2px 5px; font-size: 10px;">APP当日激活</th>
<th style = " padding: 2px 5px; font-size: 10px;">SDK当日激活</th>
<th style = " padding: 2px 5px; font-size: 10px;">当日注册</th>
<th style = " padding: 2px 5px; font-size: 10px;">当日付费</th>
</tr>"""
tr = ''
for row in result:
td = ''
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[0] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[1] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[2] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[3] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[4] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[5] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[6] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[7] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[8] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[9] + '</td>'
td = td + '<td style = " padding: 2px 5px; font-size: 10px;">' + row[10] + '</td>'
tr = tr + '<tr>' + td + '</tr>'
tr = tr.encode('utf-8')
body = tr
tail = '</tbody></table></div></body></html>'
# 将内容拼接成完整的HTML文档
html = head + th + body + tail
return html

3.发送html邮件:

 #!/usr/bin/env python
# encoding:utf-8
import smtplib
import sys sys.path.append("..")
sys.path.append("../..")
sys.path.append("../../..")
sys.path.append("../../../..")
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart from SMTPConstant import mail_host, sender, receivers, mail_port
from produce_htmltemplate import get_html_msg # 邮件发送
def send_mail(html_msg, mail_host, mail_port, sender, receivers): # recivers定义了一个数组
msg = MIMEMultipart()
content = MIMEText(html_msg, 'html', _charset='utf8')
msg.attach(content)
msg['To'] = ";".join(receivers)
msg['From'] = sender
msg['Subject'] = "。。。。。"
s = smtplib.SMTP(mail_host, mail_port)
s.sendmail(sender, receivers, msg.as_string())
s.quit()
print " send ok!" # test
if __name__ == "__main__":
html = get_html_msg()
send_mail(html, mail_host, mail_port, sender, receivers)

如果使用的qq邮箱,则需要先登录自己的qq邮箱,自己的邮箱需要开通pop3服务,登录时的账号密码填写qq提供的授权码。

使用python实现群发邮件的更多相关文章

  1. Python自动群发邮件,只需20行代码!

    今日分享 Python自动群发邮件 import smtplib from email import (header) from email.mime import (text, applicatio ...

  2. python smtp 群发邮件

    最近工作中遇到使用脚本处理问题并发送结果邮件,使用python的smtp模块很简单的完成了实现.今天遇到一个问题,根据脚本的测试结果需要群发邮件,但是发送邮件的py文件只有首个地址收到了邮件.仔细排查 ...

  3. python selenium2示例 - email发送

    前言 在进行日常的自动化测试实践中,我们总是需要将测试过程中的记录.结果等等等相关信息通过自动的手段发送给相关人员.python的smtplib.email模块为我们提供了很好的email发送等功能的 ...

  4. Python实现发送邮件(实现单发/群发邮件验证码)

    Python smtplib 教程展示了如何使用 smtplib 模块在 Python 中发送电子邮件. 要发送电子邮件,我们使用 Python 开发服务器,Mailtrap 在线服务和共享的网络托管 ...

  5. 【Python系列】Python自动发邮件脚本-html邮件内容

    缘起 这段时间给朋友搞了个群发邮件的脚本,为了防止进入垃圾邮件,做了很多工作,刚搞完,垃圾邮件进入率50%,觉得还不错,如果要将垃圾邮件的进入率再调低,估计就要花钱买主机了,想想也就算了,先发一个月, ...

  6. python发送邮件心得体会

    利用本地smtp server发送 windows下尝试装了两个smtp server大概配置了下,发现没法生效,也没时间仔细研究了.装上foxmail发现以前可以本地发送的选项已经无法找到. 不带附 ...

  7. 【python】脚本连续发送QQ邮件

    今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...

  8. 使用 Python 在 Linux 上实现一键回归测试

    从代码库迁出代码 —- pexpect 的使用 测试人员从代码库(例如 CVS )迁出代码的过程中,需要手动输入访问密码,而 Python 提供了 Pexpect 模块则能够将手动输入密码这一过程自动 ...

  9. 3.python 发送邮件之smtplib模块

    SMTP(Simple Mail Transfer Protocol)是简单邮件传输协议,它是一组用于由源地址到目的地址的邮件传输规则. python中对SMTP进行了简单的封装,可以发送纯文本邮件, ...

随机推荐

  1. 几种移动app API调用认证方案浅析

    最近做的金融项目,app调用的接口需要做一个身份认证,所以找了下目前API services验证的几种方式.之前翻译的一篇文章--[译]移动API安全终极指南中,主要提出了API服务调用验证的问题,通 ...

  2. C#写的较完美验证码通用类

    using System; using System.Collections; using System.ComponentModel; using System.Data; using System ...

  3. 69、django之Form组件

    本篇导航: 小试牛刀 Form类 常用选择插件 自定义验证规则 初始化数据 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次 ...

  4. 隐藏17年的Office远程代码执行漏洞(CVE-2017-11882)

    Preface 这几天关于Office的一个远程代码执行漏洞很流行,昨天也有朋友发了相关信息,于是想复现一下看看,复现过程也比较简单,主要是简单记录下. 利用脚本Github传送地址 ,后面的参考链接 ...

  5. JavaWeb 学习之 JSTL

    上一篇博文我们讲解了 MVC 小案例,案例中包含了基本的增.删.改.查,对这个案例的有兴趣的伙伴可以自己动手实践一下,去复习一下或者说是学点新的知识!如果有已经看过且实践过的伙伴相信对 JSP 页面中 ...

  6. SHA安全散列算法简析

    1 SHA算法简介 1.1 概述 SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散 ...

  7. 玩转html

    简介 CSS 是什么? CSS是Cascading Style Sheets的简称,中文称为层叠样式表. 作用 能够对网页中元素位置的排版进行像素级精确控制,支持几乎所有的字体字号样式,拥有对网页对象 ...

  8. Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    目录 SignalR系列目录(注意,是ASP.NET的目录.不是Core的) 前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于Signal ...

  9. ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  10. 第四届河南省ACM SUBSTRING 字符串处理

    SUBSTRING 时间限制: 1 Sec  内存限制: 128 MB 提交: 17  解决: 5 [提交][状态][讨论版] 题目描述 You are given a string input. Y ...