繁体   English   中英

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

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

我在一个网站上找到以下代码,解释了如何使用python发送电子邮件(Hotmail /实时)。 我可以理解一些代码,但是大多数代码都令人困惑。 例如, s.starttls()的意思是/ do以及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()

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

…我到过那里,是在您的年龄开始学习编码的,当时互联网只是今天的一小部分。 因此,让我给您一些见识和指导。

如果您了解一些编程知识并了解SMTP协议,则粘贴的代码非常简单。

发送邮件时,通常是在端口25(通常是587)上与服务器建立TCP连接。 在那里,您必须遵循精确的协议,以使服务器了解您要执行的操作。 该协议已由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
.

您对服务器说的地方:

  • 嗨! 我是爱丽丝!
  • 我想发送消息给鲍勃!
  • 你能告诉他去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"

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

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

warning
.

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

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

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

你说“嗨!”

s.ehlo()

然后,您开始加密通信:

s.starttls()

它正在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()

您可以确定自己的身份,以便live.com知道您是自己要装作的人:

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

因此,您想在其中更改实际帐户的电子邮件地址和密码

然后,您将邮件发送到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

然后,您的邮件对象是一个对您的smtp服务器没有意义的python“实例”。 您必须将其从邮件服务器可以理解的形式(即全文本)中翻译出来。 您可以通过在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知道了一个名为msg的对象,这要归功于class email.message.Message类,它位于内存地址0x10dcb1560中”。

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

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

warning

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

而且由于您很有礼貌,所以您要说“再见”来告诉服务器要离开,而不是默默离开。

s.quit()

话虽如此,我只能建议您打开几本书,参加一些在线课程,最重要的是练习,从简单的愚蠢无聊的示例开始,再到更复杂的方法。 首先,先做文本界面,然后再做图形界面,这要复杂一些。

这里有一些提示:

您可能还需要遵循在线课程:

只是给几个。

正如您的代码所暗示的那样,看起来您可能是法国人,那么我只能建议您阅读我曾任教过的一位老师写的关于算法的出色著作,该书讲授编程原理和思想,而不受编程语言的束缚:

高温超导

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

您需要的所有资源都可以在Python标准库中找到: 18.1 Email20.12 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) 

这将设置一个邮件客户端(特别是SMTP客户端会话对象),该邮件客户端可以使用SMTP或ESMTP侦听器守护程序将邮件发送到任何Internet计算机。
(包括所有大型电子邮件,例如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()

终止会话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM