*文中的全部代码为在Python2.7下开发,在3.x的环境下尚未测试。
Python使用自带的email库的SMTP功能发邮件:
from email.mime.text import MIMEText
import smtplib
from email.header import Header
def _format_addr(s):
name, addr = parseaddr(s) return formataddr(( \
Header(name, 'utf-8').encode(), \
addr.encode('utf-8') if isinstance(addr, unicode) else addr))
#smtp设置
from_addr = xxxx #账号
password = xxxx #密码
smtp_server = xxxx #SMTP服务器
to_addr = xxxx@xxx.com #发给谁
#邮件内容
msg = MIMEText('内容', 'plain', 'utf-8') #文本内容
#msg = MIMEText('<html><body><h1>Test</h1>' +
'<p>测试</p>' +
'</body></html>', 'html', 'utf-8') #html内容
msg['From'] = _format_addr(u'发件人昵称 <%s>' % from_addr)
msg['To'] = _format_addr(u'收件人昵称 <%s>' % to_addr)
msg['Subject'] = Header(u'邮件标题', 'utf-8').encode()
#连接服务器,发送邮件
server = smtplib.SMTP(smtp_server, 25) #默认端口25
#server = smtplib.SMTP_SSL(smtp_server,465) #这个是通过SSL方式连接
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()
运行代码,OK,一封邮件发送成功~
发送推广邮件,首先要有大量的邮箱小号,不然你会看到这个:
这里假设我通过P♂Y交易买了一些邮箱小号,我们把这些小号格式化成这样的格式:
xxx1@xxx.com password1
xxx2@xxx.com password2
... ...
存到mailbox变量里:
mailbox = '''xxx1@xxx.com password1
xxx2@xxx.com password2
... ...'''
写个函数,让函数解析mailbox,每次随机返回一个邮箱账号,存到列表里:
def FuckMail(): #解析邮箱
global mailbox
mailbox = mailbox.split('\n')
for i in range(len(mailbox)):
mailbox[i] = mailbox[i].split(' ')
def GetMail(): #获取一个邮箱,返回list[邮箱账户, 密码]
global mailbox
index = randint(0, len(mailbox) - 1)
return mailbox[index]
运行几次GetMail(),我们获取到了不同的随机邮箱账号。
好了,下面就是发信的部分。我之前定向采集好了引流的目标邮箱,以list的形式存到了to_addr里。
to_addr = ['xxx@qq.com', 'xxx@qq.com', ....]
ad变量存放我们的广告内容
ad = '''Test Ad Mail.'''
接着写个发件函数:
def Send():
global smtp_server, ad
msg = MIMEText(ad, 'html', 'utf-8')
msg['Subject'] = Header('标题', 'utf-8')
step = 10 #每次发送10个
for i in range(0, len(to_addr), step):
SendList = to_addr[i:i+step]
print("sending: %d to %d" % (i, i + step))
try:
print('Sending Email: ', SendList)
mail = GetMail()
from_addr = mail[0]
password = mail[1]
server = smtplib.SMTP_SSL(smtp_server,465)
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, SendList, msg.as_string())
server.quit()
except:
print('ERROR!')
sleep(3600) #一般是邮箱被封了,休息一小时重试
pass
sleep(10)
运行它,一个完美的发邮件程序写好了。
划重点!划重点!划重点!:
以上程序如果用163邮箱当小号的时候,你会看到这个:
这个函数没有写msg['From']和msg['To'],因此这个msg不是标准形式的发件header。在QQ邮箱测试时没问题的,但是163邮箱会提示垃圾邮件,禁止发送。手动添加上这两个即可。
总结一下,整个营销发件程序为:
#encoding:utf-8
from email.mime.text import MIMEText
import smtplib
import requests as r
import json
from random import shuffle, randint
from time import sleep
from email.header import Header
#小号列表
mailbox = '''xxx@qq.com password
xxx2@qq.com password
xxx3@qq.com password'''
#smtp服务器
smtp_server = 'smtp.qq.com'
#收件人
to_addr = []
#广告词(邮件内容)
ad = '<html><body><p>致正在忙碌的考研、考证党们~</p><br><img src="http://cdn.mmuaa.com/ad.jpg" /><br><p>作为一个新时代的大学生,我们要为自己奋斗,为自己努力。为了找到一个好的工作,找个好的生活环境,冲一冲吧~</p></body></html>'
def GetTarget():
global to_addr
'''次数省略目标邮箱的采集程序'''
def Send():
global smtp_server, ad
msg = MIMEText(ad, 'html', 'utf-8')
msg['Subject'] = Header('致正在奋斗中的大学党', 'utf-8')
step = 10
for i in range(0, len(to_addr), step):
SendList = to_addr[i:i+step]
print("sending: %d to %d" % (i, i + step))
try:
print('Sending Email: ', SendList)
mail = GetMail()
from_addr = mail[0]
password = mail[1]
server = smtplib.SMTP_SSL(smtp_server,465) #SSL方式连接
server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, SendList, msg.as_string())
server.quit()
except:
print('ERROR!')
sleep(3600)
pass
sleep(10)
def FuckMail():
global mailbox
mailbox = mailbox.split('\n')
for i in range(len(mailbox)):
mailbox[i] = mailbox[i].split(' ')
def GetMail():
global mailbox
index = randint(0, len(mailbox) - 1)
return mailbox[index]
FuckMail()
GetTarget()
Send()