python版本:3.6.5
因工作需求使用到python来编写脚本发送工作邮件,查了一些网络资料,完成了两个需求(1.发送文本邮件,2,发送带文本和附件的邮件),现记录如下:
需求1:只发送包含文本内容的邮件:
# !/usr/bin/env python
# -*-coding:utf-8 -*-
#需求1:只发送正文内容
import time
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.utils import parseaddr, formataddr
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_email(info):
# 发件人地址
from_addr = '[email protected]'
# 邮箱密码
password = 'xxxxxxxx'
# 收件人地址,可同时添加多个
to_addrs = [
'[email protected]',
'[email protected]',
]
# 邮箱服务器地址
smtp_server = 'smtp.163.com'
local_time = time.strftime('%Y-%m-%d %H:%M:%S')
content = f'''
您好,
{info}
邮件发送时间时间: {local_time}
'''
# 设置邮件信息
msg = MIMEText(content, 'plain', 'utf-8')
msg['From'] = _format_addr('发件人名称 <%s>' % from_addr)
msg['To'] = _format_addr('收件人名称 <%s>' % to_addrs)
msg['Subject'] = Header('邮件标题', 'utf-8').encode()
# 发送邮件
server = smtplib.SMTP_SSL(host=smtp_server, port=25)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs=to_addrs, msg=msg.as_string())
server.quit()
if __name__ == '__main__':
info='''
早上好,吃饭了吗~
aaa,bbb,ccc,ddd
'''
send_email(info)
说明;1.通过python注释(三个单引号)的方式来构造邮件证明,可以优化显示的格式,比如换行,空格等.当然也可以发送一个html的文本,邮件显示格式化会更好.
2.发送邮件的邮箱需要开通smtp服务,登录密码为开通服务时设定的授权码.
3.上面这段代码在连接服务器的时候使用了smtplib.SMTP_SSL()方法来进行连接,貌似不同的邮箱链接方式略有不同.亲测如果网易邮箱的话,使用smtplib.connect()也是可以链接并正常发送邮件的.
4.通过脚本发送的邮件,在接收方那里可能显示为垃圾邮件,需要设置白名单,移出垃圾箱.
需求2:发送包括正文内容和文本附件的邮件
# !/usr/bin/env python
# -*-coding:utf-8 -*-
#需求2:发送邮件正文加附件
import time
import smtplib
from email import encoders
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def send_email(info,file_paths):
# 发件人地址
from_addr = '[email protected]'
# 邮箱密码
password = 'xxxxxxxx'
# 收件人地址,可同时添加多个
to_addrs = [
'[email protected]',
'[email protected]',
]
# 邮箱服务器地址
smtp_server = 'smtp.163.com'
local_time = time.strftime('%Y-%m-%d %H:%M:%S')
content = f'''
您好,
{info}
邮件发送时间时间: {local_time}
'''
# 设置邮件信息
msg = MIMEMultipart()
body = MIMEText(content.encode(), 'plain', 'utf-8')
msg.attach(body)
# 构造附件
for file_name in file_paths:
attachment = MIMEBase('application', 'octet-stream')#参数的意义未深究
attachment.set_payload(open(file_name, 'rb').read())
encoders.encode_base64(attachment)
attachment.add_header('Content-Disposition','attachment', filename=file_name)# 前2个参数意义未深究
msg.attach(attachment)
msg['From'] = _format_addr('发件人名称 <%s>' % from_addr)
msg['To'] = _format_addr('收件人名称 <%s>' % to_addrs)
msg['Subject'] = Header('邮件标题', 'utf-8').encode()
# 发送邮件
server = smtplib.SMTP_SSL(host=smtp_server, port=465)
server.login(from_addr, password)
server.sendmail(from_addr, to_addrs=to_addrs, msg=msg.as_string())
server.quit()
if __name__ == '__main__':
info='''
早上好,吃饭了吗~
aaa,bbb,ccc,ddd
'''
file_paths=['a.txt','b.txt','c.txt']
send_email(info,file_paths)
说明;1.这个脚本可以实现需求的功能,但是对于使用的两个方法MIMEBase()方法和add_header()方法中的参数是网上查来的,未进行深入研究,目前文本内容和文本附件是可以正常发送的,如果要发送图片内容和非文本附件,可能需要对这两个方法进行修改.
2.在同时发送文本内容和附件时,需要用msg.attch()方法来分别添加文本内容和多个附件,这与只发送文本邮件有区别
3.msg的构造方法也变为MIMEMultipart()方法.