Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python3:用QQ邮箱发送邮件

Python3:用QQ邮箱发送邮件

作者头像
py3study
发布于 2020-01-10 07:51:50
发布于 2020-01-10 07:51:50
5.2K00
代码可运行
举报
文章被收录于专栏:python3python3
运行总次数:0
代码可运行

1.     环境

操作系统

Win10

IDE

PyCharm Community 2018.1

Python

3.5

2.     设置QQ邮箱

    QQ邮箱是SSL认证的邮箱系统,要用QQ邮箱发送邮件,需要开启POP3/ SMTP服务,并获取授权码。

2.1  开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

    1)  打开QQ邮箱,点击【设置】

    2)在【账户】tab页,找到【POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务】,点击【开启】POP3/SMTP服务

2.1  QQ号申请第二代密码保护

    如果QQ号还没申请第二代密码保护,则会弹出【验证保密】对话框

     1)在【验证保密】对话框中,点击【申请密保】按钮

    2)  弹出【QQ安全中心】页面,点击【密保手机】右边的【设置】按钮

    3)  输入手机号码后,点击【确定】按钮,手机上会收到验证码

    4)输入手机上收到的验证码后,点击【确定】按钮

    5)  申请成功

2.3  继续开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

    1)  QQ号码申请第二代密保成功后,点击【验证密保】对话框中的【我已经完成设置】按钮

    2)  用手机往1069070069发送内容为【配置邮件客户端】的短信后,点击【我已发送】按钮

 3)  弹出【开启POP3/SMTP】对话框,其中的虚线框中就是授权码

2.4  获取授权码

    如果之前已经开启了POP3/SMTP服务,而已经忘了之前申请的授权码的话,可以点击下图中的【生成授权码】链接。

可以重新发送短信获取授权码。试了一下,旧授权码和新授权码都可以用。

3.     代码

    前面已经提到过,QQ邮箱是SSL认证的邮箱系统,因此用QQ邮箱发送邮件,需要创建一个SMTP_SSL对象,而不是SMTP对象,然后用发送邮箱及之前获取到的授权码login,最后调用sendmail()发送邮件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import smtplib

smtpserver = "smtp.qq.com"
smtpport = 465
from_mail = "aaaaa@qq.com"
to_mail = ["bbbbb@qq.com"]
password = "****************"   # 16位授权码

try:
    smtp = smtplib.SMTP_SSL(smtpserver,smtpport)
    smtp.login(from_mail,password)
    smtp.sendmail(from_mail,to_mail,msg.as_string())
except(smtplib.SMTPException) as e:
    print(e.message)
finally:
    smtp.quit()

用try-except-finally括起来,是为了捕捉可能的错误信息。

     这很简单,但细心的读者应该注意到,上面代码中所有的方法的参数都有定义,唯独sendmail(from_addr, to_addrs, msg)的第3个参数msg,即邮件的发送内容没有定义,而发送邮件的关键就在于此。发送内容的格式是SMTP规定的,如果不符合规定,即会导致邮件发送失败。 

    邮件主要包括三个部分:一是我称之为属性的部分,二是正文,三是附件。包含各部分内容的是一个MIMEMultipart对象,其实邮件的任何部分都是可以为空的,甚至都为空,还是可以成功发送的。下面主要讨论的就是这三部分内容的组织。

3.1  组织邮件属性

    邮件的属性,我指的是诸如发件人、主题、收件人、抄送等。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.mime.multipart import MIMEMultipart
from email.header import Header

subject = "test report"
from_name = "水云之外"
from_mail = "aaaaaa@qq.com"
to_mail = ["bbbbbb@qq.com"]
cc_mail = ["cccccc@qq.com"]

msg = MIMEMultipart()
msg["Subject"] = Header(subject, "utf-8")
msg["From"] = Header(from_name + " <" + from_mail + ">", "utf-8")
msg["To"] = Header(",".join(to_mail), "utf-8")
msg["Cc"] = Header(",".join(cc_mail), "utf-8")

3.2  组织邮件正文

3.2.1   文本格式正文

    用正文字符串生成一个plain类型的MIMEText对象,可指定编码,然后黏贴到代表邮件全部内容的MIMEMultipart对象中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

body = "hi, the attachment is the test report of this test, please check it in time."

msg = MIMEMultipart()
msgtext = MIMEText(body, "plain", "utf-8")
msg.attach(msgtext)

3.2.2   HTML格式正文

    HTML格式的正文和文本格式的正文,唯一区别就是MIMEText对象的类型不同,是html,当然正文字符串应该是一个符合html格式的字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

body = "<h3>hi, the attachment is the test report of this test, please check it in time.</h3>"

msg = MIMEMultipart()
msgtext = MIMEText(body, "html", "utf-8")
msg.attach(msgtext)

3.2.3   包含图片的正文

    包含图片的正文,其实是一种特殊的html格式正文,正文字符串应符合html格式,且包含img标签,指定src,用读入图片文件创建一个MIMEImage对象,指定其属性,应和src中相匹配,最后将MIMEImage对象也黏贴到MIMEMultipart对象中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage

imgbody = '''
<h3>hi, the attachment is the test report of this test, please check it in time.</h3>
<img src="cid:image1"/>
'''
imgfile = r"..\test\result.png"

msg = MIMEMultipart()
msgtext = MIMEText(imgbody, "html", "utf-8")
msg.attach(msgtext)

file = open(imgfile, "rb")
img = MIMEImage(file.read())
img.add_header("Content-ID", "<image1>")
msg.attach(img)

3.3  组织邮件附件

    经验证,文本文件、HTML文件和图片文件(png),都可以用下面的代码组装到邮件内容中。生成一个MIMEBase对象,读入附件文件加载到该对象中,编码、添加头后同样黏贴到MIMEMultipart对象中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase

attfile = r"..\test\result.html"

msg = MIMEMultipart()
att = MIMEBase("application", "octet-stream")
file = open(file, "rb")
att.set_payload(file.read())
encoders.encode_base64(att)

list = file.split("\\")
filename = list[len(list) - 1]
att.add_header("Content-Disposition", "attachment; filename='%s'" %filename)
msg.attach(att)

4.     最终代码

4.1  MailAssembler类

    包含三个方法:attachAttributes()、attachBody()和attachAttachment(),分别用来组装属性、正文和附件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email import encoders

class MailAssembler:
    def attachAttributes(self,msg,subject,from_name,from_mail,to_mail,cc_mail=None):
        msg["Subject"] = Header(subject, "utf-8")
        msg["From"] = Header(from_name + " <" + from_mail + ">", "utf-8")
        msg["To"] = Header(",".join(to_mail), "utf-8")
        msg["Cc"] = Header(",".join(cc_mail), "utf-8")

    def attachBody(self,msg,body,type,imgfile=None):
        msgtext = MIMEText(body, type, "utf-8")
        msg.attach(msgtext)

        if imgfile != None:
            try:
                file = open(imgfile, "rb")
                img = MIMEImage(file.read())
                img.add_header("Content-ID", "<image1>")
                msg.attach(img)
            except(Exception) as err:
                print(str(err))
            finally:
                if file in locals():
                    file.close()

    def attachAttachment(self,msg,attfile):
        att = MIMEBase("application", "octet-stream")

        try:
            file = open(attfile, "rb")
            att.set_payload(file.read())
            encoders.encode_base64(att)
        except(Exception) as err:
            print(str(err))
        finally:
            if file in locals():
                file.close()

        if "\\" in attfile:
            list = attfile.split("\\")
            filename = list[len(list) - 1]
        else:
            filename = attfile
        att.add_header("Content-Disposition", "attachment; filename='%s'" %filename)

        msg.attach(att)

4.2  MailSender类

    只有一个sendMail()方法,初始化的时候保存了发送的相关参数,之后就可以用该方法发送其参数msg了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import smtplib

class MailSender:
    def __init__(self,smtpserver,smtpport,password,from_mail,to_mail,cc_mail=None):
        self.smtpserver = smtpserver
        self.smtpport = smtpport
        self.password = password
        self.from_mail = from_mail
        self.to_mail = to_mail
        self.cc_mail = cc_mail

    def sendMail(self,msg):
        try:
            smtp = smtplib.SMTP_SSL(self.smtpserver, self.smtpport)
            smtp.login(self.from_mail, self.password)
            if self.cc_mail == None:
                smtp.sendmail(self.from_mail, self.to_mail, msg.as_string())
            else:
                smtp.sendmail(self.from_mail, self.to_mail+self.cc_mail, msg.as_string())
            print("successful")
        except(smtplib.SMTPRecipientsRefused):
            print("Recipient refused")
        except(smtplib.SMTPAuthenticationError):
            print("Auth error")
        except(smtplib.SMTPSenderRefused):
            print("Sender refused")
        except(smtplib.SMTPException) as e:
            print(e.message)
        finally:
            smtp.quit()

4.3  主程序

    在主程序中,调用了MailAssembler和MailSender的方法,完成邮件内容的组装和发送。邮件正文包含文字和图片,并有两个附件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from email.mime.multipart import MIMEMultipart
from src.MailContent import MailAssembler
from src.MailSender import MailSender

subject = "test report"
from_name = "水云之外"
from_mail = "aaaaaa@qq.com"
to_mail = ["bbbbbb@qq.com"]
cc_mail = ["cccccc@qq.com"]
imgbody = '''
<h3>hi, the attachment is the test report of this test, please check it in time.</h3>
<img src="cid:image1"/>
'''
file1 = r"..\test\result.html"
file2 = r"..\test\result.txt"
imgfile = r"..\test\result.png"

smtpserver = "smtp.qq.com"
smtpport = 465
password = "****************"     # 授权码

msg = MIMEMultipart()
assembler = MailAssembler()
sender = MailSender(smtpserver,smtpport,password,from_mail,to_mail,cc_mail)
assembler.attachAttributes(msg,subject,from_name,from_mail,to_mail,cc_mail)
assembler.attachBody(msg,imgbody,"html",imgfile)
assembler.attachAttachment(msg,file1)
assembler.attachAttachment(msg,file2)
sender.sendMail(msg)

5.     参考文献

[1] 使用python发送QQ邮件  https://www.cnblogs.com/lovealways/p/6701662.html

[2] Python发送邮件(常见四种邮件内容)https://blog.csdn.net/xiaosongbk/article/details/60142996

[3] Selenium3+python3-发送添加附件的邮件  https://www.cnblogs.com/liyanqi/p/7885014.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/07/31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python3实现自动发送邮件
首先了解SMTP(简单邮件传输协议),邮件传送代理程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件,而大多数的邮件发送服务器都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
用户9925864
2022/07/27
3820
Python3实现自动发送邮件
python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
  本篇文章与前边没有多大关联,就是对前边有关发邮件的总结和梳理。在写脚本时,放到后台运行,想知道执行情况,会通过邮件、SMS(短信)、飞信、微信等方式通知管理员,用的最多的是邮件。在linux下,Shell脚本发送邮件告警是件很简单的事,有现成的邮
北京-宏哥
2019/09/11
2.3K0
python接口自动化(三十二)--Python发送邮件(常见四种邮件内容)番外篇——上(详解)
Python3 使用smtplib和em
SMTP (Simple Mail Transfer Protocol)   邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
py3study
2020/01/03
5750
python email模块的使用实例
在使用python过程中,需要用的email模块来进行邮件的发送和接收,包含自定义邮件的中文、主题、日期、附件等信息,以下是我使用email模块来发送一个测试报告相关信息的邮件的例子:
py3study
2020/01/07
8410
python笔记3-发送邮件(smtplib)
前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件,可以发给多个收件人,专治各种不行,总之看完这篇麻麻再也不用担心我的邮件收不到了。 以下代码兼容python2和python3,
上海-悠悠
2018/04/08
1.2K0
python笔记3-发送邮件(smtplib)
[快学Python3]SMTP发送邮件
概述 在本文中,主要介绍使用smtplib进行文本格式、HTML格式和带附件的邮件发送处理。 导入smtplib模块 import smtplib 关键函数说明 # 创建smtp对象 smtp = smtplib.SMTP([host [, port [, localhost]]] ) # 参数说明 # host: smtp服务地址,例如126邮箱的是:smtp.126.com # port: smtp服务端口 # localhost: 如果你的smtp服务在本机,则只需指定localhost即可 #
苦叶子
2018/04/09
4.1K0
[快学Python3]SMTP发送邮件
python 七种邮件内容发送方法实例
一、文件形式的邮件 #!/usr/bin/env python3 #coding: utf-8 import smtplib from email.mime.text import MIMEText from email.header import Header sender = '***' receiver = '***' subject = 'python email test' smtpserver = 'smtp.163.com' username = '***' password = '**
小小科
2018/05/03
7250
Python实现自动发送邮件(详解)
这点很关键,别忘了去开启SMTP, 别忘了去开启SMTP,否则邮件是无法发送成功的 。然后你还需要点击下面生成授权码,这个授权码才是使用Python发送邮件时的真正密码。
全栈程序员站长
2022/11/17
1.2K0
Python实现自动发送邮件(详解)
python 使用stmp发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
py3study
2020/01/06
1.1K0
Python实现邮件发送
    RCPT 标识单个的邮件接收人;常在MAIL命令后面,可有多个rcpt to:
py3study
2020/01/07
7200
python发送邮件
文章目录 1. python发送邮件 1.1. 准备 1.1.1. smtplib 1.2. email 1.3. 普通文本邮件 1.4. 发送html邮件 1.5. 附件的发送 1.6. 将图片嵌入到正文信息中 python发送邮件 准备 python中发送邮件主要用的是smtplib和email两个模块,下面主要对这两个模块进行讲解 在讲解之前需要准备至少两个测试的邮箱,其中要在邮箱的设置中开启smtplib协议才可以进行发送和接受 smtplib smtplib.SMTP( [host
爱撒谎的男孩
2019/12/31
8500
python发送邮件
为了更好的理解邮件发送功能的实现,要先了解邮件发送系统的大致流程。首先  电子邮件之间的相互发送接受就像  邮局邮件发送一样,从一个站点(邮件发送服务器)到目的地站点(邮件接收服务器),然后目的地站点处理收到的邮件,并发送给接受人。每个邮件服务器即担任发送也担任接受邮件,并且每个服务器地址,端口号,配置等也不同。
用户1558882
2019/01/30
8160
python自动发邮件总结及实例说明
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用。smtplib模块主要负责发送邮件,email模块主要负责构造邮件。
周小董
2019/03/25
1.4K0
python自动发邮件总结及实例说明
Python模块学习--email
SMTP (Simple Mail Transfer Protocol)   邮件传送代理 (Mail Transfer Agent,MTA) 程序使用SMTP协议来发送电邮到接收者的邮件服务器。SMTP协议只能用来发送邮件,不能用来接收邮件。大多数的邮件发送服务器 (Outgoing Mail Server) 都是使用SMTP协议。SMTP协议的默认TCP端口号是25。
py3study
2020/01/10
1.6K0
python SMTP邮件发送
本例使用的时python2.7环境,python3的操作应该也是差不多的。 需要用到smtplib和email两个包。
py3study
2020/01/16
1.9K0
Python 发邮件
普通邮件 [root@localhost checksalt]# cat python_email.py  #!/usr/bin/python # -*- coding: utf-8 -*- import sys def smtp(title,file):     import smtplib     from email.mime.text import MIMEText     from email.header import Header           with open(file, 'r') 
py3study
2020/01/15
1.8K0
python发送邮件(二)——smtplib模块和email模块
一、模块介绍 1、smtplib 模块(用于邮件的发送) ①理论解释 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]]) 通过这个语句,可以向SMTP服务器发送指令,执行相关操作(如:登陆、发送邮件)。所有的参数都是可选的。 host:smtp服务器主机名 port:smtp服务的端口,默认是25;端口号可以省略。 但是使用25号端口有一个问题,就是保密性不够好,数据都是明文传输,没有加密。 现在一般都推荐使用SSL,Secure So
Elsa_阿尼
2021/07/27
5.9K0
python发送邮件(二)——smtplib模块和email模块
smtplib:Python使用QQ邮箱发送邮件
一般来说,每个App都有一个意见反馈功能。对于企业,其意见反馈自然是发送到其服务器上,而对于个人应用来说,因为使用的人相对较少,在初期推广的时候,可以将意见反馈设置成发送到自己邮箱,这样可以节约服务器的资源开销。
luckpunk
2023/09/29
1K0
smtplib:Python使用QQ邮箱发送邮件
python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)
  上一篇,我们虽然已经将生成的最新的测试报告发出去了,但是MIMEText 只能发送正文,无法带附件,因此我还需要继续改造我们的代码,实现可以发送带有附件的邮件。发送带附件的需要导入另外一个模块 MIMEMultipart。还有就是测
北京-宏哥
2019/09/11
2K0
python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)
Python发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
青阳
2021/11/26
9390
相关推荐
Python3实现自动发送邮件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验