EDM营销算法:python自动批量发邮件
EDM营销:全称Email Direct Marketing,即电子邮件营销。企业可以通过使用EDM软件向目标客户发送EDM邮件,建立同目标顾客的沟通渠道,向其直接传达相关信息,用来促进销售。EDM软件有多种用途,可以发送电子广告、产品信息、销售信息、市场调查、市场推广活动信息等。
身为一名会修电脑的数据分析师,总是要想着怎样把公司电脑搞坏,顺便给公司创造点价值
刚好python有个
import smtplib
因此,就用python3.4来写这个代码
首先一个最简单的邮件发送的代码是这样子的,定义一个函数:
# 协议服务器地址、发件方邮箱前缀、发件方邮箱密码、收件方邮箱、信件标题、内容
def send_email(SMTP_host, from_account, from_passwd, to_account, subject, content):
def send_email(协议服务器, 发件人邮箱, 发件人邮箱密码, 收件人邮箱, 邮件标题, 邮件内容):
解析服务器地址,每个邮箱的服务器地址都不一样,一定要根据发件方的邮箱类型来选择服务器地址例如:
# 协议服务器地址
# smtp.163.com
# smtp.21cn.com
# smtp.sina.com.cn
# smtp.sohu.com
# smtp.126.com
# smtp.qq.com
服务器的的端口也不一样,一般都是端口25,只有qq的是465或者587
加载服务器:
email_client = smtplib.SMTP(SMTP_host,25)
账号密码登录:
email_client.login(from_account, from_passwd)
将邮件的文本信息搞进来,换点编码,中间的'plain'是文本,中间可以是html,那么你的内容content就要写成网页形式<b>...</b>:
msg = MIMEText(content, 'plain', 'utf-8')
邮件寄出去不是还有谁谁谁寄的么,就是下面的这个,标题、发件人、收件人,收发邮件人名的格式啊,搞进去:
from_title = from_account + "<" + from_account + "@" + from_postfix + ">"
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] = from_account
msg['To'] = to_account
寄出去:
email_client.sendmail(from_account, to_account, msg.as_string()) email_client.quit()
记得关闭邮件
这样子一个很简单的邮件发送系统就出来了
看看主函数:
if __name__ == "__main__":
send_email("smtp.163.com","xxxxx@163.com","password","xxxxx@126.com","test","hellow")
完整的简单发邮件代码:
import smtplib
from email.mime.text import MIMEText
from email.header import Header def send_email(SMTP_host, from_account, from_passwd, to_account, subject, content):
email_client = smtplib.SMTP(SMTP_host)
email_client.login(from_account, from_passwd)
# create msg
msg = MIMEText(content, 'plain', 'utf-8')
msg['Subject'] = Header(subject, 'utf-8') # subject
msg['From'] = from_account
msg['To'] = to_account
email_client.sendmail(from_account, to_account, msg.as_string()) email_client.quit() if __name__ == "__main__":
send_email("smtp.163.com","xxxxx@163.com","password","xxxxx@126.com","test","hellow")
--------------------------------------我是快乐的分割线--------------------------------------
上面的那个发邮件的是很简单很简单的,没有批量,没有详细解说,我是不会满意这样的东西,那么,看我神一样的代码
首先,你们要注意到,qq邮箱发邮件有一个很重要的BUG
如果没有解决那么QQ邮箱无法登陆
为什么一定需要QQ邮箱呢?
因为!
用这个服务器QQ只接受来自QQ的邮件,163以及其他的他都不接受!!!
所以一定要用QQ邮箱
打开QQ邮箱--设置--账户
一定要开启下面那两个服务,因为开启这两个服务才能使用QQ邮箱发
要发短信的,发完点击我已发送,QQ会给一个16位的字母给你
注意注意注意注意注意注意注意注意注意注意,这个才是QQ邮箱发邮件的密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码密码
好,得到这个密码后,我再将其他163的邮箱放进来
因为单个邮箱每天上限200个,发200肯定被封,你不希望自己的邮箱被封吧
所以要多个邮箱发
而且是发给多个用户,那么新建两个excel表格,打开读取里面的账号密码:
from openpyxl import load_workbook
try:
# 读取发件人邮箱
wb = load_workbook(filename=r'../fromemail.xlsx') ##读取路径
ws = wb.get_sheet_by_name("Sheet1") ##读取名字为Sheet1的sheet表 # 建立邮箱账号密码数组
fromemail_qqaccount = []
fromemail_qqpasswd = []
fromemail_othaccount = []
fromemail_othpasswd = [] for row_A in range(2, 100): ## 遍历第2行到100行
qqacc = ws.cell(row=row_A, column=1).value ## 遍历第2行到100行,第1列
qqpas = ws.cell(row=row_A, column=2).value ## 遍历第2行到100行,第2列
othac = ws.cell(row=row_A, column=3).value ## 遍历第2行到100行,第3列
othpa = ws.cell(row=row_A, column=4).value ## 遍历第2行到100行,第4列
if qqacc:
fromemail_qqaccount.append(qqacc)
fromemail_qqpasswd.append(qqpas)
if othac:
fromemail_othaccount.append(othac)
fromemail_othpasswd.append(othpa) # 判断是否有qq邮箱,如果没有则退出程序
if len(fromemail_qqaccount) == 0:
input('没有qq邮箱或者qq邮箱写入的格式不对,请插入或改正...')
exit() # 读取收件人邮箱
wb = load_workbook(filename=r'../toemail.xlsx') ##读取路径
ws = wb.get_sheet_by_name("Sheet1") ##读取名字为Sheet1的sheet表 # 建立收件人邮箱账号数组
toemail_account = []
for row_B in range(2, 10000): ## 遍历第2行到10000行
emaacc = ws.cell(row=row_B, column=1).value ## 遍历第2行到10000行,第1列
if emaacc:
toemail_account.append(emaacc)
except:
input('写入excel的格式不对,请查证...')
exit()
我的excel格式是这样子的:
这里就不解释啦,读取excel我以前的博文就有详细解释
那么内容content我也写进了txt记事本里面:
第一行是标题,后面是内容代码如下:
try:
file = open('../content.txt', 'r')
data = file.read().split('\n')
subject = '标题'
content = '正文'
if data[0] != '':
for j in range(0, len(data)):
if j == 0:
# 邮件标题
subject = data[0]
elif j > 0:
if j == 1:
# 邮件正文
content = data[1]
if j > 1:
content = str(content) + '\n' + data[j]
else:
pass
file.close()
except:
input('写入txt的格式不对,请改正...')
exit()
如果标题和内容是空的,那么我就自己给一个标题和内容:
subject = '标题'
content = '正文'
因为涉及到换行写入,所以有:
content = str(content) + '\n' + data[j]
好滴,这些东西统统加进去,感觉这个EDM系统做得不错了
但是但是,呵呵哒,突然发现登录的时候直接写邮箱会出现错误,也就是这样子:,但是还有,我要发图片怎么办
我把图片存到pic文件夹
发图片只能是用html来写,也就是我前文写到的html格式
那么函数要写成:
#登录之前不变...
email_client.login(from_account, from_passwd)
msg = MIMEMultipart('related')
fp = open('../pic/图片.jpg', 'rb')
msgImage = MIMEImage(fp.read())
msgImage.add_header('Content-ID', 'weekly')
msg.attach(msgImage)
fp.close()
msg.attach(MIMEText("<b>"+content+"</b>" + "<br><img src=\"cid:weekly\">", 'html', 'utf-8'))
嗯,这样子就可以发图片了:
好滴,但是前面有提到qq邮箱只能用qq邮箱来发
那么我写了一个想法
当邮箱是qq邮箱的时候只能用qq邮箱,出错了退出程序
当邮箱不是qq邮箱的时候用其他邮箱来发,出错了再用QQ邮箱来发,再出错就退出程序
那么就准备了一大堆邮箱,循环发,首先判断是不是qq邮箱:
if 'qq' in toemail_account[i]:
print('用了qq邮箱...')
# 定义协议地址
SMTP_host = 'smtp.qq.com' # 取得@前面的东西
from_account = re.compile(r'(.*)@(.*)').search(fromemail_qqaccount[int(count_1) - 1]).group(1)
# 取得@后面的东西,等同于下面的语句
# from_postfix = re.compile(r'(.*)@(.*)').search(fromemail_qqaccount[i]).group(1)
from_postfix = 'qq.com' # 密码
from_passwd = fromemail_qqpasswd[int(count_1) - 1]
# print('读取第count_1 - 1个qq的账号和密码') # 收件人地址
to_account = toemail_account[i] # print('用第count_1 - 1个qq的账号和密码发送邮件')
send_email(SMTP_host, from_account, from_passwd, to_account, subject, content)
这是很简单的判断读取excel的邮箱的东西啦,不多说
要说的是我要循环利用发件人的邮箱,那么就要有个判断,当循环到头的时候要重新循环,所以就有了那个count_1,最主要的是在这里:
if count_1 % int(len(fromemail_qqaccount)) == 0:
# 循环够了,要初始化count_1
count_1 = 1
else:
count_1 = count_1 + 1
整除即可
如果收件人不是qq邮箱,那么来:
else:
# 收件人地址
to_account = toemail_account[i]
# 取得地址协议
if '' in toemail_account[i]:
SMTP_host = 'smtp.163.com'
elif 'sina' in toemail_account[i]:
SMTP_host = 'smtp.sina.com.cn'
elif '' in toemail_account[i]:
SMTP_host = 'smtp.126.com'
elif 'sohu' in toemail_account[i]:
SMTP_host = 'smtp.sohu.com' # 取得@前面的东西
from_account = re.compile(r'(.*)@(.*)').search(fromemail_othaccount[int(count_2) - 1]).group(1)
# 取得@后面的东西,等同于下面的语句
from_postfix = from_postfix = re.compile(r'(.*)@(.*)').search(fromemail_othaccount[int(count_2) - 1]).group(2)
# 密码
from_passwd = fromemail_othpasswd[int(count_2) - 1]
# print('读取第count_2 - 1个邮箱的账号和密码') # print('用第count_2 - 1个邮箱的账号和密码发送邮件')
send_email(SMTP_host, from_account, from_passwd, to_account, subject, content)
if count_2 % int(len(fromemail_othaccount)) == 0:
# 循环够了,要初始化count_2
count_2 = 1
else:
count_2 = count_2 + 1
这样子这个程序挺像样子了
但是!
我是数据分析师
我很追求完美
万一中间程序断了怎么办,我怎么知道哪些人发了邮件哪些人没发?
呵呵哒,创建一个finish.txt,每发一个保存一个:
#记录下已经发送的邮件
save_finish = '../finish.txt'
read_finish = open(save_finish, 'r').read()
txt_finish = str(read_finish) # 以写入的方式打开txt,在上面记录的内容后面继续添加新内容
file_finish = open(save_finish, 'w')
txt_finish = str(txt_finish) + '\n' + str(to_account)
file_finish.write(txt_finish)
file_finish.close()
最后成功运行:
--------------------------我是快乐的分割线---------------------------
EDM营销,满满的利润来了
最后为什么没有贴出完整代码,因为商业机密啊
我是收了钱的啊
思路都给了
还不满足啊
要不你可以去买收钱的啊
https://help.aliyun.com/document_detail/29421.html
EDM营销算法:python自动批量发邮件的更多相关文章
- Python+selenium自动循环发邮件
Python源代码如下: # coding=utf-8 from selenium import webdriver from time import sleep from random import ...
- Python自定义任务发邮件提醒
前言 在工作中,有时会有一些定期需要执行的任务或在将来某一天需要执行的任务,为避免疏漏,设计个小工具,发邮件提醒自己去处理. 方案简介 1.建立一个Excel文件,里面定义好待提醒的任务 2.建立一个 ...
- python批量发邮件
如果有一天,老板过来给你一个很大的邮箱列表,要你给每个人发邮件,你该如何去做,最简单的就是写一个 python 程序 # coding:utf-8import smtplibfrom email.mi ...
- Python自动批量修改服务器密码
工作中,我们经常会定期更换服务器密码,如果手动去修改,不仅费时,而且容易出错.下面提供了一种思路,可以实现批量.自动修改服务器密码. 大致思路:首先,为每一台服务器设定一个唯一标识:其次,将每台服务器 ...
- python之smtplib发邮件
第一版: 认证发信,不支持附件 #!/usr/bin/env python # --------------------------------------- # author : Geng Jie ...
- Python学习笔记——发邮件
参考:Python3实现163邮箱SMTP发送邮件 1.首先需要注册一个网易的邮箱,开启smtp服务,并使用其授权码 2.发送邮件的Python脚本 #!/usr/bin/python # -*- c ...
- 【python】使用python smtplib库发邮件添加cc,bcc
#!/usr/bin/env python# -*- coding: utf-8 -*- '''@author@mail @date 2017/03/16 发送邮件'''import smtplibf ...
- python使用SMTP发邮件时使用Cc(抄送)和Bcc(密送)
SMTP发送邮件的时候,并没有特殊的通信语句告诉邮件服务器 谁是主送,谁是抄送/密送,这三个角色都是以同样的方式告诉邮件服务器的,然后重点在邮件内容里. 邮件内容分为头和体两部分(就像http),头部 ...
- python中关于发邮件的示例
发送邮件示例代码如下: from WebUtils import ProperitiesLoad from email.mime.text import MIMEText from email.mim ...
随机推荐
- Windows 2008 R2防火墙,允许被ping
netsh firewall set icmpsetting 8 1. 准备 1) 原因 出于安全因素考虑,在Windows 2008 R2上是不允许从外部对其Ping ...
- # 20145210 《Java程序设计》第02周学习总结
教材学习内容总结 本周我对教材第三章进行了学习,第三章对Java语言的语句.语法.类型.变量的定义等内容进行了比较详细的说明,相比之前的第一章和第二章,我觉得这一章还是比较好理解的,比较容易被接受.J ...
- HDU 2291
http://acm.hdu.edu.cn/showproblem.php?pid=2291 读题读的烦死了,今天果真不适合做题 题意:给两个n*n的矩阵,第一个代表一个人战胜一个人可以得到的经验值, ...
- 如何在Apache中建立一个新端口
环境: Windows server 2008 R2, Apache, PHP5 步骤: 建立一个目录,里面放置一个index.php. 打开Apache\conf\httpd.conf 文件,做如下 ...
- X86平台乱序执行简要分析(翻译为主)
多处理器使用松散的内存模型可能会非常混乱,写操作可能会无序,读操作可能会返回不是我们想要的值,为了解决这些问题,我们需要使用内存栅栏(memory fences),或者说内存屏障(memory bar ...
- DISCOVAR de novo
海宝建议用这个拼接软件 http://www.broadinstitute.org/software/discovar/blog/?page_id=98 DISCOVAR – variant call ...
- SAP 增强说明
转自http://blog.csdn.net/lyb_yt/article/details/8177974 (一)什么是增强(Enhancement)? 简单地说,增强就是ERP系统中标准程序的出口, ...
- jQuery弹出层始终垂直居中相对于屏幕或当前窗口
把弹出层的位置设为fixed,设置top:50%,然后获取当前元素的整体的高度height,用获取的高度height/2,设置margin-top:-height/2.即可把当前的弹出层始终垂直居中于 ...
- 用CSS变形创建圆形导航
http://www.w3cplus.com/css3/building-a-circular-navigation-with-css-transforms.html 本文由陈毅根据SARA SOUE ...
- HDU 2717 Catch That Cow --- BFS
HDU 2717 题目大意:在x坐标上,农夫在n,牛在k.农夫每次可以移动到n-1, n+1, n*2的点.求最少到达k的步数. 思路:从起点开始,分别按x-1,x+1,2*x三个方向进行BFS,最先 ...