จะส่งอีเมลกับ Gmail ในฐานะผู้ให้บริการโดยใช้ Python ได้อย่างไร


289

ฉันพยายามส่งอีเมล (Gmail) โดยใช้ python แต่ฉันได้รับข้อผิดพลาดดังต่อไปนี้

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()

16
คำถามนี้ควรถูกปลดล็อคในขณะนี้ว่า google กำลังเคลื่อนไปสู่ ​​API ภายในสำหรับการส่งข้อความผ่าน gmail การย้ายครั้งนี้ทำให้ได้ทั้งหมด แต่เป็นหนึ่งในคำตอบที่ล้าสมัยและคำตอบที่เกี่ยวข้องอย่างหนึ่งคือการแก้ไขปัญหาอย่างแท้จริง
แอนดรู

นอกจากนี้สำหรับผู้ใช้ VPN หากปัญหายังคงอยู่ให้ปิด VPN ของคุณ ที่ทำงานให้ฉัน
พอล

คำตอบ:


211

คุณต้องพูดEHLOก่อนที่จะวิ่งเข้าไปหา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"
  ])

2
Invoke server.sendmail (fromaddr, toaddrs, msg) พารามิเตอร์ที่สอง, toaddrs ต้องเป็นรายการ, toaddrs = ['user_me@gmail.com']
Massimo Fazzolari

14
เมื่อวันที่สิงหาคม 2014 นี้เพิ่ม smtplib.SMTPAuthenticationError: (534, '5.7.9 ต้องใช้รหัสผ่านเฉพาะแอปพลิเคชัน
anon58192932

7
สำหรับฉันฉันต้องเปิดใช้งานรหัสผ่าน 'แอป' เพื่อลงชื่อเข้าใช้ด้วยบัญชี @google เพื่อส่งอีเมลผ่าน python: support.google.com/accounts/answer/…
anon58192932

1
นี่คือลิงก์เกี่ยวกับวิธีส่งจดหมายหลาย ๆ คน: stackoverflow.com/questions/8856117/…
anon58192932

1
ฉันเคยเข้าสู่เซิร์ฟเวอร์ SMTP โดย telnet และส่งEHLOโดยพิมพ์ผิด หลังจากที่ฉันลอง HELO หลายครั้ง แต่การตอบสนองนั้นแตกต่างกัน ใช้เวลาหลายชั่วโมงกว่าจะเข้าใจว่าจริง ๆ แล้ว EHLO เป็นคำสั่งที่ SMTP เข้าใจและฉันพิมพ์ผิด
Shiplu Mokaddim

297
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'

2
ขอบคุณตัวอย่างที่ดีมาก หนึ่งคิดว่าฉันสังเกตเห็นว่าถ้าฉันต้องการใช้การเชื่อมต่อ SSL ฉันต้องลบ server.starttls ()
Dowlers

18
ไม่ทำงานอีกต่อไปโชคไม่ดี: smtplib.SMTPAuthenticationError: (534, '5.7.14 < accounts.google.com/… ... โปรดลงชื่อเข้าใช้ผ่านทางเว็บเบราว์เซอร์และ \ n5.7.14 จากนั้นลองอีกครั้ง \ n5.7.14 เรียนรู้ เพิ่มเติมได้ที่ \ n5.7.14 support.google.com/mail/bin/answer.py?answer=78754 ... จากนั้นฉันได้รับอีเมลจาก google ว่ามีความพยายามในการเชื่อมต่อที่น่าสงสัย
royskatt

13
@royskatt - สิ่งที่คุณต้องทำคือสร้างรหัสผ่านสำหรับแอปและใช้แทนรหัสผ่านบัญชีของคุณ สร้างรหัสผ่านสำหรับแอปได้ที่นี่: security.google.com/settings/security/apppasswords
Jared

15
@royskatt: ฉันเพิ่งได้รับการแก้ไขสำหรับปัญหาที่คุณเผชิญ Google มีการตั้งค่าให้อนุญาตการเข้าถึงแอปที่มีความปลอดภัยน้อยกว่าคุณเพียงแค่เปิด 'เปิด' คุณสามารถไปถึงได้จาก: Google -> บัญชีของฉัน -> การลงชื่อเข้าใช้และความปลอดภัย -> แอพและไซต์ที่เชื่อมต่อ -> เลื่อนลงและคุณจะพบ 'อนุญาตแอปที่ปลอดภัยน้อย'
shaleen mohan

2
หาก gmail ของคุณปลอดภัยด้วยการตรวจสอบสิทธิ์แบบสองปัจจัยคุณต้องสร้างรหัสผ่านเฉพาะแอปพลิเคชัน -> จากนั้นใช้รหัสผ่านแอปนั้นในรหัสตัวอย่างด้านบน (นี่เป็นสิ่งที่สำคัญมากเพราะคุณไม่ต้องจดรหัสผ่านไว้ ใน cleartext และคุณสามารถเพิกถอนรหัสผ่านของแอปได้ตลอดเวลา)
Trevor Boyd Smith

136

ฉันพบปัญหาที่คล้ายกันและพบคำถามนี้ ฉันได้รับข้อผิดพลาดการรับรองความถูกต้อง SMTP แต่ชื่อผู้ใช้ / รหัสผ่านของฉันถูกต้อง นี่คือสิ่งที่แก้ไขมัน ฉันอ่านสิ่งนี้:

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

สรุป google ไม่อนุญาตให้คุณลงชื่อเข้าใช้ผ่าน 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 นาทีในการลงทะเบียนแอปใหม่ของคุณ ดังนั้นให้ลองลงชื่อเข้าใช้อีกครั้งในตอนนี้

UPDATE : ดูเหมือนว่ามันจะไม่ทำงานทันทีคุณอาจติดขัดในขณะที่เกิดข้อผิดพลาดใน 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' อีกครั้ง จากประสบการณ์ของผู้ใช้อาจใช้เวลาถึงหนึ่งชั่วโมงก่อนที่การเปลี่ยนแปลงจะเริ่มขึ้นจากนั้นลองกระบวนการลงชื่อเข้าใช้อีกครั้ง


3
ใช่ขอบคุณ ! เกิดขึ้นขณะใช้ขวดแก้ว
Giannis

1
ขอบคุณคนปัญหาเดียวสำหรับฉัน: accounts.google.com/DisplayUnlockCaptcha
ขีด จำกัด isa

6
นอกจากนี้โปรดเว้นครึ่งชั่วโมงถึงหนึ่งชั่วโมงเพื่อให้การตั้งค่ามีการเปลี่ยนแปลง ฉันสร้างบัญชีใหม่ปิดการใช้งานความปลอดภัยที่เพิ่มทั้งหมดและยังคงมีข้อผิดพลาดเดียวกัน ประมาณหนึ่งชั่วโมงต่อมาก็ทำงานได้ทั้งหมด
jkgeyti

2
ไม่สามารถเปิดใช้งานแอปที่มีความปลอดภัยน้อยลงหากคุณเปิดใช้งาน "การยืนยันแบบสองขั้นตอน" ตัวเลือกที่ดีที่สุดและปลอดภัยที่สุดคือการเปิดใช้งาน "apppassword" security.google.com/settings/security/apppasswordsตามที่แนะนำแล้วและใช้งานได้อย่างมีเสน่ห์
Omiod

2
เมื่อฉันไปตามลิงก์ apppasswords บัญชี Google ทั้งหมดของฉันจะได้รับข้อผิดพลาด "การตั้งค่าที่คุณกำลังค้นหาไม่พร้อมใช้งานสำหรับบัญชีของคุณ"
Suzanne

18

คุณอยู่กับ 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')

33
หากคลาสของคุณมีเพียงสองวิธีวิธีหนึ่งคือ __init__ เพียงใช้ฟังก์ชัน
JoeQuery

คุณจะเพิ่มไฟล์แนบโดยใช้วิธีนี้ได้อย่างไร
sgerbhctim

การใช้คลาสจะดีถ้าคุณต้องการเริ่มต้นไคลเอ็นต์และส่งไปยังส่วนอื่น ๆ ของรหัสแทนที่จะส่งผ่านอีเมลและรหัสผ่าน หรือถ้าคุณต้องการส่งข้อความหลายข้อความโดยไม่ต้องผ่านอีเมลและรหัสผ่านในแต่ละครั้ง
Sami เริ่ม

15

งานนี้

สร้างรหัสผ่านแอป Gmail!

หลังจากที่คุณสร้างแล้วสร้างไฟล์ที่เรียกว่า 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 = "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)

ดังนั้นหากคุณประสบความสำเร็จจะเห็นภาพเช่นนี้:

ฉันทดสอบโดยส่งอีเมลจากและถึงตัวฉันเอง

ส่งอีเมลสำเร็จแล้ว

หมายเหตุ: ฉันเปิดใช้งานการยืนยันแบบสองขั้นตอนในบัญชีของฉันแล้ว รหัสผ่านสำหรับแอปใช้งานได้กับสิ่งนี้! (สำหรับการตั้งค่า gmail smtp คุณต้องไปที่https://support.google.com/accounts/answer/185833?hl=thและทำตามขั้นตอนด้านล่าง)

การตั้งค่านี้ไม่สามารถใช้ได้สำหรับบัญชีที่เปิดใช้งานการยืนยันแบบ 2 ขั้นตอน บัญชีดังกล่าวต้องการรหัสผ่านเฉพาะแอปพลิเคชันสำหรับการเข้าถึงแอปที่ปลอดภัยน้อยกว่า

การเข้าถึงแอปที่ปลอดภัยน้อยลง ... การตั้งค่านี้ไม่สามารถใช้ได้กับบัญชีที่เปิดใช้งานการยืนยันแบบ 2 ขั้นตอน


1
ทางออกที่ยอดเยี่ยมและอธิบายได้ดีในรหัส ขอบคุณเจย์ชื่นชมมาก คำถามโง่ ๆ : คุณรู้หรือไม่ว่าการส่งอีเมลถึงขีด จำกัด สูงสุดต่อวันคือเท่าใด (ด้วย gmail)
แองเจโล

ขอบคุณ @Angelo แต่ใช่มีข้อ จำกัด GMail = 500 อีเมลหรือผู้รับ 500 คน / วันอ้างอิง: support.google.com/mail/answer/22839 G SUITE นั้นแตกต่างกันและ 2,000 ข้อความ / วันและสามารถพบได้ที่นี่: การสนับสนุน .google.com / a / answer / 166852 ขอให้โชคดี!
JayRizzo

2
โพสต์อื่น ๆ ทั้งหมดเป็นโพสต์ที่เก่ากว่าและอาจไม่ทำงาน แต่นี่ใช้งานได้ 100% สร้างรหัสผ่านสำหรับแอป ขอบคุณสำหรับคำตอบ
Shubh

1
ฉันแปลกใจนิดหน่อยที่โซลูชันนี้ไม่มี upvotes มากขึ้น ฉันไม่ได้พยายามทุกคนอื่น ๆ แต่ฉันได้พยายามหลายและมีเพียงคนนี้ทำงานออกจากกล่องด้วย 0 tinkering
mcouthon

14

คุณสามารถค้นหาได้ที่นี่: 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())

2
บวก 1 เพราะเป็นการดีกว่าที่จะสร้าง MIME มากกว่าเพื่อเข้ารหัสสตริงรูปแบบของคุณเอง MIMEMultipart จำเป็นสำหรับข้อความธรรมดาหรือไม่? หรือแก้ไขข้อผิดพลาดต่อไปนี้: stackoverflow.com/a/6270987/895245
Ciro Santilli 郝海东冠状病病六四事件法轮功

คุณยกตัวอย่างตัวแปรอีเมลที่ไหน
madcat

11

ไม่เกี่ยวข้องโดยตรง แต่ก็ยังมีค่าชี้ให้เห็นคือแพคเกจของฉันพยายามที่จะทำให้การส่งข้อความ 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!')

สำหรับแพ็คเกจ / การติดตั้งโปรดดูgitหรือpipสามารถใช้ได้กับ Python 2 และ 3


9

นี่คือตัวอย่าง Gmail API แม้ว่าจะซับซ้อนกว่านี้เป็นวิธีเดียวที่ฉันพบว่าใช้งานได้ในปี 2019 ตัวอย่างนี้ถ่ายและแก้ไขจาก:

https://developers.google.com/gmail/api/guides/sending

คุณจะต้องสร้างโครงการด้วยอินเทอร์เฟซ API ของ Google ผ่านเว็บไซต์ของพวกเขา ต่อไปคุณจะต้องเปิดใช้ GMAIL API สำหรับแอปของคุณ สร้างข้อมูลรับรองแล้วดาวน์โหลดเครดิตเหล่านั้นบันทึกเป็นหนังสือรับรอง

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()

smtplib ไม่ปลอดภัยต่อเธรดอย่างเต็มที่ดังนั้นจึงมีปัญหาในการส่งข้อความพร้อมกัน นี่คือแนวทางที่ถูกต้อง
dsbajna

2

ตอนนี้มี API ของ Gmail ซึ่งให้คุณส่งอีเมลอ่านอีเมลและสร้างร่างจดหมายผ่าน REST ซึ่งแตกต่างจากการโทรด้วย SMTP ซึ่งไม่ใช่การบล็อกซึ่งอาจเป็นสิ่งที่ดีสำหรับ webservers แบบใช้เธรดที่ส่งอีเมลในเธรดการร้องขอ (เช่น python webservers) API นั้นค่อนข้างมีประสิทธิภาพ

  • แน่นอนว่าควรส่งอีเมลไปยังคิวที่ไม่ใช่เว็บเซิร์ฟเวอร์ แต่มีตัวเลือกที่ดี

เป็นการตั้งค่าที่ง่ายที่สุดหากคุณมีสิทธิ์ผู้ดูแลระบบ Google Apps ในโดเมนเพราะคุณสามารถให้สิทธิ์แบบครอบคลุมแก่ลูกค้าของคุณ ไม่เช่นนั้นคุณต้องเล่นซอกับการตรวจสอบสิทธิ์ OAuth

นี่คือส่วนสำคัญแสดงให้เห็นถึงมัน:

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


2

คำตอบที่ยอดเยี่ยมจาก @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()

2

เปิดใช้งานแอปที่ปลอดภัยน้อยลงในบัญชี 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...')

1
คำตอบที่ยอดเยี่ยมจริงๆ หนึ่งในพวงที่ดีที่สุดคือความกระชับ ขอบคุณ.
บรูซดีน

ขอบคุณ Pedro คำตอบของคุณแก้ไขได้ Btw สำหรับทุกคนที่ใช้ Gsuite พร้อมชื่อแทนหลายรายการ เพียงแค่เพิ่มนามแฝงในบัญชี Gmail ของคุณต่อไปนี้support.google.com/mail/answer/22370?hl=enและคุณสามารถส่งโดยใช้นามแฝงโดยการแทนที่ด้วย<{gmailUser}> <YourAlias>
LucSpan

1

smtplibดูเหมือนว่าปัญหาของเดิม ในpython2.7ทุกอย่างทำงานได้ดี

อัปเดต : ใช่แล้วserver.ehlo()ยังสามารถช่วยได้


-1
    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

ฉันกำลังโพสต์รหัสง่ายๆที่จะทำวิธีการส่งอีเมลจากบัญชี Gmail หากคุณต้องการข้อมูลใด ๆ แล้วแจ้งให้เราทราบ ฉันหวังว่ารหัสจะช่วยให้ผู้ใช้ทุกคน
Shyam Gupta

-2
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()

รหัสง่าย ๆ ในการส่งอีเมลผ่าน gmail โดยใช้รหัสหลาม จากที่อยู่คือ gmailID ของคุณและผู้รับคือที่อยู่อีเมลซึ่งคุณส่งจดหมาย
Sam Divya Kumar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.