Python_smtplib、email模块 简单邮件发送

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件。

前期准备工作

在我们实现代码之前我们要进入邮箱开启smtp服务,以qq邮箱为例,进入设置>账户>开启smtp服务,并获取到授权码。如图
在这里插入图片描述

1.安装smtplib和email模块

# Date: 2021/12/14 10:36

pip install smtplib
pip install email

2.发送简单纯文本邮件

# Date: 2021/12/14 10:36

import smtplib
from email.mime.text import MIMEText #设置邮件正文
from email.mime.header import Header #设置邮件头

# 登陆smtp服务器
mail_obj = smtplib.SMTP("smtp.qq.com",25) #设置服务器 端口号
mail_obj.login("账号","口令") # 发送邮件的邮箱地址和授权码

# 设置发送邮箱和收件邮箱 此处可不定义 直接写入mail_obj.sendmail()
mail_user = "账号"
mail_receivers = ["收件箱1","收件箱2","收件3"]	# 收件人可以设置多个

# 邮件内容
mail_msg =MIMEText("邮件文本","plain","utf-8") # 邮件文本  类型  编码
mail_msg["From"] = Header("设置发件人","utf-8")  #  发件人  编码
mail_msg["To"] = Header("设置收件人","utf-8")  # 收件人 编码
mail_nsg["Subject"] = Header("设置主题","utf-8") # 主题 编码

# 发送邮件
mail_obj.sendamil(mail_user,mail_receivers,mail_msg.as_string())

注:至此相信你已经掌握基本语法了,以下内容将使用实例并以不同的方式实现

3.发送HTML格式的邮件

# Date: 2021/12/14 11:06

import smtplib  
from email.mime.text import MIMEText  
from email.header import Header  
  
mail_host = "smtp.qq.com" # 设置服务器  
mail_user = "[email protected]" # 发件人  
mail_pass = "pslsjnuctyfmb****" # 口令  
mail_receivers = ["[email protected]","[email protected]"]  # 收件人邮箱 

# 邮件内容
mail_msg = """  
<p>Python HTML邮件发送测试...</p>  
<p><a href="http://www.baidu.com">百度一下,你就知道</a></p>  
"""  
mail_msg = MIMEText(mail_msg,"html","utf-8")  
mail_msg["From"] = Header("Alex","utf-8")  
mail_msg["To"] = Header("handsome boy","utf-8")  
mail_msg["Subject"] = Header("Python HTML邮件发送测试","utf-8")  
  
# 发送邮件  
smtp_Obj = smtplib.SMTP()  
smtp_Obj.connect(mail_host, 25)   
smtp_Obj.login(mail_user, mail_pass)  
smtp_Obj.sendmail(mail_user,mail_receivers,mail_msg.as_string())

4.发送带图片的HTML格式邮件

# Date: 2021/12/14 11:37

import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage  
from email.mime.multipart import MIMEMultipart
from email.mime.header import Header

# 登陆smtp服务器
mail_obj = smtpilb.SMTP("smtp.qq.com",25)
mail_obj.login("[email protected]","pslsjnuctyfm****")

# 设置收发件邮箱
mail_suer = "[email protected]"
mail_receivces = [752216116@qq.com","76107382@qq.com]

# 设置邮件主体
mail_msg =  MIMEMultipart(‘alternative’) # 表示邮件由多部分组成
mail_msg["From"] = Header("Alex","utf-8")
mail_msg["To"] = Header("Handsome Boy","utf-8")
mail_msg["Subject"] = Header("Python 邮件测试","utf-8")

# 设置邮件内容 
mail_str = """
<h1 align="center">HTML中的图片邮件</h1>  
<P align="center">人生苦短,我用Python</p>  
<p align="center">插入一张图片:</p>  
<p align="center"><img src="cid:image1"></p> 
"""
mail_msg.attach(MIMEText(mail_str,"html","utf-8"))

with open("py_2.jpg","rb") as f:
	msgImage = MIMEImage(f.read())  
	f.close()  
  
msgImage.add_header('Content-ID', '<image1>')  
msgRoot.attach(msgImage)  
  
# 发送邮件  
mail_obj.sendmail(mail_user,receivers,mail_msg.as_string())

5.发送带各种附件的邮件

# Date: 2021/12/14 13:17

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.mime.header import Header

# 登陆smtp服务器
mail_obj = smtpilb.SMTP("smtp.qq.com",25)
mail_obj.login("[email protected]","pslsjnuctyfm****")

# 设置收发件邮箱
mail_suer = "[email protected]"
mail_receivces = [752216116@qq.com","76107382@qq.com]

# 设置邮件主体
mail_msg =  MIMEMultipart()  # 表示邮件由多部分组成
mail_msg["From"] = Header("Alex","utf-8")
mail_msg["To"] = Header("Handsome Boy","utf-8")
mail_msg["Subject"] = Header("Python 邮件测试","utf-8")

# 添加附件,当前目录下的py_test.txt
att1 = MIMEApplication(open("py_test.txt", "rb").read(), "base64")  
att1["Content-Type"] = "application/octet-stream" # 二进制流数据(如常见的文件下载)此处可省略这一行 因为MIMEApplication默认子类型是application/octet-stream  
att1["Content-Disposition"] = 'attachment; filename="py_test.txt"' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字  
msg.attach(att1)  
    
# 发送邮件  
smtp_obj.sendmail(mail_suer,receivers,msg.as_string())

注:本例使用的是最简单的方式,不管是什么附件类型都用MIMEApplication,MIMEApplication默认子类型是application/octet-stream。
application/octet-stream表明“这是个二进制的文件,接收方知道怎么处理”,然后客户端,比如qq邮箱,收到这个声明后,会根据文件扩展名来猜测。

总结

  1. smtplib()方法的使用说明
    ①connect(host,port)方法参数说明

       host:指定连接的邮箱服务器  
       port:指定连接的服务器端口 
    

    ②login(user,password)方法参数说明

       user:登录邮箱用户名  
       password:登录邮箱密码  
    
  2. sendmail(from-addr,to_addrs,msg…)方法参数说明

       from_addr:邮件发送者地址  
       to_addrs:字符串列表,邮件发送地址  
       msg:发送消息  
    
  3. quit():结束当前会话

  4. 更多
    SMTP.set_debuglevel(level) 设置输出debug调试信息,默认不输出
    SMTP.docmd(cmd[, argstring]) 发送一个命令到SMTP服务器
    SMTP.connect([host[, port]]) 连接到指定的SMTP服务器
    SMTP.helo([hostname]) 使用helo指令向SMTP服务器确认你的身份
    SMTP.ehlo(hostname) 使用ehlo指令像ESMTP(SMTP扩展)确认你的身份
    SMTP.ehlo_or_helo_if_needed() 如果在以前的会话连接中没有提供ehlo或者helo指令,这个方法会调用ehlo()或helo()
    SMTP.has_extn(name) 判断指定名称是否在SMTP服务器上
    SMTP.verify(address) 判断邮件地址是否在SMTP服务器上
    SMTP.starttls([keyfile[, certfile]]) 使SMTP连接运行在TLS模式,所有的SMTP指令都会被加密
    SMTP.login(user, password) 登录SMTP服务器
    SMTP.sendmail(from_addr, to_addrs, msg, mail_options=[], rcpt_options=[])
    发送邮件
    from_addr:邮件发件人
    to_addrs:邮件收件人
    msg:发送消息
    SMTP.quit() 关闭SMTP会话
    SMTP.close() 关闭SMTP服务器连接
    我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,
    sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。

  5. 发送送不同格式的附件时:

基本思路就是,使用MIMEMultipart来标示这个邮件是多个部分组成的,然后attach各个部分。如果是附件,则add_header加入附件的声明。
在python中,MIME的这些对象的继承关系如下。
MIMEBase
|-- MIMENonMultipart
|-- MIMEApplication
|-- MIMEAudio
|-- MIMEImage
|-- MIMEMessage
|-- MIMEText
|-- MIMEMultipart
一般来说,不会用到MIMEBase,而是直接使用它的继承类。MIMEMultipart有attach方法,而MIMENonMultipart没有,只能被attach。MIME有很多种类型,这个略麻烦,如果附件是图片格式,要用MIMEImage,如果是音频,要用MIMEAudio,如果是word、excel,我现在也不知道该用哪种MIME类型,得去查。因此例5使用的了较为简单的方式。

多有不足,敬请大佬批评指正!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>