python自动发送邮件
一开始代码:
# 导入相关库
import smtplib
from email.header import Header
from email.utils import parseaddr, formataddr
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 构建一个类用来处理格式化文本
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def setSMTP():
# 设置SMTP授权码
smtp_password = input('请输入你的邮箱的smtp授权码:')
return smtp_password
def setServer():
# 输入SMTP服务器地址
smtp_server = 'smtp.qq.com'
# 设置SMTP的加密端口465
server = smtplib.SMTP_SSL(smtp_server, 465)
return server
def sendEmail():
# 设置发件人
email_from = input('请输入发件人的邮箱号码:')
# 设置收件人
email_to = input('请输入收件人的邮箱号码:')
# 设置发件人、收件人、标题、正文
msg = MIMEText('这是一条python自动发送邮件测试邮件.....', 'plain', 'utf-8')
msg['subject'] = Header(u'python自动发送邮件测试', 'utf-8').encode()
msg['from'] = _format_addr(email_from + '<%s>' % email_from)
msg['to'] = _format_addr(email_to + '<%s>' % email_to)
try:
# 登录邮箱
setServer().login(email_from, setSMTP())
# 发送邮件
setServer().sendmail(email_from, [email_to], msg.as_string())
print('发送成功')
except Exception as error:
print(f'异常原因:{error}')
# 退出发送
setServer().quit()
if __name__ == '__main__':
sendEmail()
# print('发送成功.....')
运行以后出现如下错误:
出现了一个503错误,于是我上网查了查503错误,结果如下:
说是由于临时的服务器维护或过载无法处理请求,于是我去注册了一个163邮箱,并上网查了163邮箱的服务器地址和ssl协议端口,具体的地址和端口如下:添加链接描述
遇到如下错误,好家伙又遇到错误了,不方,咱们遇到问题就去解决,所以我上网查了553错误,错误的大概意思是需要身份验证,出现这种错误大多是因为用户名密码或端口的问题,ssl协议端口有两个465和994两个都用了都出现了553错误,所以我想不是端口问题,那就只有用户名密码了,所以我觉得是代码问题。
问了一些朋友以后发现了问题,原因如下:
def setServer():
# 输入SMTP服务器地址
smtp_server = 'smtp.qq.com'
# 设置SMTP的加密端口465
server = smtplib.SMTP_SSL(smtp_server, 465)
return server
try:
# 登录邮箱
setServer().login(email_from, setSMTP())
# 发送邮件
setServer().sendmail(email_from, [email_to], msg.as_string())
print('发送成功')
except Exception as error:
print(f'异常原因:{error}')
# 退出发送
setServer().quit()
主要是因为上面写了一个setServer函数,然后下面在登录邮箱的时候调用了3次setServer函数,每一次调用都是新的端口,所以在第二次调用时没有登录,所以就会在使用QQ邮箱的时候报503错误,出现服务器不可访问的问题,在使用163邮箱的时候出现553错误,需要验证身份,因为没有登录。其实这也是一些基础的东西,函数调用一次,就会产生一个新的值,再调用一次就会又产生一个新的值。
最后的整体代码如下,
# 导入相关库
import smtplib
from email.header import Header
from email.utils import parseaddr, formataddr
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 构建一个类用来处理格式化文本
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))
def setSMTP():
# 设置SMTP授权码
smtp_password = input('请输入您的授权码:')
return smtp_password
def setServer():
# 输入SMTP服务器地址
smtp_server = 'smtp.qq.com'
# 设置SMTP的加密端口465
server = smtplib.SMTP_SSL(smtp_server, 465)
return server
def sendEmail():
# 设置发件人
email_from = input('请输入发件人的邮箱号:')
# 设置收件人
email_to = input('请输入收件人的邮箱号:')
content = '这是一封python自动发送邮件测试邮件....'
# 添加正文
textApart = MIMEText(content)
excelfile = 'test.xlsx'
# 打开附件
part = MIMEApplication(open(excelfile, 'rb').read())
# 修改附件名
part.add_header('Content-Disposition', 'attachment', filename=excelfile)
m = MIMEMultipart()
# 添加附件和文本
m.attach(part)
m.attach(textApart)
# 设置发件人、收件人、标题、
m['subject'] = Header(u'python自动发送邮件测试邮件', 'utf-8').encode()
m['from'] = _format_addr(email_from + '<%s>' % email_from)
m['to'] = _format_addr(email_to + '<%s>' % email_to)
try:
# 登录邮箱
server = setServer()
server.login(email_from, setSMTP())
# 发送邮件
server.sendmail(email_from, [email_to], m.as_string())
# 退出发送
server.quit()
print('发送成功....')
except Exception as error:
print(f'异常原因:{error}')
if __name__ == '__main__':
sendEmail()