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

Pam*_*gat -1 python email hotmail

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

请通过这个指导我....

PS - >我只有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()
Run Code Online (Sandbox Code Playgroud)

zmo*_*zmo 7

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

...我一直在那里,在互联网只是今天的一小部分时,学会了适合您这个年龄段的代码.所以,让我给你一些见解和指示.

您粘贴的代码非常简单,因为您已了解一些编程并了解SMTP协议.

当您发送邮件时,您正在与服务器建立TCP连接 - 通常是端口25(在您的情况下为587).在那里你必须遵循一个精确的协议让服务器了解你想要做什么.该协议已由RFC821定义.

当你遇到某人(就像"嗨!",然后握手,然后说"你好吗?")时,你遵循协议的方式相同,在提出问题之前,服务器也会这样做:

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
.
Run Code Online (Sandbox Code Playgroud)

你在哪里对服务器说:

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

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

现在让我们在编程方面获得更多信息.首先,导入模块,一个用于处理电子邮件,另一个用于smtp连接:

import email
import smtplib
Run Code Online (Sandbox Code Playgroud)

要了解如何使用它,您可以在命令行上启动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
…
Run Code Online (Sandbox Code Playgroud)

对象是您可以使用的社区正在开发的所有操作和对象.帮助是提供更多的洞察力,以及您想要访问的URL,以了解更多关于您可以使用它做什么,以及示例.

然后,您创建一个邮件消息:

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

在SMTP协议中设置Subject,FromTo行以及正文的内容如下所示:

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

warning
.
Run Code Online (Sandbox Code Playgroud)

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

s = smtplib.SMTP("smtp.live.com",587)
Run Code Online (Sandbox Code Playgroud)

该连接使对象知道您要连接的位置的详细信息,并提供可以在该连接上应用的方法.方法是您可以对其执行的操作,即:

你说"嗨!"

s.ehlo()
Run Code Online (Sandbox Code Playgroud)

然后,您开始加密通信:

s.starttls()
Run Code Online (Sandbox Code Playgroud)

它正在你的smtp连接上执行"加密握手"协议,这样进一步的通信现在是"安全的",即没有人可以通过查看你的计算机和服务器之间的数据包来读取你的密码.

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

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

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

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

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

s.ehlo()
Run Code Online (Sandbox Code Playgroud)

你表明了自己,所以live.com知道你是谁,你是谁:

s.login('example@hotmail.fr', 'pass')
Run Code Online (Sandbox Code Playgroud)

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

然后,您将邮件发送到/来自example@hotmail.fr:

s.sendmail("example@hotmail.fr", "example@hotmail.fr", msg.as_string())
Run Code Online (Sandbox Code Playgroud)

在我的回答的第一部分,我告诉过你关于"SMTP"协议,你必须说出你是谁以及你想与谁交谈?这就是你在这里所做的.这种方法将转化为:

MAIL FROM example@hotmail.fr
RCPT TO example@hotmail.fr
Run Code Online (Sandbox Code Playgroud)

然后,您的邮件对象是一个python"实例",对您的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>
Run Code Online (Sandbox Code Playgroud)

这意味着"python知道一个名为msg的对象,这是由于类email.message.Message并且存在于内存地址0x10dcb1560".

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

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

warning
Run Code Online (Sandbox Code Playgroud)

这实际上是您为正确发送它的SMTP处理程序实例提供的内容.

而且因为你很有礼貌,你通过说"再见"告诉你要离开的服务器,而不是默默地离开.

s.quit()
Run Code Online (Sandbox Code Playgroud)

总而言之,我只能建议你开几本书,参加一些在线课程,最重要的是做练习,从简单愚蠢和无聊的例子开始,更复杂.首先进行文本界面,然后再进行有点复杂的图形界面.

以下是一些指示:

您可能还想关注在线课程:

只是给几个.

正如你的代码建议的那样,看起来你可能是法国人,那么我只能建议你阅读我以前的老师写的关于算法的优秀书籍,这本书教授编程原理和思考而不依赖于编程语言:

HTH