python 发送邮件

1邮件发送过程

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

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

假设自己的邮箱是me@163.com,对方的是friend@qq.com。由于自己的邮箱是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 = ['friend1@qq.com','friend2@qq.com']

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协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

完~

转载于:https://www.cnblogs.com/ouym/p/9150621.html

Python发送电子邮件可以通过 `smtplib` 库完成,它是标准库的一部分,因此不需要额外安装。下面是一个简单的介绍以及示例代码展示如何用 Python 发送带附件、HTML 内容等不同类型的邮件。 ### 使用 smtplib 和 email 模块发送基础文本邮件 1. **导入必要的模块** - `smtplib`: 用于SMTP协议通信。 - `email.mime.text.MIMEText`, `email.mime.multipart.MIMEMultipart`: 构造复杂的MIME消息体。 2. **设置服务器信息** 设置你的 SMTP 服务器地址及端口号,默认情况下 Gmail 的 SMTP 地址是 `"smtp.gmail.com"` 并且 SSL/TLS 加密连接默认使用465/587端口。 3. **构造邮件内容** 创建 MIME 格式的邮件对象,并设定主题、发件人、收件人等基本信息。 4. **登录邮箱账户并发送邮件** #### 基础文本邮件发送实例 ```python import smtplib from email.mime.text import MIMEText from email.header import Header # 定义变量 sender = "your_email@example.com" # 发件人的邮箱账号 receiver = ["recv_email1@example.com"] # 收件人的邮箱账号(支持多个) subject = "测试邮件标题" body = "这是一个来自Python脚本的基础文本邮件" msg = MIMEText(body, 'plain', 'utf-8') # 文本正文 msg['Subject'] = Header(subject, 'utf-8') # 主题 msg['From'] = sender # 显示的发件人名称 msg['To'] = ",".join(receiver) # 显示的收件人名单 try: server = smtplib.SMTP_SSL("smtp.exmail.qq.com", 465) # 使用SSL加密的方式链接到QQ企业邮服务器 login_result = server.login(sender, "your_password") # 登录验证 print(f"Login status code:{login_result}") if int(login_result) == 235: # 如果返回的状态码等于235表示认证成功 send_status = server.sendmail(sender, receiver, msg.as_string()) print(send_status) if not send_status: print('邮件已成功发出') else: print('邮件发送失败:', send_status) except Exception as e: print(f'发生错误:{e}') finally: server.quit() # 关闭连接 ``` 请注意,出于安全考虑,在生产环境中应避免直接将密码写入源代码文件中。推荐做法是从环境变量读取或者利用第三方服务如 OAuth 授权等方式替代传统用户名+密码组合来进行身份校验。 --- 接下来是一些高级功能的应用场景说明: * **带有 HTML 格式的内容**: 将第二步中的 `MIMEText()` 函数第二个参数改为 `'html'` 即可构建HTML格式的消息体; * **附加普通文件**: 使用 `email.mime.base.MIMEBase` 类结合 `encoders.encode_base64()` 方法编码二进制数据加入到 MIMEMultipart 对象里作为附件; * **同时包含文字和平面媒体资源(例如图片)** : 把所有非文本部分当作独立部件挂载至根容器之下形成复合型MIME文档结构。 如果需要进一步了解上述任意一种情况的具体实现,请告诉我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值