使用Python发送邮件分享

分享一个使用Python发送邮件的脚本,Python版本2.7.5.代码如下:

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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- coding: gbk -*-
"""
@Date: Tue Nov 8 14:43:58 2016
@Author: Jeff <370610810@qq.com>
@Link:
@PythonVersion: v2.7.10
@Filename: sendmail.py
"""
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.utils import parseaddr, formataddr
import smtplib
import os.path
import codecs
import datetime,time
def _format_addr(s):
"""格式化邮件地址"""
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
class sendmail:
"""使用Python以指定邮箱发送邮件"""
mail_host = 'smtp.163.com'
mail_from = 'lemoncn2014@163.com'
mail_user = 'lemoncn2014'
mail_passwd = 'jgyMJU&,ki8'
msg = MIMEMultipart()
def __init__(self,mailContent,mailTo,getTitle,fileList):
"""使用email函数库构造email内容"""
# 对邮件内容、收件人、抄送人、标题、附件执行初始化
self.mail_content = mailContent
self.mail_to = mailTo
# 邮件抄送方:使用时可替换为真实的邮件地址
self.mail_cc = '*****@xxxxxx.com'
self.get_title = getTitle
self.file = fileList
"""开始构造email
---构建带附件的邮件实例"""
# 构建邮件头信息
sendmail.msg['From'] = _format_addr('<%s>' % sendmail.mail_from)
sendmail.msg['To'] = _format_addr('<%s>' % self.mail_to)
#sendmail.msg['To'] = ';'.join (self.mail_to)
sendmail.msg['Cc'] = _format_addr('<%s>' % self.mail_cc)
sendmail.msg['Subject'] = Header(self.get_title).encode('utf8')
# sendmail.msg['Date'] = time.strftime('%a, %Y-%m-%d %H:%M:%S %z')
# 构建邮件正文
sendmail.msg.attach(self.mail_content)
# 如果附件列表不为空,则构建邮件附件
if self.file:
print('Attachment(s) as follow:%s' % format(self.file))
#使用with安全地打开文件
with open(self.file, 'rb') as i:
atta = MIMEText(i.read(), 'base64', 'utf8')
atta["Content-Type"] = 'application/octet-stream'
atta["Content-Disposition"] = 'attachment; filename="{}"'.format(os.path.basename(self.file))
sendmail.msg.attach(atta)
else:
print('This message has no attachment.')
with open(self.file, 'rb') as f:
# 将图片附加到邮件正文
msgImage = MIMEImage(f.read())
# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
sendmail.msg.attach(msgImage)
def send_mail(self):
try:
# 来源:http://www.oschina.net/code/snippet_2293291_55062
# ssl端口为465/994,非ssl协议的smtp端口是25
smtpObj = smtplib.SMTP_SSL(sendmail.mail_host, 994)
# debug级别,1为开启;0关闭
smtpObj.set_debuglevel(1)
smtpObj.login(sendmail.mail_user, sendmail.mail_passwd)
smtpObj.sendmail(sendmail.mail_from, [self.mail_to,self.mail_cc], sendmail.msg.as_string())
print(time.strftime('%a, %Y-%m-%d %H:%M:%S %z'),'sendmail succeed.')
except Exception as e:
print(e)
print(time.strftime('%a, %Y-%m-%d %H:%M:%S %z'),'sendmail failed.')
finally:
smtpObj.quit()
def main():
# 指定邮件接收方,使用时请替换为真实的邮件地址。
mymail = 'ooxx@oooxxx.com'
title = '[广告]有一个发财的机会正在向你招手,去看看吗?'.decode('utf8')
# 指定邮件正文
# 定义邮件html格式正文
f = """
<html><title>有一个发财的机会正在向你招手,去看看吗?</title><body>
<p>由于这封邮件是通过程序自动发送的,它不能正常显示或是要是有什么问题,请及时
<a href="mailto:shiyao.zh@gmail.com?subject=购买理财通发财变轻松的反馈&cc=lemoncn2014@163.com">反馈给××有钱</a>,
非常感谢。</p>
<p>想做高富帅,请扫描下面的二维码并订阅;继续做穷逼,请<a href="#" onclick="alert('再见,穷逼!(作为有态度的媒体,我们不愿与穷逼说话。)')">退订</a>。</p>
<center><a href="http://opstrip.com/" target="_blank" alt="OPSTRIP.COM"><img src="cid:image1" height="80px" width="80px" /></a></center>
<p>如需投诉,请直拨妖妖灵。</p>
<p><font size="-2" color="gray">以上段子纯属搞笑。</font></p>
<hr>
<p>本段子由 <a href="http://opstrip.com/" target="_blank">OPSTRIP</a> 友情提供。不服你来点我呀!</p>
</body></html>
"""
# 生成邮件正文
content = MIMEText(f,'html','utf-8')
# 创建邮件附件
file = "http://opstrip.com/assets/blogImg/qrcode.png"
# file = "C:/Users/admin/Downloads/localhost.%s.log" % ((datetime.datetime.now() - datetime.timedelta(days=1)).strftime("%Y-%m-%d"))
# 调用sendmail类发送邮件
sdm = sendmail(content,mymail,title,file)
sdm.send_mail()
if __name__ == '__main__':
main()
else:
print("sendmail.py was imported!")

注:本脚本使用的Python版本为2.7,仅作为测试用例使用。其他版本可能会有差异引起的不兼容问题;程序中的邮箱地址请替换为自己的真实邮箱地址。

文章目录