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 远程统计文件代码分享
May 14 Python
Python实现线程池代码分享
Jun 21 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python爬取网易云音乐热门评论
Mar 31 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
Python中Proxypool库的安装与配置
Oct 19 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
Nov 14 Python
python使用递归的方式建立二叉树
Jul 03 Python
python科学计算之numpy——ufunc函数用法
Nov 25 Python
django-xadmin根据当前登录用户动态设置表单字段默认值方式
Mar 13 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 Token(令牌)设计
2008/03/15 PHP
解析关于java,php以及html的所有文件编码与乱码的处理方法汇总
2013/06/24 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
php对二维数组进行排序的简单实例
2013/12/19 PHP
PHP中require和include路径问题详解
2014/12/25 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
Laravel如何友好的修改.env配置文件详解
2017/06/07 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
eval与window.eval的差别分析
2011/03/17 Javascript
js改变鼠标的形状和样式的方法
2014/03/31 Javascript
原生js编写设为首页兼容ie、火狐和谷歌
2014/06/05 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
jQuery实现鼠标经过购物车出现下拉框代码(推荐)
2016/07/21 Javascript
基于Vue如何封装分页组件
2016/12/16 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
微信小程序微信支付接入开发实例详解
2017/04/12 Javascript
详解axios在vue中的简单配置与使用
2017/05/10 Javascript
基于JavaScript实现多级菜单效果
2017/07/25 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
使用PYTHON接收多播数据的代码
2012/03/01 Python
Python中字典的基本知识初步介绍
2015/05/21 Python
python 3.6.5 安装配置方法图文教程
2018/09/18 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
python 修改本地网络配置的方法
2019/08/14 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
CSS3中颜色线性渐变实战
2015/07/18 HTML / CSS
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
医生自荐信
2013/10/11 职场文书
大学生入党自荐书
2015/03/05 职场文书
毕业生的自我鉴定表范文
2019/05/16 职场文书
PHP中->和=>的意思
2021/03/31 PHP
javascript canvas实现雨滴效果
2021/06/09 Javascript
Redis过期数据是否会被立马删除
2022/07/23 Redis