2009-04-22 72 views
24

這裏是我的腳本:的smtplib和Gmail - Python腳本問題

#!/usr/bin/python 

import smtplib 
msg = 'Hello world.' 

server = smtplib.SMTP('smtp.gmail.com',587) #port 465 or 587 
server.ehlo() 
server.starttls() 
server.ehlo() 
server.login('[email protected]','mypass') 
server.sendmail('[email protected]','[email protected]',msg) 
server.close() 

我只是想從我的Gmail帳戶發送電子郵件。由於gmail的要求,該腳本使用starttls。我已經在兩個Web主機上嘗試了這種方法,1and1和webfaction。 1and1給了我一個'連接被拒絕'的錯誤,webfaction報告沒有錯誤,但只是不發送電子郵件。我看不到腳本有什麼問題,所以我認爲它可能與Web主機有關。任何想法和意見將不勝感激。

編輯:我打開調試模式。從輸出中,它看起來像是成功地發送了消息......我從來沒有收到過它。

send: 'ehlo web65.webfaction.com\r\n' 
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n' 
reply: '250-SIZE 35651584\r\n' 
reply: '250-8BITMIME\r\n' 
reply: '250-STARTTLS\r\n' 
reply: '250-ENHANCEDSTATUSCODES\r\n' 
reply: '250 PIPELINING\r\n' 
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84] 
SIZE 35651584 
8BITMIME 
STARTTLS 
ENHANCEDSTATUSCODES 
PIPELINING 
send: 'STARTTLS\r\n' 
reply: '220 2.0.0 Ready to start TLS\r\n' 
reply: retcode (220); Msg: 2.0.0 Ready to start TLS 
send: 'ehlo web65.webfaction.com\r\n' 
reply: '250-mx.google.com at your service, [174.133.21.84]\r\n' 
reply: '250-SIZE 35651584\r\n' 
reply: '250-8BITMIME\r\n' 
reply: '250-AUTH LOGIN PLAIN\r\n' 
reply: '250-ENHANCEDSTATUSCODES\r\n' 
reply: '250 PIPELINING\r\n' 
reply: retcode (250); Msg: mx.google.com at your service, [174.133.21.84] 
SIZE 35651584 
8BITMIME 
AUTH LOGIN PLAIN 
ENHANCEDSTATUSCODES 
PIPELINING 
send: 'AUTH PLAIN *****\r\n' 
reply: '235 2.7.0 Accepted\r\n' 
reply: retcode (235); Msg: 2.7.0 Accepted 
send: 'mail FROM:<[email protected]> size=12\r\n' 
reply: '250 2.1.0 OK 4sm652580yxq.48\r\n' 
reply: retcode (250); Msg: 2.1.0 OK 4sm652580yxq.48 
send: 'rcpt TO:<[email protected]>\r\n' 
reply: '250 2.1.5 OK 4sm652580yxq.48\r\n' 
reply: retcode (250); Msg: 2.1.5 OK 4sm652580yxq.48 
send: 'data\r\n' 
reply: '354 Go ahead 4sm652580yxq.48\r\n' 
reply: retcode (354); Msg: Go ahead 4sm652580yxq.48 
data: (354, 'Go ahead 4sm652580yxq.48') 
send: 'Hello world.\r\n.\r\n' 
reply: '250 2.0.0 OK 1240421143 4sm652580yxq.48\r\n' 
reply: retcode (250); Msg: 2.0.0 OK 1240421143 4sm652580yxq.48 
data: (250, '2.0.0 OK 1240421143 4sm652580yxq.48') 
+2

您可以通過正常的SMTP中繼發送的,而不是直接調用Gmail的郵件。 – gimel 2009-04-22 17:04:35

+1

如何打開調試模式以獲取這些輸出消息? – trusktr 2013-04-27 04:33:13

+3

smtplib.set_debuglevel(True)會排序你,@trusktr – hd1 2014-07-03 03:14:56

回答

7

我認爲Gmail的SMTP服務器確實在您從連接的IP地址反向DNS查找,並拒絕連接,如果沒有域都可以找到。這是爲了避免垃圾郵件發件人使用他們的SMTP服務器作爲開放中繼。

8

您是否嘗試構建有效的消息?

from email.MIMEText import MIMEText 

msg = MIMEText('body') 
msg['Subject'] = 'subject' 
msg['From'] = "..." 
msg['Reply-to'] = "..." 
msg['To'] = "..." 
2

你需要檢查Gmail中的「已發送」文件夾中,這就是從您的帳戶發送到您的帳戶信息將最有可能出現。

0

我去了上述鏈接,並有3個不同的地址發送給,但我收到三封電子郵件到同一個地址,並且是#3地址。

http://mynthon.net/howto/-/python/python%20-%20logging.SMTPHandler-how-to-use-gmail-smtp-server.txt

import logging 
import logging.handlers 

class TlsSMTPHandler(logging.handlers.SMTPHandler): 
def emit(self, record): 
    """ 
    Emit a record. 

    Format the record and send it to the specified addressees. 
    """ 
    try: 
     import smtplib 
     import string # for tls add this line 
     try: 
      from email.utils import formatdate 
     except ImportError: 
      formatdate = self.date_time 
     port = self.mailport 
     if not port: 
      port = smtplib.SMTP_PORT 
     smtp = smtplib.SMTP(self.mailhost, port) 
     msg = self.format(record) 
     msg = "From: %s\r\nTo: %s\r\nSubject: %s\r\nDate: %s\r\n\r\n%s" % (
         self.fromaddr, 
         string.join(self.toaddrs, ","), 
         self.getSubject(record), 
         formatdate(), msg) 
     if self.username: 
      smtp.ehlo() # for tls add this line 
      smtp.starttls() # for tls add this line 
      smtp.ehlo() # for tls add this line 
      smtp.login(self.username, self.password) 
     smtp.sendmail(self.fromaddr, self.toaddrs, msg) 
     smtp.quit() 
    except (KeyboardInterrupt, SystemExit): 
     raise 
    except: 
     self.handleError(record) 

logger = logging.getLogger() 

gm = TlsSMTPHandler(("smtp.gmail.com", 587), '[email protected]', ['[email protected]', '[email protected]', '[email protected]'], 'unable to find Error!', ('[email protected]', 'mypassword')) 
gm.setLevel(logging.ERROR) 

logger.addHandler(gm) 

try: 
    1/0 
except: 
    logger.exception('It NO work for me!!-') 
6

我不知道OP仍然關心這個答案,但已經在努力解決類似的問題,希望其他人可能會發現這個有用這裏找到自己。事實證明,Google改變了他們允許使用SMTP服務器的方式。您需要檢查以下幾件事:

  1. 您使用的是您用來驗證「發件人」地址的相同地址。如果我沒有弄錯,以前的情況是,你可以在發件人字段中添加任何你想要的內容,但出於安全考慮,許多SMTP主機站點(包括谷歌)現在將其限制爲已通過身份驗證的地址。

  2. 允許您的帳戶被'不太安全的應用程序'訪問(請閱讀:我們沒有收入的應用程序)。要做到這一點登錄到您的帳戶和導航在這裏: https://www.google.com/settings/security/lesssecureapps

  3. 使用端口587與tls。不知道爲什麼,但我永遠不能得到港口465打好。

希望這可以幫助別人。

5

這裏有一些自我推銷,但我覺得有一個有效的理由。

你會從字面上只需要這個代碼做你寫什麼:

import yagmail 
yag = yagmail.SMTP('[email protected]') 
yag.send('[email protected]', subject = None, contents = 'Hello') 

或者一個襯墊:

yagmail.SMTP('[email protected]').send('[email protected]', None, 'Hello world.') 

什麼是好的是,我建議使用鑰匙圈來存儲您的密碼,所以你永遠不會有人在你的腳本中看到你的密碼的風險。

對於包/安裝請看看gitpip,都可以使用Python 2和3