转载请表明出处:https://www.cnblogs.com/shapeL/p/9115887.html

1.发送QQ邮件,首先必须知道QQ邮箱的SMTP服务器

http://service.mail.qq.com/cgi-bin/help?id=28&no=167&subtype=1

2.发送邮件之前,必须开启qq邮箱的smtp服务

设置路径:邮箱设置--账户--开启截图服务--保存更改

3.代码抛出异常分析

(1)邮箱密码传入值为日常登录密码,报错

global send_user
global email_host
global password password = 'xxx92'
email_host = "smtp.qq.com"
send_user = "11xxx@qq.com"

抛出异常:

smtplib.SMTPAuthenticationError:(535, b'Error: \xc7\xeb\xca\xb9\xd3\xc3\xca\xda\xc8\xa8\xc2\xeb\xb5\xc7\xc2\xbc\xa1\xa3\xcf\xea\xc7\xe9\xc7\xeb\xbf\xb4: http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256')

打开抛出异常中的链接:是关于授权码的介绍,根据介绍,登录时应该使用授权码作为登录密码,该处的授权码是开启服务时收到的16位授权码

http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

修改代码:

password = "lunkbrgwqxhfjgxx"(对应的16位授权码)

(2)安全邮件,需要通过SSL发送

server = smtplib.SMTP()
server.connect(email_host,25)

抛出异常:

smtplib.SMTPServerDisconnected: Connection unexpectedly closed

QQ邮箱是支持安全邮件的,需要通过SSL发送的邮件:使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件

修改代码:

server = smtplib.SMTP_SSL()
server.connect(email_host,465)# 启用SSL发信, 端口一般是465

4.附上完整代码

#coding:utf-8
import smtplib
from email.mime.text import MIMEText class SendEmail:
global send_user
global email_host
global password
password = "lunkbrgwqxhfjgxx"
email_host = "smtp.qq.com"
send_user = "11xx@qq.com" def send_mail(self,user_list,sub,content):
user = "shape" + "<" + send_user + ">"
message = MIMEText(content,_subtype='plain',_charset='utf-8')
message['Subject'] = sub
message['From'] = user
message['To'] = ";".join(user_list)
server = smtplib.SMTP_SSL()
server.connect(email_host,465)
server.login(send_user,password)
server.sendmail(user,user_list,message.as_string())
server.close() if __name__ == '__main__':
send = SendEmail()
user_list = ['11xx@qq.com']
sub = "测试邮件"
content = "ceshi看看"
send.send_mail(user_list,sub,content)

(1)Python对SMTP支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件

(2)构造MIMEText对象时,第一个参数是邮件正文;第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain';最后一定要用utf-8编码保证多语言兼容性

(3)发送的邮件需要添加头部信息,头部信息中包含发送者、接收者、邮件主题等信息:message['From']、message['To']、message['Subject']

(4)构造完要发送的邮件信息后,通过SMTP发出去:login()方法用来登录SMTP服务器;sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list;邮件正文是一个str,as_string()把MIMEText对象变成str

(5)SMTP.close() :关闭SMTP服务器连接

5、发送邮件带附件

参考代码:

#coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart class SendEmail:
global send_user
global email_host
global password
password = "lunkbrgwqxhfjgxx"
email_host = "smtp.qq.com"
send_user = "xx@qq.com" def send_mail(self,user_list,sub,content):
user = "shape" + "<" + send_user + ">" # 创建一个带附件的实例
message = MIMEMultipart()
message['Subject'] = sub
message['From'] = user
message['To'] = ";".join(user_list) # 邮件正文内容
message.attach(MIMEText(content, 'plain', 'utf-8')) # 构造附件(附件为txt格式的文本)
att = MIMEText(open('../log/log.txt', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="Log.txt"'
message.attach(att) server = smtplib.SMTP_SSL()
server.connect(email_host,465)# 启用SSL发信, 端口一般是465
# server.set_debuglevel(1)# 打印出和SMTP服务器交互的所有信息
server.login(send_user,password)
server.sendmail(user,user_list,message.as_string())
server.close() def send_main(self,pass_list,fail_list,no_run_list):
pass_num = len(pass_list)
fail_num = len(fail_list)
#未执行的用例
no_run_num = len(no_run_list)
count_num = pass_num + fail_num + no_run_num #成功率、失败率
'''
用%对字符串进行格式化
%d 格式化整数
%f 格式化小数;想保留两位小数,需要在f前面加上条件:%.2f;用%%来表示一个%
如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串
'''
pass_result = "%.2f%%" % (pass_num/count_num*100)
fail_result = "%.2f%%" % (fail_num/count_num*100)
no_run_result = "%.2f%%" % (no_run_num/count_num*100) user_list = ['xx@qq.com']
sub = "接口自动化测试报告"
content = "总共执行接口个数%s个,通过个数%s个,失败个数%s个,未执行个数%s个:通过率为%s,失败率为%s,未执行率为%s" % (count_num,pass_num,fail_num,no_run_num,pass_result,fail_result,no_run_result)
self.send_mail(user_list,sub,content)

举例说明附件为TXT类型,其他类型的可参考:https://blog.csdn.net/u013250071/article/details/79037843

python3:利用SMTP协议发送QQ邮件+附件的更多相关文章

  1. C# WinForm 使用SMTP协议发送QQ邮箱验证码

    文章来自:https://blog.csdn.net/IT_xiao_guang_guang/article/details/104336604 前言   在程序设计中,发送验证码是常见的一个功能,用 ...

  2. 九、Python发送QQ邮件(SMTP)

    看了廖雪峰老师的教程: 一封电子邮件的旅程就是 发件人 -> MUA -> MTA -> MTA -> 若干个MTA -> MDA <- MUA <- 收件人 ...

  3. C#使用SMTP协议发送验证码到QQ邮箱

    C#使用SMTP协议发送验证码到QQ邮箱 在程序设计中,发送验证码是常见的一个功能,用户在注册账号时或忘记密码后,通常需要发送验证码到手机短信或邮箱来验证身份,此篇博客介绍在C#中如何使用SMTP协议 ...

  4. 电子邮件协议及GO发送QQ邮件

    目录 一.电子邮件的工作机制 1.1 SMTP 1.2 POP3 1.3 IMAP 二.邮件地址 三.MIME信息 四.使用golang发送qq邮件 一.电子邮件的工作机制 提供电子邮件服务的协议叫做 ...

  5. 用CBrother脚本实现smtp协议发送一份邮件

    用CBrother脚本实现smtp协议发送一份邮件 之前用CBrother脚本写了一个拯救“小霸王服务器”的程序,公司人用着都挺好用,但是有时候谁重启了服务器其他人不知道,造成了多人多次重启,每个人都 ...

  6. 【python】脚本连续发送QQ邮件

    今天习得用python写一个连续发送QQ邮件的脚本,经过测试,成功给国内外的服务器发送邮件,包括QQ邮箱.163邮箱.google邮箱,香港科技大学的邮箱和爱丁堡大学的邮箱.一下逐步解答相关技巧. 首 ...

  7. Java发送QQ邮件

    面试的时候被问到这个问题,别人问我用Java发过邮件没有,被问得一脸懵逼.然后就研究了一下,不是很难,按照网上的方法折腾了几天就搞出来了. 首先,使用QQ邮箱发送邮件之前需要在邮箱里面配置,开启pop ...

  8. 使用python发送QQ邮件

    这里用到了Python的两个包来发送邮件: smtplib 和 email . Python 的 email 模块里包含了许多实用的邮件格式设置函数,可以用来创建邮件“包裹”.使用的 MIMEText ...

  9. java mail Received fatal alert: handshake_failure java 无法发送邮件问题 java 发送qq邮件(含源码)

     java 无法发送邮件问题 java 发送qq邮件 报错:java mail Received fatal alert: handshake_failure (使用ssl) javax.mail.M ...

随机推荐

  1. Version Control System

    Version  Control System(版本控制系统),是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型 ...

  2. 大数据分析引擎Apache Flink

    Apache Flink是一个高效.分布式.基于Java实现的通用大数据分析引擎,它具有分布式 MapReduce一类平台的高效性.灵活性和扩展性以及并行数据库查询优化方案,它支持批量和基于流的数据分 ...

  3. PostgreSQL查看表大小的命令

    SELECT table_name, pg_size_pretty(table_size) AS table_size, pg_size_pretty(indexes_size) AS indexes ...

  4. org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in 'c

     org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'list' in ' ...

  5. SecureCRT sftp上传文件报错:put: failed to upload xxx 拒绝访问

    1.问题 使用sftp上传文件时报错:put: failed to upload xxx 拒绝访问.类似下图所示: 2.原因 造成这个问题的原因可能有两个,一是要上到的那个目录剩余磁盘空间不足,二是打 ...

  6. QT和JS的互相调用例子

    转自: http://blog.163.com/qimo601@126/blog/static/15822093201682185819623/ Qt 4.8.4 感谢原作者,我只转载. 看看作者如何 ...

  7. Mockito:一个强大的用于Java开发的模拟测试框架

    https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...

  8. nyoj 0269 VF(dp)

    nyoj 0269 VF 意思大致为从1-10^9数中找到位数和为s的个数 分析:利用动态规划思想,一位一位的考虑,和s的范围为1-81 状态定义:dp[i][j] = 当前所有i位数的和为j的个数 ...

  9. 首席科学家马丁•福勒(Martin Fowler)

    现任思特沃克公司首席科学家的马丁·福勒先生是当今世界软件开发领域最具影响力的五位大师之一.作为一位敏捷软件开发方法的早期开拓者,福勒先生对IT 业的影响是不可估量的. 思特沃克公司是一家跨国专业IT ...

  10. 高效方便的IO库: System.IO.Pipelines

    我们在编写网络程序的时候,经常会进行如下操作: 申请一个缓冲区 从数据源中读入数据至缓冲区 解析缓冲区的数据 重复第2步 表面上看来这是一个很常规而简单的操作,但实际使用过程中往往存在如下痛点: 数据 ...