Python 发送邮件
处理和传递互联网电子邮件的应用程序称为“邮件服务器”。简单邮件传输协议(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 - 如果提供了host参数,则需要指定SMTP服务器正在监听的端口。通常这个端口是25。
-
local_hostname - 如果您的SMTP服务器正在本地运行,则可以将localhost作为选项指定。
SMTP对象具有以下方法:
- connect(host, port, source_address) - 此方法建立到给定端口上主机的连接。
-
login(user, password) - 在需要身份验证的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()方法,指定三个参数 –
- 发送方 - 一个包含发送方地址的字符串。
-
接收方 - 一个字符串列表,其中每个接收方都有一个字符串。
-
消息 - 作为字符串格式化的消息,根据不同的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 将显示的切换按钮设置为打开状态。
如果一切顺利,执行上述脚本。该消息应该会被发送到收件人的收件箱。