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

考虑到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. Swiper 判断上滑下拉操作

    onTouchMove: function(swiper){ //手动滑动中触发//判断上滑下拉var i = mySwiper.translate;setTimeout(function() {va ...

  2. [树莓派(raspberry pi)] 01、在linux环境下给树莓派安装系统及入门各种资料

    1.预准备 进入帮助页面https://www.raspberrypi.org/help/,可以直接看到GET START WITH PASPBERRY PI,点击进入: 接下来会引导你检查配件是否齐 ...

  3. Chapter 7:Linking

    概述: 在linux上,从c源码到可执行文件主要需要经历translator(compiler.assembler)生成object file,再经由linker连接成executable objec ...

  4. STM32F030如何正确配置IO口的复用功能

    本文所使用的单片机型号为STM32F030C8T6. 在030系列的单片机中,PA2引脚除了作为普通的IO引脚用作输入输出功能以外,还可以作为内部外设串口1,串口2,定时器15通道1这三个外设的功能引 ...

  5. ligerUI---下拉菜单(menubar)动态显示(从后台获取数据)

    写在前面: ligerui的下拉菜单是有点丑的,这也是没有办法的事........这里主要记录下,如何从后台获取数据进行菜单显示. 有两种方式:1.使用json数组来动态添加  2.字符串拼接.  其 ...

  6. Lua API 小记1

    这些东西是平时遇到的, 觉得有一定的价值, 所以记录下来, 以后遇到类似的问题可以查阅, 同时分享出来也能方便需要的人, 转载请注明来自RingOfTheC[ring.of.the.c@gmail.c ...

  7. Error when sending message to topic test with key: null, value: 2 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)

    windows下使用kafka遇到这个问题: Error when sending message to topic test with key: null, value: 2 bytes with ...

  8. JavaScript练习网站收集

    在学习的过程中会发现很多知识点如果不在工作中运用或者手写带验证的话,很容易忘记.任何技能的掌握都是需要不断练习的.在此收集一些自己遇到的JavaScript练习的网站. codewars 国外的一个练 ...

  9. 《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)

    目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构   前言 学习Python也有一个半月时间了,学到现在感觉 ...

  10. 《Linux命令行与shell脚本编程大全》第二十章 正则表达式

    20.1 什么是正则表达式 20.1.1 定义 正则表达式是你所定义的模式模板.linux工具可以用它来过滤文本. 正则表达式利用通配符来描述数据流中第一个或多个字符. 正则表达式模式含有文本或特殊字 ...