문제

내 스크립트는 다음과 같습니다.

#!/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('myname@gmail.com','mypass')
server.sendmail('myname@gmail.com','somename@somewhere.com',msg)
server.close()

Gmail 계정에서 이메일을 보내려고합니다. 스크립트는 Gmail의 요구 사항으로 인해 starttls를 사용합니다. 나는 이것을 두 개의 웹 호스트, 1and1과 Webfaction에서 시도했습니다. 1and1은 '연결 거부'오류를 제공하고 WebFaction은 오류가 없지만 이메일을 보내지 않습니다. 스크립트에 잘못된 것을 볼 수 없으므로 웹 호스트와 관련이있을 수 있다고 생각합니다. 모든 생각과 의견은 대단히 감사 할 것입니다.

편집 : 디버그 모드를 켰습니다. 출력에서 메시지를 성공적으로 보낸 것처럼 보입니다.

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:<myname@gmail.com> 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:<myname@gmail.com>\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')
도움이 되었습니까?

해결책

Gmail SMTP 서버가 연결하는 IP 주소에서 리버스 DNS 조회를 수행하고 도메인을 찾을 수없는 경우 연결을 거부한다고 생각합니다. 이것은 SPAMMER가 SMTP 서버를 열기 릴레이로 사용하는 것을 피하는 것입니다.

다른 팁

유효한 메시지를 구성 해 보셨습니까?

from email.MIMEText import MIMEText

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

OP가 여전히이 답변에 관심이 있는지 모르겠지만, 비슷한 문제를 해결하기 위해 여기서 나 자신을 발견 한 결과, 다른 사람 이이 유용한 것을 알 수 있기를 바랍니다. 결과적으로 Google은 SMTP 서버를 사용할 수있는 방식을 변경했습니다. 몇 가지 사항을 확인하고 싶을 것입니다.

  1. 'From'주소로 인증하는 데 사용한 것과 동일한 주소를 사용하고 있습니다. 내가 실수하지 않았다면, 당신이 당신이 원했던 모든 것을 필드에 넣을 수 있었지만, 보안 목적으로 많은 SMTP 호스트 사이트 (Google 포함)는 이제이를 인증 된 주소로 제한합니다.

  2. '덜 안전한 앱'으로 계정에 액세스 할 수 있도록하십시오 (읽기 : 수익을 창출하지 않는 앱). 해당 계정에 로그인하고 여기에서 탐색하려면 다음과 같습니다.https://www.google.com/settings/security/lesssecureapps

  3. TLS와 함께 포트 587을 사용하십시오. 왜 그런지 잘 모르겠지만 포트 465가 좋은 플레이를 할 수 없었습니다.

이것이 다른 사람을 도울 수 있기를 바랍니다.

여기서는 자체 홍보이지만 유효한 근거에서 느낍니다.

당신은 말 그대로 당신이 쓴 것을 정확하게 수행하기 위해이 코드 만 필요합니다.

import yagmail
yag = yagmail.SMTP('myname@gmail.com')
yag.send('somename@somewhere.com', subject = None, contents = 'Hello')

또는 하나의 라이너 :

yagmail.SMTP('myname@gmail.com').send('somename@somewhere.com', None, 'Hello world.')

좋은 점은 Keyring을 사용하여 비밀번호를 저장할 것을 제안하므로 스크립트에서 비밀번호를 볼 위험이 없습니다.

통역사에서 한 번 실행하여이를 설정할 수 있습니다.

import yagmail
yagmail.register("my@gmail.com", "mypassword")

그리고 종료. 그런 다음 사용할 수 있습니다.

import yagmail
yagmail.SMTP("my@gmail.com") # without password

집에 "my@gmail.com"으로 .yagmail을 추가하면 그냥 할 수 있습니다. yagmail.SMTP(), 그러나 지금까지는 다소 무의미합니다.

경고 : 많은 메시지를 보내는 것에 대해 진지하게 생각하면 Oauth2를 더 잘 설정하면 Yagmail이 도움을 줄 수 있습니다.

yagmail.SMTP("my@gmail.com", oauth2_file="/path/to/save/creds.json")

처음으로 실행되면 OAUTH2 자격 증명을 얻는 프로세스를 안내하고 파일에 저장하여 다음에 아무것도 할 필요가 없습니다. 누군가가 당신의 자격 증명을 찾았다 고 의심하십니까? 권한이 제한되어 있지만 Gmail을 통해 자격 증명을 무효화하는 것이 좋습니다.

패키지/설치를 위해서는 참조하십시오 git 또는 읽기, 파이썬 2와 3 모두에 사용할 수 있습니다.

Gmail에서 "Send"폴더를 확인해야합니다. 계정에서 계정으로 전송 된 메시지가 아마도 나타날 것입니다.

나는 위에서 언급 한 링크로 갔고 보내는 주소와 3 개의 다른 주소를 가지고 있었지만 동일한 주소로 3 개의 이메일을 받았으며 그 주소는 #3 주소입니다.

http://mynthon.net/howto/-/python/python%20-%20logging.smtphandler-how-to-us-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), 'myusername@gmail.com', ['address1@gmail.com', 'address2@gmail.com', 'address3@gmail.com'], 'unable to find Error!', ('myusername@gmail.com', 'mypassword'))
gm.setLevel(logging.ERROR)

logger.addHandler(gm)

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

작품입니다

'''
Created on 2017/11/27

@author: devuser
'''

import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __name__ == '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)

https://qiita.com/okhrn/items/630a87ce1a44778bbeb1

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top