Có khá nhiều cách để gửi email bằng Python, cho dù đó là thông qua thư viện của bên thứ 3 như với boto và SES hay thông qua giao thức email như SMTP. Mặc dù chủ đề sử dụng Python để gửi email có vẻ như đã được thực hiện xong, nhưng có rất nhiều cách khác nhau để thực hiện và rất nhiều vấn đề có thể xảy ra. Tôi nghĩ sẽ rất hữu ích nếu viết một hướng dẫn về cách gửi email bằng Gmail với tư cách là nhà cung cấp bằng Python
Giao thức SMTP
Điều này có thể không gây ngạc nhiên, nhưng tất nhiên Python đã có một thư viện cho phép bạn kết nối với máy chủ SMTP, giống như thư viện mà Gmail sử dụng. Thư viện này được gọi là smtplib và đi kèm với Python
SMTP [Giao thức truyền thư đơn giản] là giao thức cấp ứng dụng [trên TCP] được sử dụng để liên lạc với máy chủ thư từ các dịch vụ bên ngoài, chẳng hạn như ứng dụng email khách trên điện thoại của bạn. SMTP chỉ là một giao thức gửi, vì vậy bạn không thể thực sự truy xuất email với nó, bạn chỉ có thể gửi email, đó là điều chúng tôi sẽ tập trung vào trong bài viết này. Thay vào đó, nếu bạn muốn truy xuất email, thì bạn sẽ muốn kiểm tra giao thức IMAP [Giao thức truy cập thư Internet]
Tôi nên lưu ý rằng nhiều dịch vụ email, chẳng hạn như Gmail, thường không sử dụng SMTP trên máy chủ thư nội bộ của họ. SMTP thường chỉ được cung cấp dưới dạng giao diện hướng ra ngoài cho dịch vụ của họ thông qua máy chủ
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
2. Điều này chủ yếu được sử dụng bởi các ứng dụng email trên điện thoại hoặc máy tính của bạn [như Outlook, Thunderbird, v.v.]Mở kết nối
Như đã đề cập, Python thuận tiện đi kèm với
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
3, xử lý tất cả các phần khác nhau của giao thức, như kết nối, xác thực, xác thực và tất nhiên, gửi emailSử dụng thư viện này, có một vài cách khác nhau để bạn có thể tạo kết nối đến máy chủ thư của mình. Trong phần này, chúng ta sẽ tập trung vào việc tạo một kết nối đơn giản, không an toàn [điều này hiếm khi được sử dụng nếu có]. Kết nối này không được mã hóa và mặc định là cổng 25. Tuy nhiên, giao thức gửi thư thực sự sử dụng 587, đây là những gì chúng tôi sẽ sử dụng
Những kết nối này thực sự đơn giản để tạo với
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
3. Phiên bản không được mã hóa có thể được tạo bằngimport smtplib
try:
server = smtplib.SMTP['smtp.gmail.com', 587]
server.ehlo[]
except:
print 'Something went wrong...'
Và đó là nó. Thực sự không có gì nhiều hơn là chuyển địa chỉ máy chủ, cổng và gọi
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
5, xác định bạn đến máy chủ SMTP. Sử dụng đối tượng From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
6 này, giờ đây bạn có thể gửi email qua kết nối không an toànGhi chú. Bạn có thể chưa sẵn sàng để gửi email. Gmail áp đặt một số hạn chế đối với các kết nối SMTP như thế này. Xem phần "Xác thực bằng Gmail" bên dưới để biết thêm thông tin
Sử dụng kết nối an toàn
Khi kết nối SMTP được bảo mật qua TLS/SSL, nó được thực hiện qua cổng 465 và thường được gọi là SMTPS. Không cần phải nói, bạn phải luôn sử dụng kết nối an toàn
Có một vài cách khác nhau để bạn có thể bảo mật các kết nối SMTP của mình trong thư viện
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
3. Cách đầu tiên là trước tiên hãy tạo một kết nối không an toàn và sau đó nâng cấp lên TLS. Điều này được thực hiện bằng cách sử dụng phương pháp From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
1Lưu ý rằng mặc dù điều này rất giống với kết nối không an toàn trước đó mà chúng tôi đã tạo, nhưng điểm khác biệt duy nhất là chúng tôi đang sử dụng phương pháp
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
1 để nâng cấp kết nối thành an toàn.Tùy chọn khác của bạn là tạo kết nối SSL ngay từ đầu. Trong trường hợp này, bạn sẽ muốn sử dụng phương thức
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
3 để thay thếTrong số những khác biệt nhỏ khác, chúng tôi sử dụng cổng SMTPS [465] ngay lập tức, mặc dù bạn có thể bỏ qua tham số cổng này và dù sao thì
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
3 sẽ mặc định là 465Bây giờ chúng ta đã có kết nối, hãy tạo một email
Tạo Email
Về cốt lõi, email chỉ là các chuỗi văn bản được kết nối bằng các ký tự dòng mới. Hầu hết các email ít nhất sẽ có các trường "Từ", "Tới", "Chủ đề" và nội dung. Đây là một ví dụ đơn giản
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
Như bạn có thể thấy, mỗi dòng chứa một trường mới với dữ liệu của nó. Không có giao thức nhị phân, không có XML, không có JSON, chỉ có các chuỗi được phân tách bằng dòng
Một cách đơn giản để tham số hóa các trường này là sử dụng định dạng chuỗi trong Python
sent_from = '[email protected]'
to = ['[email protected]', '[email protected]']
subject = 'OMG Super Important Message'
body = 'Hey, what's up?\n\n- You'
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % [sent_from, ", ".join[to], subject, body]
Bây giờ, tất cả những gì bạn phải làm là chuyển chuỗi
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
5 đến From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
3, chúng tôi sẽ trình bày chuỗi này trong phần tiếp theo và bạn đã sẵn sàng để bắt đầuCó một số bước bạn cần thực hiện trước khi có thể gửi email qua Gmail bằng SMTP và bước này liên quan đến xác thực. Nếu bạn đang sử dụng Gmail làm nhà cung cấp, bạn cần yêu cầu Google cho phép bạn kết nối qua SMTP, đây được coi là phương thức "kém an toàn"
Bạn thực sự không thể đổ lỗi cho Google vì đã thiết lập nó theo cách này vì ứng dụng của bạn [hoặc một số ứng dụng bên thứ 3 khác] sẽ cần có mật khẩu văn bản gốc của bạn để ứng dụng này hoạt động, điều này chắc chắn không lý tưởng. Nó không giống như giao thức OAuth nơi phát hành mã thông báo có thể hủy bỏ, vì vậy họ phải tìm một cách khác để đảm bảo không có bên trái phép nào truy cập vào dữ liệu của bạn
Đối với nhiều nhà cung cấp dịch vụ email khác, bạn sẽ không cần thực hiện bất kỳ bước bổ sung nào mà tôi mô tả ở đây
Hãy xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, tiêu chuẩn được ngành chấp nhận và bao gồm bảng gian lận. Dừng các lệnh Git trên Google và thực sự tìm hiểu nó
Trước tiên, bạn sẽ muốn cho phép các ứng dụng kém an toàn hơn truy cập vào tài khoản của mình. Để biết hướng dẫn chi tiết về cách thực hiện việc này, bạn nên xem trang này
Cho phép các ứng dụng kém an toàn hơn truy cập vào tài khoản của bạn
Nếu bạn đã bật xác minh 2 bước trên tài khoản của mình thì bạn sẽ cần tạo mật khẩu dành riêng cho ứng dụng cho các ứng dụng kém an toàn hơn như thế này. Trong trường hợp đó, bạn sẽ cần làm theo hướng dẫn tại đây
Đăng nhập bằng mật khẩu ứng dụng
Và cuối cùng, nếu bạn vẫn nhận được
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
7 với mã lỗi là 534, thì bạn sẽ cần thực hiện thêm một bước nữa để điều này hoạt độngHiển thị Mở khóa Captcha
Tôi không phải thực hiện bước cuối cùng này cho các tài khoản của riêng mình, nhưng tôi đã đọc được rằng nó không thực sự hoạt động ngay lập tức. Có vẻ như sau khi bật các ứng dụng kém an toàn hơn, bạn có thể phải đợi vài phút trước khi thử liên kết 'Hiển thị hình ảnh mở khóa'. Nếu bạn gặp phải vấn đề này và tìm ra cách khắc phục tốt, vui lòng cho chúng tôi biết trong phần nhận xét
Đối với mã Python thực tế, tất cả những gì bạn cần làm là gọi phương thức
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
8import smtplib
gmail_user = '[email protected]'
gmail_password = '[email protected]!'
try:
server = smtplib.SMTP_SSL['smtp.gmail.com', 465]
server.ehlo[]
server.login[gmail_user, gmail_password]
except:
print 'Something went wrong...'
gửi thư điện tử
Bây giờ bạn đã thiết lập kết nối SMTP và ủy quyền ứng dụng của mình với Google, cuối cùng bạn có thể sử dụng Python để gửi email bằng Gmail
Sử dụng chuỗi email chúng tôi đã tạo ở trên và đối tượng
From: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
6 được kết nối/xác thực, bạn cần gọi phương thức sent_from = '[email protected]'
to = ['[email protected]', '[email protected]']
subject = 'OMG Super Important Message'
body = 'Hey, what's up?\n\n- You'
email_text = """\
From: %s
To: %s
Subject: %s
%s
""" % [sent_from, ", ".join[to], subject, body]
0. Đây là mã đầy đủ, bao gồm các phương thức đóng kết nốiFrom: [email protected]
To: [email protected], [email protected]
Subject: OMG Super Important Message
Hey, what's up?
- You
1Sự kết luận
Ngoài các bước ủy quyền dành riêng cho Gmail [liên quan đến các ứng dụng kém an toàn hơn, v.v.], mã này sẽ hoạt động đối với bất kỳ nhà cung cấp dịch vụ email nào khác hỗ trợ truy cập SMTP, giả sử bạn có đúng địa chỉ máy chủ và cổng. Nếu bạn thấy rằng các nhà cung cấp khác đặt ra các hạn chế đặc biệt đối với quyền truy cập SMTP giống như Google, hãy cho chúng tôi biết. Chúng tôi muốn bao gồm càng nhiều thông tin càng tốt ở đây
Bạn có lập trình gửi email bằng SMTP không?
Tài nguyênChỉnh sửa. Cảm ơn cropr [trong các nhận xét] đã chỉ ra rằng Gmail áp đặt một số hạn chế đối với những người gửi email bằng SMTP. Tài khoản miễn phí bị giới hạn ở 500 email mỗi ngày và bị giới hạn tốc độ ở khoảng 20 email mỗi giây
Nếu bạn cho rằng mình sẽ vượt quá các giới hạn này thì bạn có thể muốn thiết lập máy chủ SMTP của riêng mình hoặc sử dụng các dịch vụ như AWS SES hoặc Sendgrid