欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)

程序员文章站 2022-05-18 23:09:28
...

Python实现电子邮件发送

在生活中或许我们多数都在用微信或者是QQ,但是工作中就会涉及邮件了,我也是最近在工作中用到了,所以找了些资料,有的较为完备有的就特别零散,所以自己也来整理分享一下。这里主要整理关于SMTP模块的邮件发送。
smtplib官网

SMTP(Simple Mail Transfer Protocol) 即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式.

下面大概讲述一下SMTP发送邮件的流程:

  1. 连接服务器
  2. 登录
  3. 发送服务请求
  4. 退出

SMTP服务开启以授权码获取

想要进行邮件的发送操作,首先要搞清楚发件的邮箱的 SMTP 服务器地址和加密方式,当然别忘了打开 SMTP 服务。这里以qq邮箱和163邮箱为例子:
登录邮箱进入设置:
Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)
进入设置之后,选择账户,往下拉一点儿就可以看到各个服务了:
Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)
跟着他的步骤走就收到一个授权码,这个授权码是用于后面邮箱登录的,要保存下来哦
Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)
设置好了还要获取授权码:
Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)
如果忘记了授权码就重设授权码。
Python邮件发送SMATP模块详细总结(含qq邮箱及163邮箱服务开启及授权码获取,多附件发送)
163邮箱是可以自己设置授权码的。

Python中SMTP使用

由于腾讯企业邮箱使用 SSL 加密方法,因此需要调用 smt­plib 的 SMTP_SSL() 方法并提供 465 端口号。

login() 用于登陆到 SMTP 服务器,第一个参数为邮件地址,第二个参数为密码(亲测为授权码)。login()的返回码

 # 235 == 'Authentication successful'
 # 503 == 'Error: already authenticated'
import smtplib
 
#定义输入信息
from_email = r'填发送的邮箱'
password = r'填授权码'
to_email = r'发送邮箱的地址'
smtp_ssl = 'smtp.'+from_email.split('@')[-1]#自动去适配邮箱的smtp
smtp_ssl_num =465#看情况修改
# 连接 SMTP 服务器并登陆
smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
status = smtp.login(from_email,password)
print(status)
print(type(status))
print('状态:',status[1])

输出结果:

(235, b'Authentication successful')
<class 'tuple'>
状态: b'Authentication successful'

这样就成功连接到服务器了。

加密SMTP

使用标准的25端口连接SMTP服务器时,使用的是明文传输,为了安全起见,要更安全地发送邮件,可以加密SMTP会话,就是先创建SSL安全连接,然后再使用SMTP协议发送邮件。

邮件服务商 SMTP SSL加密端口
qq. smtp.qq.com 465或587
网易 smtp.163.com 465或994

构建邮件主体

邮件格式遵循一定的规范,MIME(多用途互联网邮件扩展类型)。如果对此不熟悉,也没有关系,我们使用 Python 内置的 email 模块中的 MIME 模块来构建一个文本邮件对象。

import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
#定义输入信息
from_email = r'填发送的邮箱'
password = r'填授权码'
to_email = r'发送邮箱的地址'
smtp_ssl = 'smtp.'+from_email.split('@')[-1]#自动去适配邮箱的smtp
smtp_ssl_num =465

# 构建要发送的邮件内容
 text = '正文内容'
title = '我是标题'

m = MIMEText(text, 'plain', 'utf-8')
m['Subject'] = Header(title, 'utf-8')
m['From'] = Header(from_email, 'utf-8')
m['To'] = Header(to_email, 'utf-8')

try:
    smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
    smtp.login(fromaddr,password)
    smtp.sendmail(from_email, to_email, m.as_string())
    print('success')
    smtp.close()#关闭连接
except smtplib.SMTPException as e:
    print('error:',e) #打印错误

注意:连接上了,操作结束后要关闭连接。

发送带多附件的邮件

发送各种带附件的邮件

使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。

MIME有很多种类型,比较麻烦,如果附件是:

  • 图片格式,用MIMEImage,
  • 音频,要用MIMEAudio,
  • word、excel,我都不知道该用哪种MIME类型

如果想偷懒就不管什么类型的附件,都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。

看代码你就明白了:

import smtplib
from email.mime.text import MIMEText#用于发送纯文本或者HTML
from email.mime.image import MIMEImage#用于发送图片
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication #万能附件发送
 
from_email = r'填发送的邮箱'
password = r'填授权码'
to_email = r'发送邮箱的地址'
smtp_ssl = 'smtp.' + from_email.split('@')[-1]#自动去适配邮箱的smtp
smtp_ssl_num =465
title = '送给宝贝的一封信'
content = '正文信息:我给你发了许多附件,请查收!.'
textApart = MIMEText(content)
#正文文字无需通过add_header加入到
 
imageFile = r'E:/emailtest/test.jpg'
imageApart = MIMEImage(open(imageFile, 'rb').read(), imageFile.split('.')[-1])
imageApart.add_header('Content-Disposition', 'attachment', filename=imageFile.split('/')[-1])
 
pdfFile = r'E:/emailtest/《Python进阶》.pdf'
pdfApart = MIMEApplication(open(pdfFile, 'rb').read())
pdfApart.add_header('Content-Disposition', 'attachment', filename=('gbk','',pdfFile.split('/')[-1]))
    
zipFile = r'E:/emailtest/《Python进阶》.zip'
zipApart = MIMEApplication(open(zipFile, 'rb').read())
zipApart.add_header('Content-Disposition', 'attachment', filename=('gbk','',zipFile.split('/')[-1]))
 
m = MIMEMultipart()
m.attach(textApart)#加入正文信息
m.attach(imageApart)#加入图片
m.attach(pdfApart)#加入pdf
m.attach(zipApart)#加入压缩包
m['Subject'] = Header(title, 'utf-8')
m['From'] = Header(from_email, 'utf-8')
m['To'] = Header(to_email[i], 'utf-8')
  
try:
    smtp = smtplib.SMTP_SSL(smtp_ssl, port=smtp_ssl_num)
    smtp.login(from_email,password)
    smtp.sendmail(from_email, to_email, m.as_string())
    print('successful')
    smtp.quit()
except smtplib.SMTPException as e:
    print('error:',e) #打印错误

其中filename=('gbk','',zipFile.split('/')[-1])是为了避免显示出现乱码情况而加入的,如果gbk还是乱码可以试试utf-8,我的用gbk没有问题。

写在最后

希望你看了能够有所收获,不用要那么多弯路。接触到python邮件发送是因为工作中需要编写一个exe给别的程序去调用,所以查了些资料,然后整理了一下有空就分享一下。下一篇博客再把多人接受多附件的邮件发送python脚本分享出来(要去看看哦,可以封装成为exe然后通过cmd命令行就可以调用了,当然参数是可以自定义的啦)。