python 发送邮件

Posted OUYM

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 发送邮件相关的知识,希望对你有一定的参考价值。

1邮件发送过程

通常我们通过一个邮箱程序填好邮件信息(如163邮箱等),点击发送按钮就将该电子邮件发送出去了。这个邮箱程序被称为邮件用户代理(Mail User Agent,MUA),它的功能就是用于收发邮件。

Email从MUA发出后,不是直接到达对方电脑,而是发送到邮件传输代理(Mail Transfer Agent,MTA),就是邮件服务提供商,如网易、阿里云等。

假设自己的邮箱是[email protected],对方的是[email protected]。由于自己的邮箱是163.com,Email首先投递到网易提供的MTA,再由网易提供的MTA发送到对方的服务商(也就是腾讯提供的MTA)。在这个过程中也许会经过别的MTA,但是对用户透明,我们不用去管。

Email到达腾讯的MTA之后,因为对方使用的是qq邮箱,因此腾讯的MTA会将Email投递到最终的目的地邮件投递代理(Mail Delivery Agent,MDA)。

Email到达MDA后,会存放在腾讯服务器的某个文件或者数据库里,我们将长期保存电子邮件的地方称之为电子邮箱。对放要到取邮件,必须通过MUA从MDA上获得。

简单的说一封电子邮件的旅程是:发件人->MUA->MTA->...->MTA->MDA->MUA->收件人

 

2邮件的协议

发邮件时,MUA和MTA使用的协议是SMTP(Simple Mail Transfer Protocol),从一个MTA到另一个MTA也是使用SMTP协议。

收邮件时,MUA和MDA使用的协议有两种:一种是POP(Post Office Protocol),目前是版本3,俗称POP3;

另一种是IMAP(Internet Message Access Protocol),该协议的优点是不但能取邮件,还可以直接操作MDA上存储的邮件,如删除等操作。

 

3 SMTP发送邮件

python对SMTP的支持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件。

下面是简单邮件发送的demo

#!/usr/bin/python
#!coding:utf-8
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

mail_host = smtp.163.com
mail_port = 465
sender = ‘me@163.com# 填写你的邮件和密码(授权码)
pwd = ******
receivers = [[email protected]‘,[email protected]]

subject = python smtp test
content = 这是一个测试邮件,被ouym创建。
html_content = """
<p>欢迎进入ouym的博客</p>
<p><a href="http://www.ouym.top">点击www.ouym.top</a></p>
"""


# send函数封装连接登陆,以及实际的发送操作
def send(message):
    try:
        smtpObj = smtplib.SMTP_SSL(mail_host,mail_port)
        smtpObj.login(sender,pwd)
        smtpObj.sendmail(sender,receivers,message.as_string())
        print("success!")
    except smtplib.SMTPException as e:
        print(邮件发送失败,原因为:%s%e)


# 简单发送文本邮件
def send_text_mail():

    message = MIMEText(content,plain,utf-8)
    message[From] = "{}".format(sender)
    message[To] = ",".join(receivers)
    message[Subject] = subject

    send(message)


# 简单发送html格式邮件
def send_html_mail():

    message = MIMEText(html_content,html,utf-8)
    message[From] = "{}".format(sender)
    message[To] = ",".join(receivers)
    message[Subject] = subject

    send(message)


# 简单发送带附件的邮件
def send_image_mail():

    message = MIMEMultipart()
    message[From] = "{}".format(sender)
    message[To] = ",".join(receivers)
    message[Subject] = subject
    message.attach(MIMEText(html_content, html, utf-8))

# txt附件 att1
= MIMEText(open(test1.txt, rb).read(), base64, utf-8) att1[Content-Type] = application/octet-stream att1[Content-Disposition] = attachment;filename="ouym.txt" message.attach(att1)
# 文档附件 att2
= MIMEText(open(test2.doc, rb).read(), base64, utf-8) att2[Content-Type] = application/octet-stream att2[Content-Disposition] = attachment;filename="ouym.doc" message.attach(att2)
# 图片附件 att3
= MIMEText(open(test3.png, rb).read(), base64, utf-8) att3[Content-Type] = application/octet-stream att3[Content-Disposition] = attachment;filename="ouym.png" message.attach(att3) send(message) def main(): send_text_mail() if __name__ == __main__: main()

注意这里SMTP不是使用的25端口,而是使用的465端口,这两个端口都是用来发送邮件的。

465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

完~

以上是关于python 发送邮件的主要内容,如果未能解决你的问题,请参考以下文章

超实用的php代码片段

Javascript - 使用 HTML 片段通过电子邮件发送 JSON 输出

Github 大牛封装 Python 代码,实现自动发送邮件只需三行代码

C#和ASP.NET通过Gmail账户发送邮件的代码

python笔记- 发送邮件

实现Python代码发送邮件