接下来我将详细讲解如何使用 Python 连接 QQ 或 SINA 邮箱的 SMTP 服务器来发送邮件,并提供两个示例。
步骤一:准备工作
在使用 Python 发送邮件之前,我们需要先开通 SMTP 远程登录授权码。
-
QQ 邮箱:登录 QQ 邮箱,在“设置”-“账户”中开启 POP3/SMTP 服务,然后再获取授权码。
-
SINA 邮箱:登录 SINA 邮箱,在“设置”-“基本设置”-“POP3/SMTP/IMAP”中开启 SMTP 服务,然后再获取授权码。
步骤二:引入库并设置参数
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮箱参数
SMTP_SERVER = 'smtp.qq.com' # SMTP 服务器地址
SMTP_PORT = 465 # SMTP 服务器端口,QQ邮箱端口为465,SINA邮箱端口为25
MAIL_USERNAME = 'example@qq.com' # 发件人邮箱账号
MAIL_PASSWORD = '授权码' # 发件人邮箱授权码
# 邮件内容
FROM_ADDR = 'example@qq.com' # 发件人邮箱地址
TO_ADDR = 'example@sina.com' # 收件人邮箱地址
MAIL_BODY = '请查收附件!' # 邮件正文内容,可以是纯文本或 HTML
MAIL_SUBJECT = 'Python SMTP 邮件测试' # 邮件主题
以上代码中,我们成功导入了 smtplib
、MIMEText
和 Header
三个模块。随后,我们设置了邮件发送所需的参数,包括发件人和收件人的邮箱地址、SMTP 服务器地址、SMTP 服务器端口、发件人邮箱账号和授权码等信息。最后,我们还定义了邮件正文和邮件主题。
步骤三:连接邮箱服务器并进行认证
try:
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(MAIL_USERNAME, MAIL_PASSWORD)
print("登录成功")
except smtplib.SMTPException as e:
print("登录失败,原因:", e)
在以上代码中,我们使用 smtplib
模块中的 SMTP_SSL
方法建立与 SMTP 服务器的 SSL 加密连接,并调用 login
方法进行账户认证。其中,login
方法需要传入发件人邮箱账号和授权码两个参数。
步骤四:构造邮件内容并发送邮件
try:
message = MIMEText(MAIL_BODY, 'plain', 'utf-8')
message['From'] = Header(FROM_ADDR, 'utf-8')
message['To'] = Header(TO_ADDR, 'utf-8')
message['Subject'] = Header(MAIL_SUBJECT, 'utf-8')
server.sendmail(FROM_ADDR, [TO_ADDR], message.as_string())
print("邮件发送成功")
except Exception as e:
print("邮件发送失败,原因:", e)
finally:
server.quit()
在以上代码中,我们使用 MIMEText
类构造邮件正文,并使用 Header
类添加发件人、收件人和主题信息。然后,我们调用 sendmail
方法发送邮件。该方法需要传入发件人邮箱地址、收件人邮箱地址和邮件内容三个参数,其中邮件内容需要使用 message.as_string()
方法将其转换为字符串类型。最后,我们调用 quit
方法断开与 SMTP 服务器的连接。
示例一:发送纯文本邮件
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮箱参数
SMTP_SERVER = 'smtp.qq.com'
SMTP_PORT = 465
MAIL_USERNAME = 'example@qq.com'
MAIL_PASSWORD = '授权码'
# 邮件内容
FROM_ADDR = 'example@qq.com'
TO_ADDR = 'example@sina.com'
MAIL_BODY = '这是一封使用 Python 发送的纯文本邮件!'
MAIL_SUBJECT = 'Python SMTP 邮件测试'
try:
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(MAIL_USERNAME, MAIL_PASSWORD)
message = MIMEText(MAIL_BODY, 'plain', 'utf-8')
message['From'] = Header(FROM_ADDR, 'utf-8')
message['To'] = Header(TO_ADDR, 'utf-8')
message['Subject'] = Header(MAIL_SUBJECT, 'utf-8')
server.sendmail(FROM_ADDR, [TO_ADDR], message.as_string())
print("纯文本邮件发送成功")
except Exception as e:
print("邮件发送失败,原因:", e)
finally:
server.quit()
在以上示例中,我们发送了一封纯文本邮件。其中,我们使用 MIMEText 类构造邮件正文,并将第二个参数设置为 plain。这意味着邮件正文以纯文本方式展示。此外,所有的 HTML 标签都将被忽略。
示例二:发送带附件的邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.header import Header
# 邮箱参数
SMTP_SERVER = 'smtp.qq.com'
SMTP_PORT = 465
MAIL_USERNAME = 'example@qq.com'
MAIL_PASSWORD = '授权码'
# 邮件内容
FROM_ADDR = 'example@qq.com'
TO_ADDR = 'example@sina.com'
MAIL_BODY = '请查收附件!'
MAIL_SUBJECT = 'Python SMTP 邮件测试'
try:
server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)
server.login(MAIL_USERNAME, MAIL_PASSWORD)
message = MIMEMultipart()
message.attach(MIMEText(MAIL_BODY, 'plain', 'utf-8'))
# 添加附件
with open("example.zip", "rb") as f:
attachment = MIMEApplication(f.read(), _subtype='zip')
attachment.add_header('Content-Disposition',
'attachment', filename='example.zip')
message.attach(attachment)
message['From'] = Header(FROM_ADDR, 'utf-8')
message['To'] = Header(TO_ADDR, 'utf-8')
message['Subject'] = Header(MAIL_SUBJECT, 'utf-8')
server.sendmail(FROM_ADDR, [TO_ADDR], message.as_string())
print("带附件的邮件发送成功")
except Exception as e:
print("邮件发送失败,原因:", e)
finally:
server.quit()
以上示例中,我们发送了一封带有附件的邮件。其中,我们使用 MIMEMultipart
类构造多部分邮件内容,并使用一个 MIMEText
对象来保存邮件正文。随后,我们使用 MIMEApplication
类构造附件,并将其添加到邮件中,然后使用 add_header
方法为附件添加一个头部。最后,我们使用 sendmail
方法将邮件发送出去。
这两个示例中的代码块都是使用标准的 Markdown 格式编写的,可以在 GitHub 和博客等平台上直接复制粘贴使用。希望这个完整攻略对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python使用SMTP发送qq或sina邮件 - Python技术站