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

Python邮件发送(实战举例,复制可直接使用)

程序员文章站 2022-10-28 12:41:41
Python基础学习之邮件操作文章目录Python基础学习之邮件操作1. HTML格式邮件的发送2. 文本格式邮件的发送3. QQ邮箱异常解决4. 包含附件邮件的发送5. 包含附件邮件的发送6. 发生邮件的步骤总结6.1 导入对应的包;一般以下几个就完全够用了;6.2 建立smtplib.SMTP()对象;6.3 连接服务器 & 登陆邮箱; QQ邮箱密码参考本章的 ‘3. QQ邮箱异常解决’6.4 发送邮件;6.4.0 创建邮件对象实例:6.4.1 邮件对象中的发件人:6.4.2 邮件对象中的收件...

Python基础学习之邮件操作



1. HTML格式邮件的发送

以下实例为发送HTML格式的邮件,我们只需要变更调用函数时候的参数,即可完成邮件的发送;

#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Zhang Kai time:2020/10/12 # 使用其他邮件服务商的 SMTP 访问 import smtplib from email.mime.text import MIMEText from email.header import Header def sendMail(sender, mail_pass, receivers, mail_msg, mail_host='smtp.163.com'): # 定义发送邮件的函数; '''
    :param mail_user: 字符串格式:kai.zhang@unisemicon.com 发件人的邮箱
    :param mail_pass: 字符串格式:发件人邮箱密码
    :param receivers: 收件人列表;格式:['123@qq.com','234@qq.com','678@qq.com']
    :param mail_msg: 邮件的内容,HTML 的字符串格式
    :param mail_host: 设置服务器; 默认163邮箱; 举例:qq:smtp.qq.com; 163:smtp.163.com; 等
    :return: 返回值如下:
        1:代表邮件发送成功;
        2:代表邮件发送失败;
    ''' # 第三方 SMTP 服务 mail_host = "smtp.qq.com" # 设置服务器,qq:smtp.qq.com; 163:smtp.163.com; 等 sender = sender # 用户名 mail_pass = mail_pass # 密码 # 设置发件人 & 收件人 sender = sender # 发件人,这里设置成与用户名一致 receivers = receivers # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 # 邮件的内容,HTML 格式 mail_msg = mail_msg

    message = MIMEText(mail_msg, 'HTML', 'utf-8') # 三个参数:第一个为邮件内容;第二个 设置文本格式 plain为纯文本,HTML为HTML格式;第三个 utf-8 设置编码 message['From'] = sender
    message['To'] = ','.join(receivers) subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) return 1 # 邮件发送成功 except Exception: print(e.__class__.__name__) # 打印异常的名字 print(e) # 打印异常的详细信息 return 0 # "Error: 其他异常" # 定义邮件内容,HTML格式 mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p>
    """ # 调用函数 res = sendMail(sender="794532995@qq.com", mail_pass="12345678", receivers=['794532995@qq.com'], mail_msg=mail_msg, mail_host="smtp.unisemicon.com") # 打印返回值 print(res) 

2. 文本格式邮件的发送

只需要将上述代码中的 message = MIMEText(mail_msg, 'HTML', 'utf-8') 中的HTML 变为plain ,则邮件内容变为纯文本;
即修改为:message = MIMEText(mail_msg, 'plain', 'utf-8')

3. QQ邮箱异常解决

在使用QQ邮箱时,会遇到发送不成功的情况,错误信息提示如下:

(535, b'Login Fail. Please enter your authorization code to login. More information in http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256') 

解决方式如下:

先进入设置,按照以下流程操作。

  1. 登陆QQ邮箱,然后点击设置 ==> 帐户页面找到入口;
    Python邮件发送(实战举例,复制可直接使用)

  2. 点击POP3服务的开启;
    Python邮件发送(实战举例,复制可直接使用)

  3. 验证密保,用密保手机编辑短信,发送到指定号码,然后点击我已发送;
    Python邮件发送(实战举例,复制可直接使用)
    Python邮件发送(实战举例,复制可直接使用)

  4. 获取授权码,这里就是通过SMTP登陆QQ邮箱的密码;
    Python邮件发送(实战举例,复制可直接使用)
    修改完成后的代码如下:(可以直接复制,然后调用)

#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Zhang Kai time:2020/10/12 import smtplib from email.mime.text import MIMEText from email.header import Header def sendMail(sender, mail_pass, receivers, mail_msg, mail_host='smtp.qq.com'): # 第三方 SMTP 服务 mail_host = "smtp.qq.com" # 设置服务器,qq:smtp.qq.com; 163:smtp.163.com; 等 sender = sender # 用户名 mail_pass = mail_pass # 密码 # 设置发件人 & 收件人 sender = sender # 发件人,这里设置成与用户名一致 receivers = receivers # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 # 邮件的内容,HTML 格式 mail_msg = mail_msg

    message = MIMEText(mail_msg, 'HTML', 'utf-8') # 三个参数:第一个为邮件内容;第二个 设置文本格式 plain为纯文本,HTML为HTML格式;第三个 utf-8 设置编码 message['From'] = sender
    message['To'] = ','.join(receivers) subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) return 1 # 邮件发送成功 except Exception: print(e.__class__.__name__) # 打印异常的名字 print(e) # 打印异常的详细信息 return 0 # "Error: 其他异常" # 定义邮件内容 mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p>
    """ # 调用函数,这里的密码使用生成的密码; res = sendMail(sender="794532995@qq.com", mail_pass="********", receivers=['kai.zhang@unisemicon.com'], mail_msg=mail_msg, mail_host="smtp.qq.com") # 打印返回值 print(res) 

4. 包含附件邮件的发送

发送带附件的邮件,首先要创建MIMEMultipart()实例,然后构造附件,如果有多个附件,可依次构造,最后利用smtplib.smtp发送;只有mail_msg这个参数需要重新构造,其余无变化;代码参考如下:

#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Zhang Kai time:2020/10/12 import smtplib from email.mime.text import MIMEText from email.header import Header from email.mime.multipart import MIMEMultipart

mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p>
    """ sender="794532995@qq.com" mail_pass="pyelx****lkbfhj" receivers=['kai.zhang@unisemicon.com'] mail_msg=mail_msg
attach_file = 'test.txt' mail_host="smtp.qq.com" # 第三方 SMTP 服务 mail_host = "smtp.qq.com" # 设置服务器,qq:smtp.qq.com; 163:smtp.163.com; 等 sender = sender # 用户名 mail_pass = mail_pass # 密码 # 设置发件人 & 收件人 sender = sender # 发件人,这里设置成与用户名一致 receivers = receivers # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 # 创建一个带附件的邮件内容实例; message=MIMEMultipart() message['From'] = sender
message['To'] = ','.join(receivers) subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') # 增加邮件正文的内容,HTML 格式 mail_msg = mail_msg
message.attach(MIMEText(mail_msg, 'HTML', 'utf-8')) # 三个参数:第一个为邮件内容;第二个 设置文本格式 plain为纯文本,HTML为HTML格式;第三个 utf-8 设置编码 # 构造附件1,传入当前目录下的test.txt 文件,当前目录下必须要有test.txt文件; attach_file =attach_file
att1 = MIMEText(open(attach_file, 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 这里的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # 构造附件2,按照附件1 的方式,可以添加很多个附件; try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print('邮件发送成功') except Exception as e: print(e.__class__.__name__) # print(e) # print('邮件发送失败') 

备注:邮件一般在垃圾邮箱;

5. 包含附件邮件的发送

#!/usr/bin/env python # -*- coding: utf-8 -*- # author:Zhang Kai time:2020/10/13 import smtplib from email.mime.image import MIMEImage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header


sender="794532995@qq.com" mail_pass="pyelxrvvgclkbfhj" # 密码 receivers=['kai.zhang@unisemicon.com'] # 设置收件人 attach_file = 'test.txt' mail_host="smtp.qq.com" # 创建一个带图片的邮件内容实例:message; message=MIMEMultipart() # msgRoot = MIMEMultipart('related') message['From'] = sender # 给实例添加发件人 message['To'] = ','.join(receivers) # 给实例添加收件人 subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') # 给实例添加标题 msgAlternative = MIMEMultipart('alternative') # 创建带图片的内容 message.attach(msgAlternative) # 将内容添加到实例 mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p>
    <p>图片如下:</p>
    <p><img src="cid:image1"></p>
    <p><img src="cid:image2"></p>
""" msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 给内容增加邮件内容 # 指定图片为当前目录 fp = open('test.jpg', 'rb') msgImage = MIMEImage(fp.read()) # 将图片赋值给msgImage; fp.close() fp = open('test2.jpg', 'rb') msgImage2 = MIMEImage(fp.read()) # 将图片2赋值给msgImage; fp.close() # 定义图片 ID,在 HTML 文本中引用 msgImage.add_header('Content-ID', '<image1>') # 给图片添加标题 message.attach(msgImage) # 给实例添加图片 msgImage2.add_header('Content-ID', '<image2>') # 给图片添加标题 message.attach(msgImage2) # 给实例添加图片 try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print('邮件发送成功') except Exception as e: print(e.__class__.__name__) # print(e) # print('邮件发送失败') 

结果:
Python邮件发送(实战举例,复制可直接使用)

6. 发生邮件的步骤总结

6.1 导入对应的包;一般以下几个就完全够用了;

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

6.2 建立smtplib.SMTP()对象;

smtpObj = smtplib.SMTP() # 创建邮件对象 

6.3 连接服务器 & 登陆邮箱; QQ邮箱密码参考本章的 ‘3. QQ邮箱异常解决’

mail_host = "smtp.qq.com" # 取决于发送邮件的邮箱是什么; smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(sender, mail_pass) # sender:发件人的邮箱; mail_pass:邮箱对应的密码;QQ邮箱密码参考本章的 3. QQ邮箱异常解决 

6.4 发送邮件;

发送邮件的语句如下,包括三个参数:sender, receivers, message.as_string();构建完成message参数后,使用以下语句就可以实现发送邮件的功能;

smtpObj.sendmail(sender, receivers, message.as_string()) 

参数解释:

  • sender: 就是发件人,直接定义即可,例如:sender="794532995@qq.com"
  • receivers: 就是收件人,列表直接定义即可,例如:receivers=['kai.zhang@unisemicon.com','794532995@qq.com']
  • message: 就是邮件内容;邮件内容稍微复杂,需要先创建邮件对象实例,然后向实例中添加:发件人,收件人,主题,正文,附件;

6.4.0 创建邮件对象实例:

message=MIMEMultipart() # 创建邮件对象实例,然后向实例中添加发件人,收件人,主题,正文,附件; 

6.4.1 邮件对象中的发件人:

message['From'] = '794532995@qq.com' 

6.4.2 邮件对象中的收件人:

message['To'] = ','.join(receivers) # 其中:receivers=['kai.zhang@unisemicon.com','794532995@qq.com'] 是一个收件人列表; 

6.4.3 邮件对象中的主题:

subject = 'Python SMTP 邮件测试' message['Subject'] = Header(subject, 'utf-8') # 给实例添加标题 

6.4.4 邮件对象中的正文:

# 生成一个只有文本(或者HTML)的正文对象,然后添加到message中; mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p>
    """ message.attach(MIMEText(mail_msg, 'HTML', 'utf-8')) 

6.4.5 邮件对象中的包含图片的正文:

# 创建一个带图片的邮件内容,然后添加到message中; msgAlternative = MIMEMultipart('alternative') # 创建带图片的内容 message.attach(msgAlternative) # 将内容添加到实例 mail_msg = """
    <p>Python 邮件发送测试...</p>
    <p><a href="http://172.21.21.8:8000/">这是一个内部查询系统的链接</a></p>
    <p>图片如下:</p>
    <p><img src="cid:image1"></p>
    <p><img src="cid:image2"></p>
""" msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8')) # 给内容增加邮件HTML文本 # 指定图片为当前目录,然后打开图片文件,赋值给 msgImage; fp = open('test.jpg', 'rb') msgImage = MIMEImage(fp.read()) # 将图片1 赋值给msgImage; fp.close() msgImage.add_header('Content-ID', '<image1>') # 给图片1添加标题 message.attach(msgImage) # 给实例添加图片 

6.4.6 邮件对象中的附件:构造附件对象,然后添加到message中;

# 构造附件1,传入当前目录下的test.txt 文件 attach_file = 'test.txt' att1 = MIMEText(open(attach_file, 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # 下面的filename可以任意写,写什么名字,邮件中显示什么名字 att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) 

本文地址:https://blog.csdn.net/weixin_47139649/article/details/109032020