关于python的smtplib库调用QQ邮箱服务器'smtp.qq.com'发送邮件的一些问题及解决

关于python的smtplib库调用QQ邮箱服务器'smtp.qq.com'发送邮件的一些问题及思考

  • 1.运行成功的代码与测试效果
  • 2.结论

1.运行成功的代码与测试效果

首先展示一下使用SMTP发送QQ邮件的代码,如下所示:

import smtplib
from email.mime.text import MIMEText #邮件正文文本
from email.mime.multipart import MIMEMultipart #邮件多个部分组成(如:正文、图片、音频、附件文档)
from email.mime.image import MIMEImage #邮件图片
from email.header import Header #邮件抬头
# smtplib 用于邮件的发信动作,email 用于构建邮件内容

from_addr= input('输入你的邮箱')
password =input('输入你的qq邮箱第三方授权码')# QQ 邮箱授权码,需要登录qq邮箱并开通此服务(POP3/SMTP服务)
to_addr = input(‘输入收件人邮箱’)
smtp_server = 'smtp.qq.com'# QQ邮箱服务器


msg = MIMEMultipart('related')#实例化
text='''图
                  片'''
content = MIMEText(text,'plain','utf-8')# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg.attach(content)#加文本
msg['From'] = Header('zou')#加发件人
msg['To'] = Header(','.join(to_addr))#加收件人
msg['Subject'] = Header('haowan')#加邮件主题
with open('C:/Users/zouya/Pictures/Saved Pictures/猫宁.png','rb') as f:
    img_data=f.read()
img=MIMEImage(img_data)#打开并读取图片二进制信息
img.add_header('content-disposition', 'attachment', filename='maoning.png')#添加附件图片文件名等信息
msg.attach(img)#加图片

    

**server = smtplib.SMTP()# 开启发信服务,实例化邮件服务器
server.connect(smtp_server,25)#这里端口是常用常规端口25**
server.login(from_addr, password)# 登录发信邮箱
server.sendmail(from_addr, to_addr, msg.as_string())# 发送邮件
print("邮件发送成功")
server.quit()# 关闭服务器
import smtplib
from email.mime.text import MIMEText #邮件正文文本
from email.mime.multipart import MIMEMultipart #邮件多个部分组成(如:正文、图片、音频、附件文档)
from email.mime.image import MIMEImage #邮件图片
from email.header import Header #邮件抬头
# smtplib 用于邮件的发信动作,email 用于构建邮件内容

from_addr= input('输入你的邮箱')
password =input('输入你的qq邮箱第三方授权码')# QQ 邮箱授权码,需要登录qq邮箱并开通此服务(POP3/SMTP服务)
to_addr = input(‘输入收件人邮箱’)
smtp_server = 'smtp.qq.com'# QQ邮箱服务器


msg = MIMEMultipart('related')#实例化
text='''图
                  片'''
content = MIMEText(text,'plain','utf-8')# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg.attach(content)#加文本
msg['From'] = Header('zou')#加发件人
msg['To'] = Header(','.join(to_addr))#加收件人
msg['Subject'] = Header('haowan')#加邮件主题
with open('C:/Users/zouya/Pictures/Saved Pictures/猫宁.png','rb') as f:
    img_data=f.read()
img=MIMEImage(img_data)#打开并读取图片二进制信息
img.add_header('content-disposition', 'attachment', filename='maoning.png')#添加附件图片文件名等信息
msg.attach(img)#加图片

    

server = smtplib.SMTP_SSL(smtp_server)# 开启发信服务,实例化服务器,这里使用的是加密传输
**server.connect(smtp_server,465)#连接服务器,注意端口是465!
server.login(from_addr, password)# 登录发信邮箱**
server.sendmail(from_addr, to_addr, msg.as_string())# 发送邮件
print("邮件发送成功")
server.quit()# 关闭服务器

关于python的smtplib库调用QQ邮箱服务器'smtp.qq.com'发送邮件的一些问题及解决_第1张图片
若上面第二块代码加粗部分改为如下:

**server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)**
则会报错:ValueError: server_hostname cannot be an empty string or start with a leading dot. 意思是服务器名字不能是空字符或以'.'开头的字符,所以表明调用SMTP_SSL()方法实例化服务器时必须导入服务器名参数smtp_server(smtp_server = 'smtp.qq.com')

若继续改动第二块代码加粗部分为如下:
**server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,25)**
会报错:SSLError: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1056) ,字面意思像是端口号使用错误的意思,所以表明SMTP_SSL()实例化的服务器在使用connect时一定要用465端口号,而SMTP()实例化的服务器则使用25端口号。

2.结论

smtplib.SMTP()  与 smtplib.SMTP_SSL() 都可以开启邮箱服务器(实例化),后者是加密服务。前者在实例化时不需要传入服务器名,如server = smtplib.SMTP(),后者在实例化时必须出入服务器名,如server = smtplib.SMTP_SSL(smtp_server);同时,前者使用端口号为25,后者使用端口号为465,两者端口号不能交叉使用。

你可能感兴趣的:(python)