2013-05-06 59 views
0

我剛剛開始使用python通過gmail自動發送電子郵件。我已經完成了整個過程直接輸入到命令行,但現在我想自動化過程(即定期發送電子郵件)。我已經完成了第一部分的工作,在那裏我與SMTP服務器建立了連接。使用Python自動化SMTP

os.system("openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof") 

現在我想要得到它,這樣它會類型和連接中運行以下命令:

os.write("HELO", os.linesep) 
os.write("AUTH LOGIN", os.linesep) ... And so on 

我已經嘗試了本使用寫命令以及在使用os.system命令,但似乎都沒有將文本實際插入到此窗口中。可能有更多的Linux和終端技能的人能夠幫助這個嗎?另外,當所有這些系統進程都在運行時,似乎time.sleep不起作用。我該如何解決這個問題?

+0

Python確實有一個['smtplib'](http://docs.python.org/3/library/smtplib.html#module-smtplib)模塊來提供一個SMTP客戶端。如果你的目標是使用Python,直接使用'openssl'是沒有意義的。 – 2013-05-06 19:44:45

+0

我試過smtplib,但它沒有與連接到Gmail。如果您可以提供將建立連接的工作代碼,請將其發佈,然後我會將其檢出。但是,我發現openssl是我甚至能夠獲得連接的唯一方式。 – 2013-05-06 20:49:33

回答

1

我會使用SMTP客戶端實現從標準庫:如果您正在使用雙因素認證http://docs.python.org/3/library/smtplib

import smtplib 
smtp_client = smtplib.SMTP('smtp.gmail.com', 587) 
smtp_client.starttls() 
smtp_client.login(username, password) 

,你需要創建特定的應用程序要使用的密碼。

+0

我認爲gmail與大多數SMTP服務器不同,因爲您不能只遵循常規登錄步驟。我認爲它是專門編碼的,所以smtplib不起作用。該代碼是否適合你? – 2013-05-06 20:17:45

+0

是的,代碼確實對我有用。如果您使用雙因素身份驗證,則無法使用標準密碼,但就是這樣。 – 2013-05-06 21:39:27

+0

你可以發佈任何堆棧跟蹤或使用smtplib得到的錯誤嗎? – 2013-05-06 21:45:55

0

你應該看看子流程模塊來做你想做的事情。你不能只是「os.write」,你需要「寫入」進程的標準輸入和輸出。

command = ['openssl', 's_client', '-starttls smtp', '-connect smtp.gmail.com:587', '-crlf', '-ign_eof'] 
p = subprocess.Popen(command, stdin=PIPE) # Success! 
p.write("HELO", "MYNAME") 

+0

出於某種原因,我遇到了stdin = PIPE的問題。除此之外,還有更多嗎? – 2013-05-06 20:16:33

+0

嘗試subprocess.PIPE而不是PIPE – beiller 2013-05-06 20:35:15

+0

似乎解決這個問題。但寫函數返回該錯誤: 回溯(最近通話最後一個): 文件 「TestGmailConnection.py」,9號線,在 p.write( 「HELO」, 「MYNAME」) AttributeError的: 'POPEN'對象沒有屬性'寫' 未知選項-starttls smtp 用法:s_client args – 2013-05-06 20:42:35