it-swarm-ko.com

파이썬을 사용하여 Gmail을 제공하는 이메일을 보내는 방법은 무엇입니까?

파이썬을 사용하여 이메일 (Gmail)을 보내려고하지만 다음 오류가 발생합니다.

Traceback (most recent call last):  
File "emailSend.py", line 14, in <module>  
server.login(username,password)  
File "/usr/lib/python2.5/smtplib.py", line 554, in login  
raise SMTPException("SMTP AUTH extension not supported by server.")  
smtplib.SMTPException: SMTP AUTH extension not supported by server.

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

import smtplib
fromaddr = '[email protected]'
toaddrs  = '[email protected]'
msg = 'Why,Oh why!'
username = '[email protected]'
password = 'pwd'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
264
Mahori

EHLO을 바로 실행하기 전에 STARTTLS을 사용해야합니다.

server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()

또한 From:, To:Subject: 메시지 헤더를 메시지 본문과 빈 줄로 구분하여 만들고 CRLF을 EOL 마커로 사용해야합니다.

예 :.

msg = "\r\n".join([
  "From: [email protected]",
  "To: [email protected]",
  "Subject: Just a message",
  "",
  "Why, oh why"
  ])
199
MattH
def send_email(user, pwd, recipient, subject, body):
    import smtplib

    FROM = user
    TO = recipient if isinstance(recipient, list) else [recipient]
    SUBJECT = subject
    TEXT = body

    # Prepare actual message
    message = """From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, ", ".join(TO), SUBJECT, TEXT)
    try:
        server = smtplib.SMTP("smtp.gmail.com", 587)
        server.ehlo()
        server.starttls()
        server.login(user, pwd)
        server.sendmail(FROM, TO, message)
        server.close()
        print 'successfully sent the mail'
    except:
        print "failed to send mail"

포트 465를 사용하려면 SMTP_SSL 객체를 만들어야합니다.

# SMTP_SSL Example
server_ssl = smtplib.SMTP_SSL("smtp.gmail.com", 465)
server_ssl.ehlo() # optional, called by login()
server_ssl.login(gmail_user, gmail_pwd)  
# ssl server doesn't support or need tls, so don't call server_ssl.starttls() 
server_ssl.sendmail(FROM, TO, message)
#server_ssl.quit()
server_ssl.close()
print 'successfully sent the mail'
280
David Okwii

나는 비슷한 문제에 빠졌고이 질문에 비틀 거렸다. SMTP 인증 오류가 있지만 내 사용자 이름/암호가 맞습니다. 여기에 고정 된 부분이 있습니다. 나는 이것을 읽었다.

https://support.google.com/accounts/answer/6010255

간단히 말해서, Google은 smtplib을 통해 로그인하는 것을 허용하지 않습니다. 왜냐하면 이러한 종류의 로그인에는 "덜 안전합니다"라고 표시했기 때문에 Google 계정에 로그인 한 상태에서이 링크로 이동해야합니다. 액세스를 허용합니다.

https://www.google.com/settings/security/lesssecureapps

설정이 완료되면 (아래 스크린 샷 참조) 작동해야합니다.

enter image description here

지금 로그인하십시오 :

smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('[email protected]', 'me_pass')

변경 후의 응답 :

(235, '2.7.0 Accepted')

사전 대응 :

smtplib.SMTPAuthenticationError: (535, '5.7.8 Username and Password not accepted. Learn more at\n5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 g66sm2224117qgf.37 - gsmtp')

여전히 작동하지 않습니까? 여전히 SMTPAuthenticationError를 얻었지만 코드가 534 인 경우 위치가 알려지지 않았기 때문입니다. 다음 링크를 클릭하십시오 :

https://accounts.google.com/DisplayUnlockCaptcha

계속을 클릭하면 새 앱을 등록하는 데 10 분이 걸릴 것입니다. 이제 다른 로그인 시도를 진행하면 제대로 작동합니다.

업데이트 : 이것은 즉시 작동하지 않는 것 같습니다 smptlib 에서이 오류가 점점 동안 붙어있을 수 있습니다 :

235 == 'Authentication successful'
503 == 'Error: already authenticated'

브라우저에서 로그인하는 메시지가 표시됩니다.

SMTPAuthenticationError: (534, '5.7.9 Please log in with your web browser and then try again. Learn more at\n5.7.9 https://support.google.com/mail/bin/answer.py?answer=78754 qo11sm4014232igb.17 - gsmtp')

'lesssecureapps'를 사용하도록 설정 한 후 커피를 사러 돌아와서 'DisplayUnlockCaptcha'링크를 다시 시도하십시오. 사용자 환경에서 변경 사항이 적용되는 데 최대 1 시간이 소요될 수 있습니다. 그런 다음 로그인 절차를 다시 시도하십시오.

123
radtek

너 OOP로 너?

#!/usr/bin/env python


import smtplib

class Gmail(object):
    def __init__(self, email, password):
        self.email = email
        self.password = password
        self.server = 'smtp.gmail.com'
        self.port = 587
        session = smtplib.SMTP(self.server, self.port)        
        session.ehlo()
        session.starttls()
        session.ehlo
        session.login(self.email, self.password)
        self.session = session

    def send_message(self, subject, body):
        ''' This must be removed '''
        headers = [
            "From: " + self.email,
            "Subject: " + subject,
            "To: " + self.email,
            "MIME-Version: 1.0",
           "Content-Type: text/html"]
        headers = "\r\n".join(headers)
        self.session.sendmail(
            self.email,
            self.email,
            headers + "\r\n\r\n" + body)


gm = Gmail('Your Email', 'Password')

gm.send_message('Subject', 'Message')
16
Ricky Wilson

당신은 그것을 여기에서 찾을 수 있습니다 : http://jayrambhia.com/blog/send-emails-using-python

smtp_Host = 'smtp.gmail.com'
smtp_port = 587
server = smtplib.SMTP()
server.connect(smtp_Host,smtp_port)
server.ehlo()
server.starttls()
server.login(user,passw)
fromaddr = raw_input('Send mail by the name of: ')
tolist = raw_input('To: ').split()
sub = raw_input('Subject: ')

msg = email.MIMEMultipart.MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = email.Utils.COMMASPACE.join(tolist)
msg['Subject'] = sub  
msg.attach(MIMEText(raw_input('Body: ')))
msg.attach(MIMEText('\nsent via python', 'plain'))
server.sendmail(user,tolist,msg.as_string())
14
Froyo

직접적으로 관련이 없지만 여전히 지적할만한 가치는 제 패키지가 정말 빠르고 고통 스럽지만 Gmail 메시지를 보내려고한다는 것입니다. 또한 오류 목록을 유지하려고 시도하고 즉시 솔루션을 가리 킵니다.

문자 그대로 당신이 쓴 것을 정확하게하기 위해서이 코드가 필요합니다.

import yagmail
yag = yagmail.SMTP('[email protected]')
yag.send('[email protected]', 'Why,Oh why!')

아니면 하나의 라이너 :

yagmail.SMTP('[email protected]').send('[email protected]', 'Why,Oh why!')

패키지/설치에 대해서는 git 또는 pip 를 참조하십시오. 둘 다 파이썬 2와 3.

11
PascalVKooten

이 작품

Gmail APP 비밀번호를 만드십시오!

생성 한 후 sendgmail.py라는 파일을 만듭니다.

그런 다음이 코드를 추가하십시오 .

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# =============================================================================
# Created By  : Jeromie Kirchoff
# Created Date: Mon Aug 02 17:46:00 PDT 2018
# =============================================================================
# Imports
# =============================================================================
import smtplib

# =============================================================================
# SET EMAIL LOGIN REQUIREMENTS
# =============================================================================
gmail_user = '[email protected]'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'

# =============================================================================
# SET THE INFO ABOUT THE SAID EMAIL
# =============================================================================
sent_from = gmail_user
sent_to = ['[email protected]', '[email protected]']
sent_subject = "Where are all my Robot Women at?"
sent_body = ("Hey, what's up? friend!\n\n"
             "I hope you have been well!\n"
             "\n"
             "Cheers,\n"
             "Jay\n")

email_text = """\
From: %s
To: %s
Subject: %s

%s
""" % (sent_from, ", ".join(sent_to), sent_subject, sent_body)

# =============================================================================
# SEND EMAIL OR DIE TRYING!!!
# Details: http://www.samlogic.net/articles/smtp-commands-reference.htm
# =============================================================================

try:
    server = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    server.ehlo()
    server.login(gmail_user, gmail_app_password)
    server.sendmail(sent_from, sent_to, email_text)
    server.close()

    print('Email sent!')
except Exception as exception:
    print("Error: %s!\n\n" % exception)

따라서 성공하면 다음과 같은 이미지가 표시됩니다.

나는 나 자신에게 이메일을 보내 테스트했다.

Successful email sent.

참고 : 내 계정에서 2 단계 인증 을 사용하도록 설정했습니다. 앱 비밀번호는이 기능과 함께 작동합니다.

2 단계 인증이 사용 설정된 계정에서는이 설정을 사용할 수 없습니다. 이러한 계정에는 덜 안전한 앱 액세스를 위해 애플리케이션 비밀번호가 필요합니다.

Less secure app access... This setting is not available for accounts with 2-Step Verification enabled.

5
JayRizzo

@David의 훌륭한 대답은 일반적인 try-except를 제외한 Python 3에 대한 것입니다.

def send_email(user, password, recipient, subject, body):

    gmail_user = user
    gmail_pwd = password
    FROM = user
    TO = recipient if type(recipient) is list else [recipient]
    SUBJECT = subject
    TEXT = body

    # Prepare actual message
    message = """From: %s\nTo: %s\nSubject: %s\n\n%s
    """ % (FROM, ", ".join(TO), SUBJECT, TEXT)

    server = smtplib.SMTP("smtp.gmail.com", 587)
    server.ehlo()
    server.starttls()
    server.login(gmail_user, gmail_pwd)
    server.sendmail(FROM, TO, message)
    server.close()
2
juan Isaza

현재 gmail API가 있으며 REST를 통해 이메일을 보내고 이메일을 읽고 초안을 만들 수 있습니다. SMTP 호출과 달리, 비 블로킹 (non-blocking)이기 때문에 스레드 기반 웹 서버가 요청 스레드 (예 : python webservers)에서 전자 메일을 보내는 것이 좋습니다. API는 또한 매우 강력합니다.

  • 물론 전자 메일은 웹 서버가 아닌 대기열로 전달되어야하지만 옵션이 있으면 좋네요.

도메인에 대한 Google Apps 관리자 권한이있는 경우 설정하는 것이 가장 쉽습니다. 클라이언트에 포괄 권한을 부여 할 수 있기 때문입니다. 그렇지 않으면 OAuth 인증과 허가를 얻어야합니다.

그것을 보여주는 요지는 다음과 같습니다.

https://Gist.github.com/timrichardson/1154e29174926e462b7a

2
Tim Richardson

오래된 smtplib의 문제처럼 보입니다. python2.7 모든 것이 잘 작동합니다.

업데이트 : 예, server.ehlo()도 도움이 될 수 있습니다.

1
mega.venik