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实现日常记账本小程序
Mar 10 Python
python实现整数的二进制循环移位
Mar 08 Python
Django多数据库的实现过程详解
Aug 01 Python
django-filter和普通查询的例子
Aug 12 Python
pytorch 模型可视化的例子
Aug 17 Python
python设置环境变量的作用整理
Feb 17 Python
Python基于codecs模块实现文件读写案例解析
May 11 Python
Python OrderedDict字典排序方法详解
May 21 Python
python中什么是面向对象
Jun 11 Python
python实现录音功能(可随时停止录音)
Oct 26 Python
python内置进制转换函数的操作
Jun 02 Python
Python编写nmap扫描工具
Jul 21 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
PHP VS ASP
2006/10/09 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
Laravel框架实现的使用smtp发送邮件功能示例
2019/03/12 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
javascript contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
2010/02/04 Javascript
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
简介JavaScript中的setTime()方法的使用
2015/06/11 Javascript
JS基于myFocus库实现各种功能的tab选项卡切换效果
2015/09/19 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
vue2.0使用Sortable.js实现的拖拽功能示例
2017/02/21 Javascript
原生js实现鼠标跟随效果
2017/02/28 Javascript
js实现彩色条纹滚动条效果
2017/03/15 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
python3 flask实现文件上传功能
2020/03/20 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python操作excel让工作自动化
2019/08/09 Python
tensorflow多维张量计算实例
2020/02/11 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
使用sublime text3搭建Python编辑环境的实现
2021/01/12 Python
萌新HTML5 入门指南(二)
2020/11/09 HTML / CSS
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
CK加拿大官网:Calvin Klein加拿大
2020/03/14 全球购物
Java中有几种类型的流?JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类
2012/02/06 面试题
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
如何开启linux的ssh服务
2015/02/14 面试题
大学生的四年学习自我评价
2013/12/13 职场文书
Mongo服务重启异常问题的处理方法
2021/07/01 MongoDB
分享3个非常实用的 Python 模块
2022/03/03 Python
windows系统搭建WEB服务器详细教程
2022/08/05 Servers