原理

网上已经有了很多的教程讲解相关的发送邮件的原理,在这里还是推荐一下廖雪峰老师的Python教程,讲解通俗易懂。简要来说,SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。而python内置的email模块则是负责邮件的内容、发送方、接收方等内容;具体的操作可以看代码。

而构造一个邮件对象就是一个Messag对象,如果构造一个MIMEText对象,就表示一个文本邮件对象,如果构造一个MIMEImage对象,就表示一个作为附件的图片,要把多个对象组合起来,就用MIMEMultipart对象,而MIMEBase可以表示任何对象。他们的嵌套关系如下:

Message

+- MIMEBase

+- MIMEMultipart

+- MIMENonMultipart

+- MIMEMessage

+- MIMEText

+- MIMEImage

一些错误的总结

[1]提示smtplib.SMTPAuthenticationError: (550, b'User has no permission')

这是因为邮箱没有开启客户端授权,邮箱这边的SMTP服务运行不起来;而现在基本所有的邮件都是需要客户端授权的,这里需要注意一下。解决办法为:进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码),非第三方登录密码不变。

[2]提示smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed')

以163邮箱为例,在开启POP3/SMTP服务,并开启客户端授权密码时会设置授权码,将这个授权码代替smtplib.SMTP().login(user,password)方法中的password即可。就是说你代码中的password为你所设置的授权码。

[3]提示554

说明邮件内容缺少信息,在现在的邮箱里一般有些内容需要填写。

代码

# 发送文本

# -*- coding: utf-8 -*-

from email import encoders

from email.header import Header

from email.mime.text import MIMEText

from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s):

name, addr = parseaddr(s)

return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = input('From: ')

password = input('Password: ')

to_addr = input('To: ')

smtp_server = input('SMTP server: ')

# 发的内容

msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')

# 发件人

msg['From'] = _format_addr(u'Python爱好者 ' % from_addr)

# 收件人

msg['To'] = _format_addr(u'管理员 ' % to_addr)

# 标题

msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()

server = smtplib.SMTP(smtp_server, 25)

server.set_debuglevel(1)

server.login(from_addr, password)

server.sendmail(from_addr, [to_addr], msg.as_string())

server.quit()

# 发送附件

# -*- coding: utf-8 -*-

from email import encoders

from email.header import Header

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.base import MIMEBase

from email.utils import parseaddr, formataddr

import smtplib

def _format_addr(s):

name, addr = parseaddr(s)

return formataddr((Header(name, 'utf-8').encode(), addr))

from_addr = input('From: ')

password = input('Password: ')

to_addr = input('To: ')

smtp_server = input('SMTP server: ')

# 邮件对象:

msg = MIMEMultipart()

msg['From'] = _format_addr(u'Python爱好者 ' % from_addr)

msg['To'] = _format_addr(u'管理员 ' % to_addr)

msg['Subject'] = Header(u'来自SMTP的问候……', 'utf-8').encode()

# 邮件正文是MIMEText:

msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:

with open('e:/141.m4a', 'rb') as f:

# 设置附件的MIME和文件名,这里是音乐类型:

mime = MIMEBase('image', 'm4a', filename='141.m4a')

# 加上必要的头信息:

mime.add_header('Content-Disposition', 'attachment', filename='141.m4a')

mime.add_header('Content-ID', '<0>')

mime.add_header('X-Attachment-Id', '0')

# 把附件的内容读进来:

mime.set_payload(f.read())

# 用Base64编码:

encoders.encode_base64(mime)

# 添加到MIMEMultipart:

msg.attach(mime)

server = smtplib.SMTP(smtp_server, 25)

server.set_debuglevel(1)

server.login(from_addr, password)

server.sendmail(from_addr, [to_addr], msg.as_string())

server.quit()

代码经笔者都测试过,应该是没问题的。遇到错误看看是不是客户端的授权问题,或者是python的版本的问题。

python发送邮件廖雪峰_利用Python的smtplib和email发送邮件相关推荐

  1. python发送邮件廖雪峰_【Python】利用邮件远程控制自己电脑

    下载W3Cschool手机App,0基础随时随地学编程 导语 最近经常需要简单地远程控制一下电脑,比如远程查看一下电脑上模型训练的情况,模型训练完之后远程关闭电脑等等,于是就想着利用python来简单 ...

  2. python廖雪峰_【Python】python中实现多进程与多线程

    进程与线程 进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位[1].比如,打开一个word文件就是启动了一个word进程. 线程(thread)是进程内的子任务.比如word中 ...

  3. python post请求 上传图片_利用python模拟实现POST请求提交图片的方法

    本文主要给大家介绍的是关于利用python模拟实现POST请求提交图片的方法,分享出来供大家参考学习,下面来一看看详细的介绍: 使用requests来模拟HTTP请求本来是一件非常轻松的事情,比如上传 ...

  4. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  5. python制作图片墙_利用python生成照片墙的示例代码

    PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了.其官方主页为:PIL. PIL历 ...

  6. python处理nc数据_利用python如何处理nc数据详解

    利用python如何处理nc数据详解 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  利用python如何处理nc数据详解.txt ] (友情提示:右键点上行txt ...

  7. python爬虫新闻热点_利用Python网络爬虫技术追踪时事热点

    龙源期刊网 http://www.qikan.com.cn 利用 Python 网络爬虫技术追踪时事热点 作者:廖泽龙 王昊源 刘紫嫣

  8. python制作电脑软件_利用PYTHON制作桌面版爬虫软件(一)

    抱歉,对长沙房地产数据的挖掘与分析[三],想了蛮久,觉得对自己的分析结果不是很理想.等我完善好了,我再发出来吧.今天继续开启新的一专题.主要讲解如何用PYTHON实现简单的桌面软件的制作. 题外话,我 ...

  9. python计算面积代码_利用Python求阴影部分的面积实例代码

    利用Python求阴影部分的面积实例代码 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  利用Python求阴影部分的面积实例代码.txt ] (友情提示:右键点 ...

最新文章

  1. 根据矩阵变化实现基于 HTML5 的 WebGL 3D 自动布局
  2. 公司 表名规则 TN基础表 TR关系表 TL定义表
  3. Android 之窗口小部件详解--App Widget
  4. 表单FORM的5个属性name,method,action,enctype,target
  5. 霸气侧漏HTML5--之--canvas(1) api + 弹球例子
  6. PostgreSQL字符集问题
  7. Cloud for Customer动态控制任意UI element的visibility
  8. c ++明明的随机数_从列表C ++程序中随机建议电影
  9. SpringMVC简单小案例
  10. 技术面试时,程序员需要什么样的编程测试?
  11. python中文帮助_python中文官方手册等手册链接地址
  12. java连接mysql,报错Could not create connection to database server.
  13. 如何用photoshop做24色环_教大家用PS画色轮图
  14. 二等分计算机打印机尺寸,241两等分打印纸尺寸 电脑打印纸,规格241mm等份是2等份,是多大的纸呀?...
  15. Tansat XCO2数据下载
  16. 【5G之道】第十四章:异构网络部署
  17. luogu3755 [CQOI2017]老C的任务
  18. 微信支付 postman_微信刷脸支付补贴政策有哪些?
  19. UFT(Unified Functional Testing)软件基本使用—自动化测试
  20. MySQL安装2出现Typical_Mysql安装 - osc_c7lpn2ge的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. oracle 僵死的进程,查看进程僵死状态 linux查看进程的方法有几种
  2. 免费的redis可视化工具
  3. Linux系统下基于IO多路复用的大规模可靠UDP服务器的实现(三)
  4. 美团外卖打开自动提示领外卖红包iphone口令保姆级教程(仅支持iphone)
  5. BP算法作为一种常用的神经网络训练算法有哪些优势
  6. 面试干货4——你对Java类加载器(自定义类加载器)有了解吗?
  7. 十进制数转换为二进制数 C++
  8. MySQL子查询 嵌套查询
  9. [iOS] 解决:你很郁闷UIDatePicker为什么显示不出来
  10. mysql带有in的子查询_含有IN的子查询