lex数软工作室

长期承接软件开发,数据采集,图像处理,技术咨询 微信:lex_workshop

使用python定时发送gmail邮件

如果单纯使用python定时发送很简单,但是国内无法直接连接gmail邮件,需要使用vpn做桥接然后登陆发邮件

代码梳理过程如下

使用国内邮箱定时发邮件代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from email.mime.application import MIMEApplication
from smtplib import SMTP_SSL
import smtplib

class MailControl(object):
def __init__(self,mail_host,mail_user,mail_pass,mail_name):
self.mail_host=mail_host
self.mail_user=mail_user
self.mail_pass=mail_pass
self.mail_name=mail_name

def login(self):
'''
登录邮箱
:return:
'''
self.server = smtplib.SMTP(host=self.mail_host, port="587") # SMTP协议默认端口是25
#self.server = SMTP_SSL(self.mail_host, 465)
self.server.ehlo()
self.server.starttls()
self.server.login(self.mail_user, self.mail_pass)

def send(self,msg:MIMEMultipart,to_addr):
'''
:param to_addr:客户地址
:param msg:消息体
:return:
'''
return self.server.send_message(from_addr=self.mail_user,to_addrs=to_addr,msg=msg)

def quit(self):
'''
退出邮箱
:return:
'''
self.server.quit()

def createHeader(self,title,To:list,CC:list,BCC:list):
'''
创建标题
:param title:
:param To:
:param CC:
:param BCC:
:return:
'''
msg = MIMEMultipart()
msg['From'] = Header(self.mail_name, 'utf-8')
msg['To'] = Header(','.join(To), 'utf-8')
if len(CC)>0:
msg['CC'] = Header(','.join(CC), 'utf-8')
if len(BCC)>0:
msg['BCC'] = Header(','.join(BCC), 'utf-8')
msg['Subject'] = Header('%s' % title, 'utf-8')
return msg

def addContent(self,msg:MIMEMultipart,content,msgType="plain"):
msg.attach(MIMEText(content,msgType, 'utf-8')) #msgType html
return msg

def addAttach(self,msg:MIMEMultipart,fileName):
'''

:param msg:
:param fileName: 文件名
:return:
'''
apart = MIMEApplication(open(' attachment/'+fileName, 'rb').read())
apart.add_header('Content-Disposition', 'attachment', filename=fileName)
msg.attach(apart)
return msg

def addSignature(self,msg:MIMEMultipart,name:str,sendCon:str):
'''
:param msg:
:param name:
:return:
'''
with open(file="mailSignature/"+name+".htm",encoding="utf-8") as file:
content=file.read().replace("{{正文}}",sendCon)
self.addContent(msg,content,"html")
return msg


单纯使用上面代码再国内是无法发送邮件的,因为有墙的原因

给邮件设置vpn的代理

1
2
3
4
5
6
import socks
import socket
#12345为vpn的端口号,请自行查看对应的端口号
socks.setdefaultproxy(socks.HTTP, 'localhost', 12345)
socket.socket=socks.socksocket

上述代码已经可以使邮件协议走vpn的通道

gmail发送邮件的逻辑代码

1
2
3
4
5
6
7
8
9
10
control = MailControl("smtp.gmail.com", "gmail用户名", "gmail密码","gmail用户名<gmail用户名@gmail.com>")
control.login() #登录
mail="kehu@gmail.com"
msg = control.createHeader("发送邮件标题", ["%s<%s>" % ("客户邮件名", mail)], [], [])
msg = control.addContent(msg, "<p>邮件正文</p>", "html")
for attach in attachs:
#有附件添加附件
msg = control.addAttach(msg, attach)
rev = control.send(msg, [mail])
control.quit()

使用上诉代码即可用gmail给客户发送邮件

⬅️ Go back