Python SMTP发送邮件遇到的一些问题及解决办法


Posted in Python onOctober 24, 2018

Python练习内容:

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。

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

首先,我们来构造一个最简单的纯文本邮件:

from email.mime.text import MIMEText
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')

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

然后,通过SMTP发出去:

# 输入Email地址和口令:from_addr = input('From: ')
password = input('Password: ')# 输入收件人地址:to_addr = input('To: ')# 输入SMTP服务器地址:smtp_server = input('SMTP server: ')import smtplib
server = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25server.set_debuglevel(1)
server.login(from_addr, password)
server.sendmail(from_addr, [to_addr], msg.as_string())
server.quit()

我们用set_debuglevel(1)就可以打印出和SMTP服务器交互的所有信息。SMTP协议就是简单的文本命令和响应。login()方法用来登录SMTP服务器,sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个str,as_string()把MIMEText对象变成str。

如果一切顺利,就可以在收件人信箱中收到我们刚发送的Email​

​————————分割线,以上都是资料内容​————————

使用过程中我遇到了一些问题,或者是之前作者没有表述清楚

我使用的是163邮箱

1、首先作者没有提醒我,要确保自己的邮箱地址开启了smtp服务,并设置客户端授权登陆密码

Python SMTP发送邮件遇到的一些问题及解决办法

2、发送邮件时,password应该填写邮箱的授权登陆码,而不是自己的邮箱密码。

3、按照以上代码运行,会报​错

​Traceback (most recent call last):
 File "mailDemo.py", line 24, in
 server.sendmail(from_addr,[to_addr],msg.as_string())
 File "C:\Program Files\Python35-32\lib\smtplib.py", line 878, in sendmail
 raise SMTPDataError(code, resp)

应该在代码中加上:

#发送邮箱地址
msg['From'] = from_addr
#收件箱地址
msg['To'] = to_addr
#主题
msg['Subject'] = 'the frist mail'

4、在公司环境运行没问题的代码,在自己家的网络下又遇到了一系列问题,运行时报。

Traceback (most recent call last):
File "/Users/xuexiaopeng/Documents/sendmailDemo.py", line 13, in <module>
 server = smtplib.SMTP(smtp_server,25)
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 253, in __init__
 raise SMTPConnectError(code, msg)
smtplib.SMTPConnectError: (554, b'IP<114.111.167.154> in blacklist')

我也不知道这个114.111.167.154是那里的IP,我将自己电脑的翻墙代理关闭,重启了路由器解决了。

5、发送邮件时报错:

Traceback (most recent call last):
File "/Users/xuexiaopeng/Documents/sendmailDemo.py", line 21, in <module>
 server.sendmail(from_addr, [to_addr], msg.as_string())
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/smtplib.py", line 878, in sendmail
 raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, b'DT:SPM 163 smtp10,DsCowAA3h9_QbgZXI9_fCQ--.713S2 1460039376,please see http://mail.163.com/help/help_spam_16.htm?ip=117.114.147.187&hostid=smtp10&time=1460039376')

我查了一下页面http://mail.163.com/help/help_spam_16.htm?ip=117.114.147.187&hostid=smtp10&time=1460039376,是发生了退信行为,后来我关闭了路由器,连接了自己手机分享的热点,才发送成功。

至于家里的网络为啥会出问题,我还的再研究。

完整代码如下:

from email.mime.text import MIMEText
msg = MIMEText('hello,send by python...','plain','utf-8')
#发送邮箱地址
from_addr = 'test@163.com'
#邮箱授权码,非登陆密码
password = '123'
#收件箱地址
to_addr = '123456@qq.com'
#smtp服务器
smtp_server = 'smtp.163.com'
#发送邮箱地址
msg['From'] = from_addr
#收件箱地址
msg['To'] = to_addr
#主题
msg['Subject'] = 'the frist mail'
import smtplib
server = smtplib.SMTP(smtp_server,25)
server.set_debuglevel(1)
print(from_addr)
print(password)
server.login(from_addr,password)
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python中threading超线程用法实例分析
May 16 Python
Python中的字符串查找操作方法总结
Jun 27 Python
用Python将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Python基于回溯法子集树模板实现8皇后问题
Sep 01 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
Nov 14 Python
小白入门篇使用Python搭建点击率预估模型
Oct 12 Python
Python3 实现串口两进程同时读写
Jun 12 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
python解析yaml文件过程详解
Aug 30 Python
对django 2.x版本中models.ForeignKey()外键说明介绍
Mar 30 Python
flask框架中的cookie和session使用
Jan 31 Python
Python OpenCV 彩色与灰度图像的转换实现
Jun 05 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 #Python
python实现在图片上画特定大小角度矩形框
Oct 24 #Python
python多进程使用及线程池的使用方法代码详解
Oct 24 #Python
python实现图片筛选程序
Oct 24 #Python
用pycharm开发django项目示例代码
Oct 24 #Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 #Python
Python读取mat文件,并保存为pickle格式的方法
Oct 23 #Python
You might like
967 个函式
2006/10/09 PHP
PHP正则判断一个变量是否为正整数的方法
2019/02/27 PHP
一段利用WSH修改和查看IP配置的代码
2008/05/11 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
javascript 实现简单的table排序及table操作练习
2012/12/28 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
Javascript动态引用CSS文件的2种方法介绍
2014/06/06 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
基于JavaScript实现仿京东图片轮播效果
2015/11/06 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
vue.js学习笔记:如何加载本地json文件
2017/01/17 Javascript
javascript深拷贝和浅拷贝详解
2017/02/14 Javascript
webpack2.0配置postcss-loader的方法
2017/08/17 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
VSCode下好用的Python插件及配置
2018/04/06 Python
Python贪心算法实例小结
2018/04/22 Python
Python requests模块session代码实例
2020/04/14 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
Django实现随机图形验证码的示例
2020/10/15 Python
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
JD Sports马来西亚:英国领先的运动鞋和运动服饰零售商
2018/03/13 全球购物
为什么需要版本控制?
2013/08/08 面试题
环境科学专业大学生自荐信格式
2013/09/21 职场文书
资料员的岗位职责
2013/11/20 职场文书
公司董事长职责
2013/12/12 职场文书
仓库主管岗位职责
2014/03/02 职场文书
幼儿园父亲节活动方案
2014/03/11 职场文书
安全在我心中演讲稿
2014/09/01 职场文书
情人节活动总结范文
2015/02/05 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
2015年个人审计工作总结
2015/04/07 职场文书
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python