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字符串和文件操作常用函数分析
Apr 08 Python
Python程序退出方式小结
Dec 09 Python
python简单实现操作Mysql数据库
Jan 29 Python
Python yield与实现方法代码分析
Feb 06 Python
python学生信息管理系统(完整版)
Apr 05 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
基于Python打造账号共享浏览器功能
May 30 Python
Python3环境安装Scrapy爬虫框架过程及常见错误
Jul 12 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
matplotlib实现显示伪彩色图像及色度条
Dec 07 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
python3中for循环踩过的坑记录
Dec 14 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
php中的时间显示
2007/01/18 PHP
利用PHP生成静态HTML文档的原理
2012/10/29 PHP
PHP return语句的另一个作用
2014/07/30 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
2016/12/14 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
2020/04/07 PHP
javascript仿php的print_r函数输出json数据
2013/09/13 Javascript
各种页面定时跳转(倒计时跳转)代码总结
2013/10/24 Javascript
JavaScript获取当前cpu使用率的方法
2015/12/15 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
AngularJS Phonecat实例讲解
2016/11/21 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
详解用vue2.x版本+adminLTE开源框架搭建后台应用模版
2019/03/15 Javascript
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
浅谈Python使用Bottle来提供一个简单的web服务
2017/12/27 Python
python语言中with as的用法使用详解
2018/02/23 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
python 偷懒技巧——使用 keyboard 录制键盘事件
2020/09/21 Python
利用Canvas模仿百度贴吧客户端loading小球的方法示例
2017/08/13 HTML / CSS
美国创意礼品网站:UncommonGoods
2017/02/03 全球购物
约瑟夫·特纳男装:Joseph Turner
2017/10/10 全球购物
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
函授大学生自我鉴定
2014/02/05 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
实习单位评语
2014/04/26 职场文书
《悯农》教学反思
2014/04/28 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
vue ref如何获取子组件属性值
2022/03/31 Vue.js
MySQL 数据库范式化设计理论
2022/04/22 MySQL