环境准备说明
使用python3,用到了如下2个模块
- smtplib:负责发送邮件
- email:负责构造邮件
发送邮件使用的是SMTP协议,接受邮件则有POP3和IMAP协议
发送邮件
事前准备
发送邮件之前,需要具备的一些信息
- 邮件服务器,端口。(邮件服务器即SMTP服务器,端口,根据RFC协议,SMTP的默认端口为:25)
由于网络安全传输的原因,现在大多数SMTP均采用了SSL的链接方式,SSL的默认端口为465.
- 登陆用户名和密码
- 邮件内容
- 发送方邮件(From)
- 收件方邮件(To,Cc,Bcc)
- 邮件标题
- 邮件正文
- 附件
发送邮件
- 连接和登陆服务器
import smtplib #如果使用SSL,采用SMTP_SSL #ssl可以用Boolean值来表示是否采用SSL,func代表创建SMTP对象用哪个方法 func = smtplib.SMTP_SSL if ssl else smtplib.SMTP mysmtp = func(host,port) #创建了mysmtp的smtp对象 mysmtp.login(username,pwd) #登陆smtp服务器
上述代码:host我实际用的值:smtp.exmail.qq.com,port就是465 username是:xxx@QQ.com pwd是我的密码。
smtp服务器的地址你需要登陆相关邮件服务去找
- 设置邮件内容
from email.mime.multipart import MIMEMultipart #构造邮件内容
from email.utils import formataddr #构造发件人和收件人邮件地址和名称
from email.header import Header #构造邮件标题使用
from email.mime.text import MIMEText #构造邮件正文
from email.mime.base import MIMEBase #构造邮件附件
mime = MIMEMultipart() #构造一个Mime供邮件内容使用!
#设置邮件标题
mime['Subject'] = Header('邮件Title','utf-8') #设置title名称和编码
#formataddr会将邮件地址和名称自动处理为name<mailaddr@xx.com>的形式
#如果不填写邮件名称,那么默认显示邮件地址
mime['From'] = formataddr('myname','myaddr@addr.com')
#同理To和Cc和Bcc也是一样的,Bcc没有的化就不设置
mime['To'] = formataddr('myname','myaddr@addr.com')
mime['Cc'] = formataddr('myname','myaddr@addr.com')
mime['Bcc'] = formataddr('myname','myaddr@addr.com')
'''
因为From只会有1个,而to,cc,bcc可能会有多个,那么怎么设置呢?
实际上,在SMTP协议中,多个收件人地址是通过逗号来分割的,因此,
只需要将多个地址用逗号分隔即可解决该问题!
'''
#多地址用一个lst来存放,然后将lst里所有的内容用逗号拼接
for (name,addr) in mailaddr_list:
lst.append(formataddr(name,addr))
to_list_str = ','.join(lst)
mime['To'] = to_list_str
#邮件内容设置 邮件内容类型有plain,html等,这里默认使用html,编码还是utf-8
mime.attch(MIMEText('邮件内容','html','utf-8'))
#附件内容设置附件内容读取本地文件
att = MIMEText(open('c://attch.png','rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename='+'附件名'
att.add_header('Content-ID', '1')
mime.attach(att)
#发送邮件mysmtp就是上面通过SMTP_SSL生成的对象,然后设置收发件人的邮箱地址
mysmtp.sendmail('sender@mail.com', ['recv@mail.com','recv2@mail.com'], mime.as_string())
#发送完成后关闭
mysmtp.quit()
最后
我自己封装了一个mail的类,大家有兴趣可以去看看: https://github.com/cantahu/jhkit/blob/master/jhkit/mail.py