一、smtplib模块----负责配置信息,登入邮箱,发送邮件
- 创建SMTP的操作对象并连接smtp目标服务器
server = smtplib.SMTP(SMTP服务器,端口)
# eg : server = smtplib.SMTP(smtp.163.com,25) #163邮箱
- 登入邮箱账户
server.login(邮箱账户,密码)
#(自己的邮箱账户和邮箱授权码/密码(免费的邮箱,这里用授权码,一般自己公司的,直接写邮箱密码就行了)
- 发送邮件
server.sendmail(发送者,邮件接收者,msg.as_string())
#msg.as_string()中as_string()是将msg(MIMEText或MIMEMultipart对象)变为str。
- 断开SMTP服务
smtp.quit()
二、email模块
负责定义邮件标题、邮件内容(正文,附件,发送者,接收…)
三个重要模块
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
1. MIMEText -----邮件内容是纯文本
用法
① 创建文本邮件对象
text_email = MIMEText(正文内容,正文内容的类型)
'''
eg:
test_info = '这是邮件的正文内容'
text_email = MIMEText(text_info,'plain','utf-8')
'''
②邮件接收者,发送者,邮件标题
text_email['subject'] = Header('这是邮件标题','utf-8') #需要导入email.header.Header ()
text_email['From'] = sender # 发送者的邮箱地址
text_email['To'] = receiver
2. MIMEImage-----邮件内容是图片附件
用法
#1. 准备一张图片
image_file = open(r'D:\python_files\images\test.png', 'rb').read()
#2. 创建邮件对象
image_email = MIMEImage(image_file)
#3. 添加附件声明, 命名图片名称,传送附件时如果是中文名的文件
image.add_header('content-disposition','attachment',filename="red_people.png")
#
image["Content-Disposition"] = 'attachment; filename="red_people.png"'
#4. 邮件接收者,发送者,邮件标题
...
3. MIMEApplication-----邮件内容是任意附件
(不管什么类型的附件,都用MIMEApplication)
用法:跟 MIMEImage差不多,不详述
4. MIMEMultipart -----将多样的邮件内容添加到MIMEMultipart对象里,一起发送
用法
#1. 创建MIMEMultipart对象
email_content = MIMEMultipart('mixed') #邮件包含附件,图片,文本等都可以添加
email_content = MIMEMultipart('alternative') #邮件正文中包括纯文本正文(text/plain)和超文本正文(text/html)
email_content = MIMEMultipart('related') #邮件正文中包括图片,声音等内嵌资源
#2. 将构造内容添加到MIMEMultipart对象中,就可以把文本,html,附件等一起发送了
email_content.attach(MIMEText或者MIMEImage对象)
#eg: email_content.attach(image_email)
#eg: email_content.attach(text_email)
#3. 定义发送者,接收者,主题
msg['From'] = sender
msg['To'] = receiver
msg['subject'] = Header('The first email to you','utf-8')
PS:
发送邮件时,请确认:
1.确定邮箱已经开启smtp功能,并且确定是否开启授权码登录,如果开启则需要使用授权码登录。
2.确定邮箱端口port值是否正确,是465、587、25,或者邮箱系统定义的其他端口
3.确定邮箱支持的加密方式,以及不同加密方式对应的端口值正确与否。
可能出现的报错信息:
1.报错535:
未将POP3/SMTP服务开启。通过在163邮箱内 设置 获取授权码 打开,通过授权码可以进行第三方登录。此处的Password填写授权码。
2.报错554:
第一种情况:缺失发件人和主题,将msg[‘Subject’] msg[‘From’] msg[‘To’] 几行添加。
第二种情况:网络的问题。当家里的网络出现问题时,重启路由器或者切换成手机热点试试;当手机热点出现问题时,切换成家里的网络试试。
#完整代码
# -*- coding:utf-8 -*-
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.application import MIMEApplication
sender='Lcicada@163.com'
sender_password='******' #自己填写自己的
receiver='***@163.com'
server_port=25
server='smtp.163.com'
def send_email():
#email content is text
text=MIMEText('The first email','plain','utf-8')
#email attachment is image
image_file=open('C:\Users\chan.long\Desktop\desktop.png','rb').read()
image=MIMEImage(image_file)
image.add_header('Content-ID', '<image1>')
#email attachment is pdf_file
pdf_file=open('E:\Test\My documents\document\Guide Of Submitting app to productioon portal_2019.12.12.pdf','rb').read()
pdf=MIMEApplication(pdf_file)
pdf.add_header('Content-Disposition', 'attachment', filename='Guide.pdf')
msg=MIMEMultipart('mixed')
msg.attach(text)
msg.attach(image)
msg.attach(pdf)
msg['From']=sender
msg['To']=receiver
msg['subject']=Header('The first email to you','utf-8')
try:
smtp=smtplib.SMTP(server,server_port)
smtp.ehlo()
smtp.starttls()
smtp.login(sender,sender_password)
smtp.sendmail(sender,receiver,msg.as_string()) #MIMEMultipart('mixed').as_string() 会报554错误
smtp.quit()
print('send successfully')
except Exception as e:
print('send fail')
print(e)
if __name__ == '__main__':
send_email()