设为首页 加入收藏

TOP

Python学习之旅(三十五)(一)
2018-12-16 22:17:23 】 浏览:211
Tags:Python 学习 之旅 三十五

Python基础知识(34):电子邮件(Ⅰ)

几乎所有的编程语言都支持发送和接收电子邮件

在使用Python收发邮件前,请先准备好至少两个电子邮件,如xxx@163.comxxx@sina.comxxx@qq.com等,注意两个邮箱不要用同一家邮件服务商

电子邮件发送过程:

发件人email->MUA(mail user agent:邮件用户代理)->MTA(mail transfer agent:邮件传输代理)->MDA(mail delivery agent:邮件投递代理,即服务器)<-MUA<-收件人

使用SMTP发送邮件

SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件

Python对SMTP支持有smtplibemail两个模块,email负责构造邮件,smtplib负责发送邮件

注:以下所有代码本人未进行测试,故无法确定是否能够正常运行

一、发送邮件

1、构造邮件

from email.mime.text import MIMEText

msg = MIMEText('Hello, world', 'plain', 'utf-8')

到构造MIMEText对象时,第一个参数就是邮件正文,第二个参数是MIME的subtype,传入'plain'表示纯文本,最终的MIME就是'text/plain',最后一定要用utf-8编码保证多语言兼容性

2、通过SMTP发送邮件

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

sendmail()方法就是发邮件,由于可以一次发给多个人,所以传入一个list,邮件正文是一个stras_string()MIMEText对象变成str

必须把FromToSubject添加到MIMEText中,才是一封完整的邮件

from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr

import smtplib


# 考虑到编码的原因,这里统一将name属性值改成utf-8,地址的话一定是统一的邮箱地址结构,所以不考虑
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 world!', 'plain', 'utf-8')
# 定义发送人,接收人,以及描述信息(主题)
msg['From'] = __format_addr('发件人 <%s>' % from_addr)
msg['To'] = __format_addr('收件人: <%s>' % to_addr)
msg['Subject'] = Header('SMTP......', 'utf-8').encode()

print(msg)

结果如下

From:xxx@163.com
Password:1234
To: xxxxx@qq.com
SMTP server: smtp.163.com
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
From: =?utf-8?b?5Y+R5Lu25Lq6?= <xxx@163.com>
To: xxxxx@qq.com
Subject: =?utf-8?b?U01UUC4uLi4uLg==?=

SGVsbG8gd29ybGQh

 

二、发送HTML邮件

在构造MIMEText对象时,把HTML字符串传进去,再把第二个参数由plain变为html

msg = MIMEText('<html><body><h1>Hello</h1>' +
    '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
    '</body></html>', 'html', 'utf-8')

三、发送附件

带附件的邮件可以看做包含若干部分的邮件:文本和各个附件本身,所以,可以构造一个MIMEMultipart对象代表邮件本身,然后往里面加上一个MIMEText作为邮件正文,再继续往里面加上表示附件的MIMEBase对象即可

 

# 邮件对象:
msg = MIMEMultipart()
msg['From'] = _format_addr('Python爱好者 <%s>' % from_addr)
msg['To'] = _format_addr('管理员 <%s>' % to_addr)
msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()

# 邮件正文是MIMEText:
msg.attach(MIMEText('send with file...', 'plain', 'utf-8'))

# 添加附件就是加上一个MIMEBase,从本地读取一个图片:
with open('/Users/michael/Downloads/test.png', 'rb') as f:
    # 设置附件的MIME和文件名,这里是png类型:
    mime = MIMEBase('image', 'png', filename='test.png')
    # 加上必要的头信息:
    mime.add_header('Content-Disposition', 'attachment', filename='test.png')
    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)

按正常发送流程把msg(注意类型已变为MIMEMultipart)发送出去 

四、发送图片

不能直接在HTML邮件中链接图片地址,因为大部分邮件服务商都会自动屏蔽带有外链的图片,因为不知道这些链接是否指向恶意网站

要把图片嵌入到邮件

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇python-类(1) 下一篇hand first python 选读(2)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目