Python-发送电子邮件


通过 Internet 处理和传递电子邮件的应用程序称为“邮件服务器”。简单邮件传输协议 (SMTP) 是一种处理发送电子邮件以及在邮件服务器之间路由电子邮件的协议。它是电子邮件传输的互联网标准。

Python 提供了 smtplib 模块,该模块定义了 SMTP 客户端会话对象,可用于将邮件发送到具有 SMTP 或 ESMTP 侦听器守护程序的任何 Internet 计算机。

smptlib.SMTP() 函数

要发送电子邮件,您需要使用以下函数获取 SMTP 类的对象 -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

这是参数的详细信息 -

  • host - 这是运行 SMTP 服务器的主机。您可以指定主机的 IP 地址或域名(例如tutorialspoint.com)。这是一个可选参数。

  • port - 如果您提供主机参数,那么您需要指定 SMTP 服务器正在侦听的端口。通常该端口为 25。

  • local_hostname - 如果您的 SMTP 服务器在本地计算机上运行,​​则您可以仅指定 localhost 作为选项。

SMTP 对象有以下方法 -

  • connect(host, port, source_address) - 此方法在给定端口上建立与主机的连接。

  • 登录(用户,密码) - 登录需要身份验证的 SMTP 服务器。

  • quit() - 终止 SMTP 会话。

  • data(msg) - 将消息数据发送到服务器。

  • docmd(cmd, args) - 发送命令,并返回其响应代码。

  • ehlo(name) - 用于标识自身的主机名。

  • starttls() - 将与 SMTP 服务器的连接置于 TLS 模式。

  • getreply() - 从服务器获取包含服务器响应代码的回复。

  • putcmd(cmd, args) - 向服务器发送命令。

  • send_message(msg, from_addr, to_addrs) - 将消息转换为字节串并将其传递给sendmail。

smtpd 模块

Python 预装的smtpd模块有一个本地 SMTP 调试服务器。您可以通过启动来测试电子邮件功能。它实际上并不将电子邮件发送到指定的地址,而是丢弃它们并将其内容打印到控制台。运行本地调试服务器意味着无需处理消息加密或使用凭据登录电子邮件服务器。

您可以通过在命令提示符中键入以下内容来启动本地 SMTP 调试服务器 -

python -m smtpd -c DebuggingServer -n localhost:1025

例子

以下程序借助 smtplib 功能发送一封虚拟电子邮件。

import smtplib

def prompt(prompt):
   return input(prompt).strip()
   
fromaddr = prompt("From: ")
toaddrs = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")

# Add the From: and To: headers at the start!
msg = ("From: %s\r\nTo: %s\r\n\r\n"
   % (fromaddr, ", ".join(toaddrs)))
while True:
   try:
      line = input()
   except EOFError:
      break
   if not line:
      break
   msg = msg + line
   
print("Message length is", len(msg))
server = smtplib.SMTP('localhost', 1025)
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()

基本上我们使用 sendmail() 方法,指定三个参数 -

  • 发件人- 包含发件人地址的字符串。

  • 接收者- 字符串列表,每个接收者一个。

  • The message - 消息作为字符串,格式按照各种 RFC 中指定的格式。

我们已经启动了 SMTP 调试服务器。运行这个程序。用户被要求输入发件人的 ID、收件人和消息。

python example.py
From: abc@xyz.com
To: xyz@abc.com
Enter message, end with ^D (Unix) or ^Z (Windows):
Hello World
^Z

控制台反映以下日志 -

From: abc@xyz.com
reply: retcode (250); Msg: b'OK'
send: 'rcpt TO:<xyz@abc.com>\r\n'
reply: b'250 OK\r\n'
reply: retcode (250); Msg: b'OK'
send: 'data\r\n'
reply: b'354 End data with <CR><LF>.<CR><LF>\r\n'
reply: retcode (354); Msg: b'End data with <CR><LF>.<CR><LF>'
data: (354, b'End data with <CR><LF>.<CR><LF>')
send: b'From: abc@xyz.com\r\nTo: xyz@abc.com\r\n\r\nHello
World\r\n.\r\n'
reply: b'250 OK\r\n'
reply: retcode (250); Msg: b'OK'
data: (250, b'OK')
send: 'quit\r\n'
reply: b'221 Bye\r\n'
reply: retcode (221); Msg: b'Bye'

运行 SMTPD 服务器的终端显示以下输出-

---------- MESSAGE FOLLOWS ----------
b'From: abc@xyz.com'
b'To: xyz@abc.com'
b'X-Peer: ::1'
b''
b'Hello World'
------------ END MESSAGE ------------

使用 Gmail SMTP

让我们看一下下面的脚本,它使用 Google 的smtp邮件服务器发送电子邮件。

首先,使用 gmail 的 smtp 服务器和端口 527 设置 SMTP 对象。然后,SMTP 对象通过调用 ehlo() 命令来标识自身。我们还为外发邮件激活传输层安全性。

接下来,通过将凭据作为参数传递给它来调用 login() 命令。最后,通过附加指定格式的标头来组装邮件消息,并使用 sendmail() 方法发送。SMTP 对象随后关闭。

import smtplib
content="Hello World"
mail=smtplib.SMTP('smtp.gmail.com', 587)
mail.ehlo()
mail.starttls()
sender='mvl@gmail.com'
recipient='tester@gmail.com'
mail.login('mvl@gmail.com','******')
header='To:'+receipient+'\n'+'From:' \
+sender+'\n'+'subject:testmail\n'
content=header+content
mail.sendmail(sender, recipient, content)
mail.close()

在运行上述脚本之前,必须将发件人的 Gmail 帐户配置为允许“安全性较低的应用程序”。访问以下链接。

https://myaccount.google.com/lesssecureapps将显示的切换按钮设置为“开”。

切换按钮

如果一切顺利,执行上面的脚本。该邮件应发送到收件人的收件箱。