2015-05-30 17 views
6

Tôi cố gắng để gửi một email đơn giản với pythonLàm thế nào để gửi mail với Python

import smtplib 

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

msg = "Hello world" 
server.sendmail("[email protected]", "[email protected]", msg) 
server.quit() 

Nhưng tôi nhận được err này:

server.login("[email protected]", "psw") 

File "C:\Python\lib\smtplib.py", line 652, in login 

raise SMTPAuthenticationError(code, resp) 

smtplib.SMTPAuthenticationError: (534, b'5.7.14 <https://accounts.google.com/ContinueSignIn?sarp=1&scc=1&plt=AKgnsbuxb\n5.7.14 4i2u8qU8V3jgf6uGv8da1RAGPJyctRvIFy_kjai6aKVx_B6qVhoz_dzFpvfPC18H-jeM6K\n5.7.14 cnm2HVuq-wr-uw59hD31ms-cxMmnZuq6Z3_liDaDmu8_UqaiUwR4FUiuX2i5pPdQjJzFvv\n5.7.14 4VrEF5XT4ol2iN17gnB_jITpwzsjH9Ox3NCNcfl7SriHr5m7esc15PWI0CG_2CTlyh7RxW\n5.7.14 XhoJPajs8GMd-khOQWUqucywfrfo> Please log in via your web browser and\n5.7.14 then try again.\n5.7.14 Learn more at\n5.7.14 https://support.google.com/mail/bin/answer.py?answer=78754 ef10sm13614207wjd.49 - gsmtp') 

Tôi nên làm gì?

Cảm ơn

+0

Bạn đã thử đăng nhập bằng trình duyệt của mình và thử lại khi thông báo lỗi cho biết? Bạn đã thử nghiệm sơ đồ đăng nhập vào thiết bị đầu cuối chưa? – ForceBru

+0

tài khoản gmail của bạn có xác minh 2 bước đang hoạt động không ??? – Hackaholic

+0

@ForceBru, Có, tôi đã thử đăng nhập qua trình duyệt và trong khi tôi đăng nhập để dùng thử - nó không hoạt động. Tôi cũng đã thử các dòng tương tự thông qua thiết bị đầu cuối và cũng không thể làm điều đó .. – Yura

Trả lời

7

Có vẻ như bạn cần một thứ gì đó mà Google gọi mật khẩu ứng dụng.

Về cơ bản, bạn tạo mật khẩu gồm 16 chữ số, duy nhất cho ứng dụng của bạn. Bạn nhập mật khẩu cụ thể này vào chương trình python, thay vì mật khẩu bạn thường xuyên sử dụng để đăng nhập vào tài khoản Google của mình.

Điều này cho phép bạn vẫn tận hưởng những lợi ích của xác minh 2 bước trong khi cũng có thể sử dụng các ứng dụng của bên thứ ba, chẳng hạn như chương trình python của riêng bạn.

Dưới đây là các hướng dẫn từ Google về cách tạo ra như một mật khẩu ứng dụng: https://support.google.com/accounts/answer/185833?hl=en

+0

Cảm ơn bạn rất nhiều vì đã giải thích chi tiết và trả lời. Điều này đã làm việc! – Yura

3

bạn có thể sử dụng mã này:

import smtplib 

session = smtplib.SMTP('smtp.gmail.com', 587) 
session.ehlo() 
session.starttls() 
session.login('[email protected]',' password') 
headers = "\r\n".join(["from: " + '[email protected]', 
         "subject: " + "test", 
         "to: " + '[email protected]', 
         "mime-version: 1.0", 
         "content-type: text/html"]) 

# body_of_email can be plaintext or html!      
content = headers + "\r\n\r\n" + "body_of_email" 
session.sendmail('[email protected]', '[email protected]', content) 

chỉ nhớ nếu email của bạn là gmail sau khi chạy đầu tiên bạn nhận được một lỗi. sau đó bạn nên đăng nhập vào tài khoản email của bạn và chấp nhận quyền truy cập vào tài khoản của bạn từ ứng dụng khác (bạn sẽ nhận được tin thông báo sau khi đăng nhập)

+0

Cảm ơn bạn! Tôi đã tìm thấy câu trả lời ở trên. :) – Yura

+0

@SaraSantana Xin hãy xem [yagmail] (https://github.com/kootenpv/yagmail), nó sẽ làm cho nó rất dễ dàng để gửi email! – PascalVKooten

2

Bạn có thể sử dụng một API email miễn phí như mailgun:

import requests 

def send_simple_message(target): 
    return requests.post(
     "https://api.mailgun.net/v3/samples.mailgun.org/messages", 
     auth=("api", "key-3ax6xnjp29jd6fds4gc373sgvjxteol0"), 
     data={"from": "Excited User <[email protected]>", 
       "to": [target], 
       "subject": "Hello", 
       "text": "Testing some Mailgun awesomeness!"}) 

send_simple_message('[email protected]') 

Sử dụng một API như thế này tránh được vấn đề xác thực tài khoản cá nhân.

Xem thêm: This question để biết về việc sử dụng smtplib

+0

Cảm ơn bạn! Tôi đã tìm thấy câu trả lời ở trên. :) – Yura

+0

@Yura. Yup. Tôi vẫn nghĩ rằng việc thêm các giải pháp thay thế sẽ cải thiện chất lượng của câu hỏi cho người đọc trong tương lai. Vui vì bạn đã nhận được câu trả lời của bạn! –

1

Yea, giống như câu trả lời được đăng, nó là vấn đề xác thực :)

Tôi muốn giúp thêm cho bạn gửi email bằng tư vấn cho gói yagmail (tôi là người duy trì, xin lỗi vì quảng cáo, nhưng tôi cảm thấy nó thực sự có thể giúp ích!). Lưu ý rằng tôi cũng đang duy trì danh sách các lỗi phổ biến ở đó, chẳng hạn như lỗi xác thực.

Mã toàn cho bạn sẽ là:

import yagmail 
yag = yagmail.SMTP('user', 'pw') 
yag.send(contents = msg) 

Lưu ý rằng tôi cung cấp giá trị mặc định cho tất cả các đối số, ví dụ nếu bạn muốn gửi cho chính mình, bạn có thể bỏ qua "to = [email protected]", nếu bạn không muốn một chủ đề, bạn cũng có thể bỏ qua nó.

Hơn nữa, mục tiêu cũng giúp bạn dễ dàng đính kèm mã html hoặc hình ảnh (và các tệp khác).

Nơi bạn đặt nội dung bạn có thể làm một cái gì đó như:

contents = ['Body text, and here is an embedded image:', 'http://somedomain/image.png', 
      'You can also find an audio file attached.', '/local/path/song.mp3'] 

Wow, thật dễ dàng để gửi file đính kèm!Điều này sẽ giống như 20 dòng không có yagmail;)

Ngoài ra, nếu bạn thiết lập một lần, bạn sẽ không bao giờ phải nhập lại mật khẩu (và lưu trữ mật khẩu một cách an toàn). Trong trường hợp của bạn, bạn có thể làm điều gì đó như:

import yagmail 
yagmail.SMTP().send(contents = contents) 

ngắn gọn hơn nhiều!

Tôi muốn mời bạn xem github hoặc cài đặt trực tiếp với pip install yagmail.

Các vấn đề liên quan