有人可以向我解释这段代码吗(Python [发送电子邮件])

Can someone please explain this code to me (Python [Sending Emails])

我在解释如何使用 python 发送电子邮件 (Hotmail/live) 的网站上找到了以下代码。我可以理解一些代码,但大部分代码完全令人困惑。例如,s.starttls() mean/do 和 msg.as_string();那是之前定义的还是它做什么的?请帮助我,因为我想理解这段代码(我想尽快制作一个 gui 应用程序版本)。

请指导我完成这个....

P.S --> 我才 16 岁,所以请尽量让我的意思听起来容易理解。

代码:

import email
import smtplib

msg = email.message_from_string('warning')
msg['From'] = "example@hotmail.fr"
msg['To'] = "example@hotmail.fr"
msg['Subject'] = "helOoooOo"
s = smtplib.SMTP("smtp.live.com",587)
s.ehlo()
s.starttls() 
s.ehlo()
s.login('example@hotmail.fr', 'pass')
s.sendmail("example@hotmail.fr", "example@hotmail.fr", msg.as_string())
s.quit()

所以message_from_string('warning')接受一个字符串并放入消息对象结构中。然后你设置FromToSubject。然后定义 SMTP 地址和它使用的端口。 ehlo() 只是告诉服务器您将通过它发送消息。 starttls() 说从现在开始,所有发送的数据都将通过 TLS 发送,因此您的所有密码都将是安全和加密的。您登录,将邮件发送到并获得您先前设置的第一行的消息,返回作为字符串发送。然后关闭 SMTP 连接。

很抱歉地告诉你,这不是上编码课的地方。这是一个询问精确编码问题的地方。因此,您的问题很可能会被标记出来,而我将成为要求关闭它的人之一。但是……

…我去过那里,在互联网只是今天的一小部分的时候学习编码。所以让我给你一些见解和指导。

您粘贴的代码非常简单明了,前提是您懂一点编程并了解 SMTP 协议。

当你发送邮件时,你正在与服务器建立 TCP 连接——通常是——端口 25(但在你的例子中是 587)。在那里你必须遵循一个精确的协议让服务器理解你想做什么。此协议已由 RFC821.

定义

与您遇到某人时遵循协议的方式相同(例如 "hi!",然后握手,然后说 "how're you doing?"),然后再提问,服务器也会这样做:

EHLO example.org
MAIL FROM alice@example.org
RCPT TO bob@example.org
DATA
Date: Fri, 21 Aug 2015 23:12:29 +0000
From: Alice <alice@example.org>
To: Bob <bob@example.org>

Go RTFM!

-- 
Bob
.

你对服务器说的地方:

  • 您好!我是爱丽丝!
  • 我想给鲍勃发消息!
  • 你能告诉他去RTFM吗?

这就是您在代码中实际执行的操作。

现在让我们进一步了解编程方面的内容。首先,您导入 模块 ,一个用于处理电子邮件,另一个用于 smtp 连接:

import email
import smtplib

要了解如何使用它,您可以在命令行上启动 python REPL 并执行 dir(email) 以显示其对象,并执行 help(email) 以获取集成帮助:

python
>>> import email
>>> dir(email)
['Charset', 'Encoders', 'Errors', 'FeedParser', 'Generator', 'Header', 'Iterators', 'LazyImporter', 'MIMEAudio', 'MIMEBase', 'MIMEImage', 'MIMEMessage', 'MIMEMultipart', 'MIMENonMultipart', 'MIMEText', 'Message', 'Parser', 'Utils', '_LOWERNAMES', '_MIMENAMES', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__version__', '_name', 'base64MIME', 'email', 'importer', 'message_from_file', 'message_from_string', 'mime', 'quopriMIME', 'sys']
>>> help(email)
Help on package email:

NAME
    email - A package for parsing, handling, and generating email messages.

FILE
    /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/email/__init__.py

MODULE DOCS
    http://docs.python.org/library/email
…

对象是社区正在开发的所有您可以使用的动作和对象。帮助提供了更多的见解,以及您想访问的 URL 以了解更多关于您可以使用它做什么的信息,以及示例。

然后,您创建邮件信息:

msg = email.message_from_string('warning')
msg['From'] = "example@hotmail.fr"
msg['To'] = "example@hotmail.fr"
msg['Subject'] = "helOoooOo"

您在其上设置 SubjectFromTo 行以及 SMTP 协议中的正文,如下所示:

From: example@hotmail.fr
To: example@hotmail.fr
Subject: helOoooOo

warning
.

然后您打开到 Live.com 的 SMTP 服务器的连接:

s = smtplib.SMTP("smtp.live.com",587)

该连接提供了一个对象,该对象知道您要连接到的位置的详细信息,并提供了可以应用于该连接的方法。这些方法是您可以对其执行的操作,即:

你说"hi!"

s.ehlo()

然后,您开始加密通信:

s.starttls()

它正在您的 smtp 连接上执行 "encryption handshake" 协议,因此现在可以进行进一步的通信 "secure",即没有人可以通过查看您的计算机和服务器之间的数据包来读取您的密码。

您可以在那里阅读更多相关信息:

https://docs.python.org/3/library/smtplib.html#smtplib.SMTP.starttls

你可以在这里阅读它的源代码:

https://hg.python.org/cpython/file/3.4/Lib/smtplib.py#l654

你再说一次"hi!",不仅因为你很有礼貌,而且因为你从未加密切换到加密,你的邮件服务器期待你再次打招呼:

s.ehlo()

您表明自己的身份,以便 live.com 知道您是您假装的人:

s.login('example@hotmail.fr', 'pass')

所以你想更改你实际帐户的电子邮件地址和密码

然后,您发送邮件 to/from example@hotmail.fr:

s.sendmail("example@hotmail.fr", "example@hotmail.fr", msg.as_string())

在我回答的第一部分,我告诉过你 "SMTP" 协议,你必须说你是谁,你想和谁交谈?好吧,这就是你在这里所做的。这个方法会转化为:

MAIL FROM example@hotmail.fr
RCPT TO example@hotmail.fr

然后,您的邮件对象是一个 python "instance",它对您的 smtp 服务器毫无意义。您必须将其翻译成您的邮件服务器可以理解的形式,即全文。您可以在 python REPL:

中查看它的内容
python
>>> import email
>>> msg = email.message_from_string('warning')
>>> msg['From'] = "example@hotmail.fr"
>>> msg['To'] = "example@hotmail.fr"
>>> msg['Subject'] = "helOoooOo"
>>> print(msg)
<email.message.Message instance at 0x10dcb1560>

表示"python knows about an object called msg, which is made thanks to the class email.message.Message and lives at the memory address 0x10dcb1560".

但是如果您执行以下操作,您将收到要发送的邮件:

>>> print(msg.as_string())
From: example@hotmail.fr
To: example@hotmail.fr
Subject: helOoooOo

warning

这是您实际提供给负责正确发送它的 SMTP 处理程序实例的内容。

因为你很有礼貌,你是在告诉服务员你要离开,而不是默默离开。"bye"。

s.quit()

话虽这么说,我只能建议你多看几本书,上一些在线课程,最重要的是多练习,从简单愚蠢无聊的例子开始,再到更复杂的东西。先从文本界面开始,然后再做稍微复杂一点的图形界面。

这里有几点建议:

您可能还想学习在线课程:

随便举几个。

按照你的代码,看来你可能是法国人,那我只能建议你看一下我以前的老师写的关于算法的好书,讲授编程原理和思维,不被束缚一种编程语言:

HTH

您需要的所有资源都可以在 Python 标准库中找到:18.1 Email and 20.12 smtplib

我会针对你提到的两行逐行解释。 (跳过导入

msg = email.message_from_string('warning') 

正在创建值为 "warning"

的消息对象
msg['From'] = "example@hotmail.fr"
msg['To'] = "example@hotmail.fr"   
msg['Subject'] = "helOoooOo"       

指定邮件的发件人、收件人和主题

s = smtplib.SMTP("smtp.live.com",587) 

这会设置一个邮件客户端(特别是一个 SMTP 客户端会话对象),它可以将邮件发送到任何带有 SMTP 或 ESMTP 侦听器守护进程的互联网机器。
(这包括所有大型电子邮件,如 gmail、yahoo、aol 等)

s.ehlo()

这会将您标识为使用 EHLO 的服务器,并设置发送消息所需的大量默认属性。

s.starttls()

将 SMTP 连接置于 TLS(传输层安全)模式。随后的所有 SMTP 命令都将被加密。

s.ehlo()

最好放在上一个命令之后,因为信息现在已加密。

s.login('example@hotmail.fr', 'pass')

使用(用户名、密码)登录

s.sendmail("example@hotmail.fr", "example@hotmail.fr", msg.as_string())

发送消息(发件人、收件人、消息)。 msg.as_string() 仅表示您希望消息格式为字符串。

s.quit()

终止会话。