Python을 사용하여 Gmail을 프로바이더로 이메일을 보내는 방법은 무엇입니까?
python을 사용하여 메일(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 = 'user_me@gmail.com'
toaddrs = 'user_you@gmail.com'
msg = 'Why,Oh why!'
username = 'user_me@gmail.com'
password = 'pwd'
server = smtplib.SMTP('smtp.gmail.com:587')
server.starttls()
server.login(username,password)
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
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'
말하면 요.EHLO
before before before before before before before STARTTLS
:
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
꼭 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,From:
,To:
★★★★★★★★★★★★★★★★★」Subject:
헤더와 하여 " " " " 를 사용합니다.CRLF
EOL을 사용하다
예.
msg = "\r\n".join([
"From: user_me@gmail.com",
"To: user_you@gmail.com",
"Subject: Just a message",
"",
"Why, oh why"
])
주의:
이 기능을 사용하려면 gmail 계정 구성에서 "보안성이 낮은 앱 허용" 옵션을 활성화해야 합니다.그렇지 않으면 gmail이 Google 앱이 아닌 앱이 사용자 계정에 로그인하려는 것을 감지하면 "중요 보안 경고"가 표시됩니다.
나는 비슷한 문제에 부딪혀 이 질문을 우연히 발견했다.SMTP 인증 에러가 발생했지만, 유저명/패스에는 문제가 없었습니다.여기 그것을 고친 것이 있다.읽었어요.
https://support.google.com/accounts/answer/6010255
간단히 말해, 구글은 이러한 종류의 로그인을 "안전성이 낮다"고 플래그를 설정했기 때문에 smtplib를 통해 로그인할 수 없습니다. 따라서 Google 계정에 로그인하는 동안 이 링크로 이동하여 액세스를 허용해야 합니다.
https://www.google.com/settings/security/lesssecureapps
설정이 완료되면(아래 스크린샷 참조) 동작합니다.
지금 바로 로그인 가능:
smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login('me@gmail.com', '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')
'lesssecure apps'를 활성화한 후 커피를 마시고 돌아와서 'DisplayUnlockCaptcha' 링크를 다시 시도하십시오.사용자 경험상 변경이 활성화되기까지 최대 1시간이 소요될 수 있습니다.그런 다음 로그인 프로세스를 다시 시도하십시오.
이 동작
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 = 'THEFROM@gmail.com'
gmail_app_password = 'YOUR-GOOGLE-APPLICATION-PASSWORD!!!!'
# =============================================================================
# SET THE INFO ABOUT THE SAID EMAIL
# =============================================================================
sent_from = gmail_user
sent_to = ['THE-TO@gmail.com', 'THE-TO@gmail.com']
sent_subject = "Hey Friends!"
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)
성공했을 경우는, 다음과 같은 이미지가 표시됩니다.
저는 제 자신과 메일을 주고받으며 테스트했습니다.
주의: 제 계정에서는 2단계 검증이 유효하게 되어 있습니다.App Password는 이것으로 동작합니다.(gmail smtp 셋업의 경우 https://support.google.com/accounts/answer/185833?hl=en에 접속하여 다음 절차를 따라야 합니다.
이 설정은 2-Step Verification이 활성화된 계정에서는 사용할 수 없습니다.이러한 계정에는 보안성이 낮은 앱 액세스를 위해 애플리케이션별 암호가 필요합니다.
설명
https://myaccount.google.com/apppasswords에 접속하여 위와 같이 APP 비밀번호를 만듭니다.
너 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')
다음은 Gmail API의 예입니다.더 복잡하긴 하지만 2019년에는 이 방법밖에 효과가 없다고 생각합니다.이 예는 다음 항목에서 가져와 수정되었습니다.
https://developers.google.com/gmail/api/guides/sending
구글의 API 인터페이스로 웹 사이트를 통해 프로젝트를 생성해야 합니다.그런 다음 앱에서 G메일 API를 활성화해야 합니다.자격 증명을 생성한 다음 해당 자격 증명을 다운로드하여 credentials.json으로 저장합니다.
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from email.mime.text import MIMEText
import base64
#pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly', 'https://www.googleapis.com/auth/gmail.send']
def create_message(sender, to, subject, msg):
message = MIMEText(msg)
message['to'] = to
message['from'] = sender
message['subject'] = subject
# Base 64 encode
b64_bytes = base64.urlsafe_b64encode(message.as_bytes())
b64_string = b64_bytes.decode()
return {'raw': b64_string}
#return {'raw': base64.urlsafe_b64encode(message.as_string())}
def send_message(service, user_id, message):
#try:
message = (service.users().messages().send(userId=user_id, body=message).execute())
print( 'Message Id: %s' % message['id'] )
return message
#except errors.HttpError, error:print( 'An error occurred: %s' % error )
def main():
"""Shows basic usage of the Gmail API.
Lists the user's Gmail labels.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
service = build('gmail', 'v1', credentials=creds)
# Example read operation
results = service.users().labels().list(userId='me').execute()
labels = results.get('labels', [])
if not labels:
print('No labels found.')
else:
print('Labels:')
for label in labels:
print(label['name'])
# Example write
msg = create_message("from@gmail.com", "to@gmail.com", "Subject", "Msg")
send_message( service, 'me', msg)
if __name__ == '__main__':
main()
직접적인 관련은 없지만 지적할 가치가 있는 것은 제 패키지가 Gmail 메시지를 매우 빠르고 쉽게 보낼 수 있도록 노력한다는 것입니다.또, 에러 리스트를 유지하려고 하고, 곧바로 솔루션을 가리킵니다.
문자 그대로 이 코드만 있으면 당신이 쓴 그대로 실행할 수 있습니다.
import yagmail
yag = yagmail.SMTP('user_me@gmail.com')
yag.send('user_you@gmail.com', 'Why,Oh why!')
또는 하나의 라이너:
yagmail.SMTP('user_me@gmail.com').send('user_you@gmail.com', 'Why,Oh why!')
패키지/인스톨에 대해서는, Python 2와 Python 3에 대응하고 있는 git 또는 pip를 봐 주세요.
다음 URL에서 찾을 수 있습니다.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())
gmail 계정에서 보안이 낮은 앱을 활성화하고 다음을 사용합니다(Python>=3.6).
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
gmailUser = 'XXXXX@gmail.com'
gmailPassword = 'XXXXX'
recipient = 'XXXXX@gmail.com'
message = f"""
Type your message here...
"""
msg = MIMEMultipart()
msg['From'] = f'"Your Name" <{gmailUser}>'
msg['To'] = recipient
msg['Subject'] = "Subject here..."
msg.attach(MIMEText(message))
try:
mailServer = smtplib.SMTP('smtp.gmail.com', 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(gmailUser, gmailPassword)
mailServer.sendmail(gmailUser, recipient, msg.as_string())
mailServer.close()
print ('Email sent!')
except:
print ('Something went wrong...')
Python을 통한 이메일 전송이 얼마나 고통스러운지를 깨달았고, 이를 위해 광범위한 라이브러리를 만들었습니다.또한 Gmail이 미리 구성되어 있기 때문에 Gmail의 호스트와 포트를 기억할 필요가 없습니다.
from redmail import gmail
gmail.user_name = "you@gmail.com"
gmail.password = "<YOUR APPLICATION PASSWORD>"
# Send an email
gmail.send(
subject="An example email",
receivers=["recipient@example.com"],
text="Hi, this is text body.",
html="<h1>Hi, this is HTML body.</h1>"
)
물론 Gmail 계정을 구성해야 합니다(걱정하지 마십시오. 간단합니다).
- 2단계 검증 설정(아직 설정되지 않은 경우)
- 응용 프로그램 비밀번호 생성
- 패스워드를 「어플리케이션」의 패스워드를 「어플리케이션 패스워드는, 「어플리케이션 패스워드」로 설정합니다.
gmail
오브젝트 및 완료!
Red Mail은 사실 매우 광범위합니다(첨부 파일, 이미지 삽입, 참조 및 BCC, Jinja와 함께 보내는 템플릿 등). 이메일 발송인에게 필요한 것은 이것뿐입니다.또한 테스트와 문서화가 잘 되어 있습니다.유용하게 쓰시길 바랍니다.
설치하는 방법:
pip install redmail
문서: https://red-mail.readthedocs.io/en/latest/
소스 코드: https://github.com/Miksus/red-mail
Gmail에서는 발신인을 변경할 수 없습니다.송신자 주소는 항상 당신입니다.
REST를 통해 이메일을 보내고, 이메일을 읽고, 초안을 만들 수 있는 gmail API가 있습니다.SMTP 콜과는 달리, 이것은 비블로킹이며, 요청 스레드(python webserver 등)에서 전자 메일을 보내는 스레드 기반 웹 서버에는 매우 유용합니다.API도 매우 강력합니다.
- 물론 이메일은 비웹서버 큐에 전달되어야 하지만 옵션이 있는 것은 좋습니다.
도메인에 대한 Google Apps 관리자 권한이 있는 경우 클라이언트에 전체 권한을 부여할 수 있으므로 가장 쉽게 설정할 수 있습니다.그렇지 않으면 OAuth 인증 및 권한을 조작해야 합니다.
이를 증명하는 요지는 다음과 같습니다.
https://gist.github.com/timrichardson/1154e29174926e462b7a
@David의 훌륭한 답변은 다음과 같습니다. 단, 일반적인 시도 없이 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()
오래된 문제인 것 같다.smtplib
인python2.7
모든 것이 잘 작동한다.
업데이트: 네,server.ehlo()
도움이 될 수도 있어요
2022년 2월 갱신:
Python을 사용하여 Gmail을 보낼 수 있도록 두 가지를 시도해 보십시오.
보안 수준이 낮은 앱 허용: ON ↓↓↓
Google 계정에 대한 액세스 허용: ON("계속"을 누릅니다) ↓↓↓
import smtplib
fromadd='from@gmail.com'
toadd='send@gmail.com'
msg='''hi,how r u'''
username='abc@gmail.com'
passwd='password'
try:
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo()
server.starttls()
server.login(username,passwd)
server.sendmail(fromadd,toadd,msg)
print("Mail Send Successfully")
server.quit()
except:
print("Error:unable to send mail")
NOTE:https://www.google.com/settings/security/lesssecureapps that should be enabled
import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login("fromaddress", "password")
msg = "HI!"
server.sendmail("fromaddress", "receiveraddress", msg)
server.quit()
언급URL : https://stackoverflow.com/questions/10147455/how-to-send-an-email-with-gmail-as-provider-using-python
'source' 카테고리의 다른 글
기능을 numpy 어레이에 매핑하는 가장 효율적인 방법 (0) | 2022.11.05 |
---|---|
create-react-app 4.0.3을 실행하고 있으며 최신 릴리스(5.0.0)보다 뒤처져 있습니다. (0) | 2022.11.05 |
JavaScript 개체를 표시하려면 어떻게 해야 합니까? (0) | 2022.11.05 |
unzip : "unzip"이라는 용어는 명령어 이름으로 인식되지 않습니다. (0) | 2022.11.05 |
Python에서 문자열을 소문자로 만들려면 어떻게 해야 하나요? (0) | 2022.11.05 |