簡體   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