2009-04-22 2 views
24

여기 내 스크립트입니다. Gmail의 요구 사항 때문에 스크립트에서 시작 문자를 사용합니다. 나는 2 개의 웹 주인, 1and1 및 webfaction에 이것을 시도했다. 1and1은 나에게 'connection refused'오류를 표시하고 webfaction은 오류를보고하지 않지만 전자 메일을 보내지 않습니다. 스크립트에 문제가있는 것을 볼 수 없으므로 웹 호스트와 관련이 있다고 생각합니다. 어떤 생각이나 의견이라도 감사하게 생각합니다.smtplib과의 Gmail 파이썬 스크립트 문제

편집 : 디버그 모드가 켜져 있습니다. 출력에서 메시지를 성공적으로 보낸 것처럼 보입니다 ... 나는 메시지를받지 못했습니다.

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

대신 직접 Gmail을 호출하는 일반 SMTP 릴레이를 통해 메일을 보낼 수 있습니다. – gimel

+1

디버깅 모드를 켜서 출력 메시지를 가져 오는 방법은 무엇입니까? – trusktr

+3

smtplib.set_debuglevel (True)가 당신을 정렬합니다. @trusktr – hd1

답변

7

은 내가 Gmail의 SMTP 서버는 당신이에서 연결의 IP 주소에 대한 역방향 DNS 조회를 수행하고, 도메인이 발견되지 않는 경우 연결을 거부한다고 생각합니다. 이는 스패머가 SMTP 서버를 오픈 릴레이로 사용하지 못하도록하기위한 것입니다.

+4

또한 인터넷 액세스 공급자가 자신의 SMTP 이외의 다른 서버로 나가는 연결을 금지 할 수 있습니다. –

+1

나는 이것이 ISP라고 생각한다. 나는 코드를 시험해 보았고 나에게 잘 돌아갔다. – hwiechers

+35

Gmail에서 DNS 조회를 역으로 수행하여 연결을 거부 한 경우 어떻게 thunderbird와 같은 데스크톱 이메일 클라이언트를 사용하여 Gmail의 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 개의 이메일이 있고 # 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), 'my[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

내가 영업 이익은 여전히이 대답에 대해 관심이 있다면 모르겠지만, 비슷한 문제를 해결하는 잘하면 다른 사람이 유용하게 찾을 수 있습니다위한 노력의 일환으로 여기 자신을 발견 한. 결국 Google은 SMTP 서버를 사용하는 방식을 변경했습니다. 몇 가지를 확인해보십시오.

  1. '보낸 사람'주소로 인증하는 데 사용한 주소와 동일한 주소를 사용하고 있습니다. 내가 잘못 입력하지 않았다면, 보낸 사람 필드에 원하는 것을 넣을 수 있었지만 보안 목적으로 많은 SMTP 호스트 사이트 (google 포함)가 이제 인증 된 주소로이를 제한합니다.

  2. '보안이 취약한 앱'(읽기 : Google에서 수익을 창출하지 않는 앱)으로 계정에 액세스하도록 허용합니다. 계정에 로그인하여 다음 페이지로 이동하십시오. https://www.google.com/settings/security/lesssecureapps

  3. 포트 587을 tls와 함께 사용하십시오. 왜 그런지는 모르겠지만 465 번 포트를 제대로 사용할 수 없었습니다.

희망이 있으면 다른 사람을 도울 수 있기를 바랍니다.

+0

답변, 어디 계셨습니까?! –

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.') 

어떤 좋은 것은 내가 저장하기 위해 열쇠 고리를 사용하는 제안이다 당신의 암호를 사용하므로 스크립트에서 사용자의 암호를 볼 위험이 없습니다.

패키지/설치의 경우 모두 파이썬 2 git 또는 pip 가능한 봐주세요, 3

+0

upvote 주셔서 감사합니다, 정말 패키지에 더 많은 관심을 갖기 위해 노력하고 있습니다! – PascalVKooten

+1

'SMTPAuthenticationError : 웹 브라우저를 통해 로그인하고 \ n5.7.14 다시 시도하십시오. \ n5.7.14 \ n5.7.14에서 자세히 알아보십시오. https://support.google.com/mail/answer/78754 vl1sm48001045pbc.31 - gsmtp ') –

+0

@ Death-Stalker 비밀 번호를 쓰는 데 실수 한 것처럼 보입니까? – PascalVKooten