您的位置:

Python SMTP:发送电子邮件的标准协议

一、SMTP协议是什么

SMTP(简单邮件传输协议)是Internet上约定的发送邮件的标准协议,是一种用于发送电子邮件的协议。

SMTP协议中,收件人邮件服务器会等待发送邮件服务器通过TCP协议的25端口连接并发送邮件。发送方的客户端将邮件交给SMTP服务代理或邮件服务器,等待其将消息发送出去并通知用户邮件已经被成功发送。SMTP服务器是一个已认证的邮件服务器,只有经它允许或授权的用户,才能发送邮件。

Python中的smtplib库提供了发送邮件所需的方法,我们可以使用Python来构建SMTP客户端实现邮件发送。

二、SMTP发送邮件的基本步骤

发送邮件通常包含以下几个步骤:

1、建立连接,连接到邮件服务器:```smtpObj = smtplib.SMTP_SSL(mail_host, 465)```

2、登录邮箱:```smtpObj.login(mail_user, mail_pass)```

3、设置邮件内容和发送者、收件人等信息:```message = MIMEText(mail_content, 'html', 'utf-8')```、```message['From'] = formataddr(["发件人姓名",mail_user])```、```message['To'] = formataddr(["收件人姓名",receiver])```、```message['Subject'] = mail_title```、```smtpObj.sendmail(sender, receiver, message.as_string())```

4、结束会话,退出邮箱:```smtpObj.quit()```

# 完整代码示例
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

mail_host = ""  # 邮箱服务器地址
mail_user = ""    # 发件人邮箱账号
mail_pass = ""   # 发件人邮箱授权码(非邮箱登录密码)
sender = ""       # 发件人邮箱
receiver = ""   # 收件人邮箱
mail_title = "测试邮件"  # 邮件标题
mail_content = "

这是测试邮件的内容

" # 邮件正文 def send_email(): try: smtpObj = smtplib.SMTP_SSL(mail_host, 465) # 创建SMTP连接 smtpObj.login(mail_user, mail_pass) # 登录邮箱 message = MIMEText(mail_content, 'html', 'utf-8') # 构建邮件内容 message['From'] = formataddr(["发件人姓名",mail_user]) # 设置邮件发件人名称和邮箱地址 message['To'] = formataddr(["收件人姓名",receiver]) # 设置邮件收件人名称和邮箱地址 message['Subject'] = mail_title # 设置邮件标题 smtpObj.sendmail(sender, receiver, message.as_string()) # 发送邮件 smtpObj.quit() # 退出邮箱 print("邮件发送成功!") except Exception as e: print("邮件发送失败!") print(e) send_email()

三、主要函数及方法的详细介绍

1、smtplib.SMTP类:SMTP类提供了SMTP连接的基本实现,可以通过邮件服务器地址和端口号来初始化一个SMTP对象,连接到邮件服务器。SMTP对象可以使用login()、sendmail()等方法来处理邮件的发送相关操作。

2、login()方法:SMTP对象的login()方法,用于登录到一个SMTP服务器。login()方法需要提供邮箱账号和授权码信息,只有登录了邮箱才能发送邮件。

3、sendmail()方法:SMTP对象的sendmail()方法,用于将邮件发送出去。sendmail()方法需要提供发件人、收件人、邮件内容等信息,将邮件发送给指定的收件人邮箱。

import smtplib

# 可选3种方式建立连接
smtpObj = smtplib.SMTP()   # 第一种:建立普通的连接并进行身份验证
smtpObj = smtplib.SMTP_SSL()  # 第二种:建立基于SSL加密的连接并进行身份验证
smtpObj = smtplib.SMTP_SSL(mail_host, port)    # 第三种:直接传入邮箱服务器和端口号,建立基于SSL加密连接并进行身份验证

smtpObj.login(mail_user, mail_pass)   # 登录到邮箱
smtpObj.sendmail(sender, receiver, message.as_string())   # 发邮件
smtpObj.quit()   # 退出邮箱

四、常见问题及解决方法

1、如何连接SMTP服务器?

使用SMTP类提供的connect()方法,传入邮箱服务器和端口号,建立SMTP连接。

2、如何处理邮件标题和内容?

可以使用email模块中的MIMEText类来处理邮件标题和内容,设置MIME类型为'html'即可支持HTML标签。

3、如何处理发件人和收件人名称?

使用email.utils模块的formataddr()方法,可以将发件人和收件人名称和邮箱地址组合成必要的邮件地址格式。

4、如何处理附件或图片的发送?

可以使用email模块中的MIMEImage、MIMEApplication、MIMEAudio、MIMEMultipart等类来处理附件、图片、音频等多媒体文件的发送。

5、如何处理网络连接或SMTP异常?

可以使用Python自带的try...except方法来处理SMTP连接或发送邮件时可能出现的各种异常,比如连接异常、权限验证出错、邮件发送失败等情况。