原理

网上已经有了很多的教程讲解相关的发送邮件的原理,在这里还是推荐一下廖雪峰老师的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爱好者 <%s>' % from_addr)
# 收件人
msg['To'] = _format_addr(u'管理员 <%s>' % 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爱好者 <%s>' % from_addr)
msg['To'] = _format_addr(u'管理员 <%s>' % 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的版本的问题。

最新文章

  1. kafka storm hbase性能
  2. Java小bug
  3. Mootools插件-闪烁的标题
  4. nyoj 44 子串和
  5. Qt出现常量有换行符的错误的解决方法
  6. [原创]Hadoop-2.5.2-HA原文译
  7. iOS 访问URL转码
  8. jquery控制图片切换
  9. GIS大数据存储预研
  10. tomcat+nginx实现
  11. java.util.Stack类中 empty() 和 isEmpty() 方法的作用
  12. js 获取验证码计时器
  13. 解释JS变量作用域的范例
  14. 【SQL基础】三种类别语句
  15. Oracle之带参存储过程(存储过程中for循环调用存储过程)
  16. 【codeforces gym】Increasing Costs
  17. 【LeetCode】50. Pow(x, n) (3 solutions)
  18. MySQL数据库连接池导致页面登录无法查询问题解决过程
  19. echarts仪表盘配置参数
  20. php json 转换

热门文章

  1. do-while-zero 结构在宏定义中的应用
  2. 【跨域】Access-Control-Allow-Origin
  3. 动态调试smali代码学习记录
  4. NYOJ-127 快速求幂,最小生成树
  5. 【JVM】java棧
  6. 如何在windows 2003(虚拟主机)上面部署MVC3
  7. boost::io_service解读
  8. RPG游戏地牢设计的29个要点
  9. 第 1 课 Go 简介
  10. Python命令模块argparse学习笔记(三)