tra-loi-cau-hoi-phat-trien-web.com

Làm thế nào để gửi thư trực tiếp đến máy chủ SMTP mà không cần xác thực?

Tôi muốn gửi email trực tiếp từ tập lệnh đến tài khoản email Gmail, bằng cách kết nối trực tiếp với smtp.gmail.com.

Tuy nhiên, tôi không muốn có mật khẩu gmail trong tập lệnh. Từ những gì tôi đã đọc, có vẻ như Gmail yêu cầu xác thực trước khi nó sẽ gửi bất kỳ thư nào, kể cả cho người dùng của chính họ.

Câu hỏi của tôi là, làm thế nào thư đến từ một máy chủ SMTP khác được gửi, vì máy chủ SMTP đó sẽ không có thông tin đăng nhập Gmail. Có phải Gmail chỉ yêu cầu xác thực cho người gửi "ẩn danh" và vì tập lệnh của tôi đang chạy trên máy tính cá nhân, nên nó có độ bảo mật cao hơn? Đây là tập lệnh python tôi đang chạy:

import smtplib
import email
msg = email.message.Message()
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "Test message"
server = smtplib.SMTP("smtp.gmail.com",587)
server.starttls()
server.ehlo_or_helo_if_needed()
try:
    failed = server.sendmail("[email protected]","[email protected]", msg.as_string())
    server.close()
except Exception as e:
    print(e)

Khi tôi chạy tập lệnh này, đầu ra là:

(530, b'5.5.1 Authentication Required. Learn more at
5.5.1 http://support.google.com/mail/bin/answer.py?answer=14257 fw5sm21125889wib.0', '[email protected]')

Câu hỏi của tôi là, làm thế nào để các máy chủ SMTP bên ngoài tránh được vấn đề này? Và có phải bất cứ điều gì họ có thể sao chép trong tập lệnh cục bộ hoặc yêu cầu bản ghi DNS ngược, bản ghi SPF, v.v.?

19
janak

Bạn có thể sử dụng một số máy chủ SMTP bên ngoài mà không cần xác thực (hoặc SMTP cục bộ), nhưng tin nhắn đã gửi sẽ bị bộ lọc thư rác của Google bắt gặp vì tin nhắn ["Từ"]@ google. com, trong khi SMTP thực tế không smtp.gmail.com.

Các máy chủ SMTP đó cũng phải có vùng đảo ngược chính xác trong DNS của ISP và nếu không thì smtp này sẽ bị chặn bởi google.

10
maxsocl

Đó là một câu hỏi thực sự tốt, và tôi đang trả lời nội tuyến.

Tôi muốn gửi email trực tiếp từ tập lệnh đến tài khoản email Gmail, bằng cách kết nối trực tiếp với smtp.gmail.com.

Trước hết smtp.gmail.com không phải là máy chủ thư chấp nhận thư (từ các máy chủ thư khác), mà thay vào đó cho phép Gmail người dùng đăng nhập và từ đó gửi hoặc kiểm tra email. Nếu chúng tôi muốn tìm hiểu các mailervers Gmail chấp nhận thư từ các mailervers khác. Chúng ta có thể chạy cmd sau trên thiết bị đầu cuối:

Dig mx gmail.com +short

đầu ra :

10 alt1.gmail-smtp-in.l.google.com.
40 alt4.gmail-smtp-in.l.google.com.
5 gmail-smtp-in.l.google.com.
30 alt3.gmail-smtp-in.l.google.com.
20 alt2.gmail-smtp-in.l.google.com. 

Từ gmail-smtp-in.l.google.com. có giá trị thấp nhất là 5 chúng tôi sử dụng nó làm máy chủ thư ưa thích

Tuy nhiên, tôi không muốn có mật khẩu gmail trong tập lệnh. Từ những gì tôi đã đọc, có vẻ như Gmail yêu cầu xác thực trước khi nó sẽ gửi bất kỳ thư nào, kể cả cho người dùng của chính họ.

Chính xác một người sử dụng smtp.gmail.com để đăng nhập và gửi/kiểm tra email đến/từ tài khoản tương ứng của họ, do đó chúng tôi yêu cầu thông tin đăng nhập của người dùng. Tuy nhiên, chúng tôi không cần thông tin đăng nhập email đến máy chủ thư của nó, ví dụ gmail-smtp-in.l.google.com (Ví dụ bên dưới)

Câu hỏi của tôi là, làm thế nào thư đến từ một máy chủ SMTP khác được gửi, vì máy chủ SMTP đó sẽ không có thông tin đăng nhập Gmail. Có phải Gmail chỉ yêu cầu xác thực cho người gửi "ẩn danh" và vì tập lệnh của tôi đang chạy trên máy tính cá nhân, nên nó có độ bảo mật cao hơn? Đây là tập lệnh python tôi đang chạy:

Như tôi đã nói rõ từ cuộc thảo luận ở trên, chúng tôi không cần thông tin đăng nhập Gmail để kết nối với máy chủ thư Gmail, tuy nhiên nếu chúng tôi kết nối với máy chủ thư Gmail bằng máy tính cá nhân, chúng tôi có thể tránh xa việc gửi một vài email, nhưng để gửi nhiều email hơn, chúng ta cần xây dựng danh tiếng và trách nhiệm của tên miền bằng cách sử dụng DKIM, SPF, vv (Đó là một phổ hoàn toàn khác).

Tập lệnh python sau đây gửi email đến tài khoản gmail mà không cần xác thực.

import smtplib

fromaddr = '[email protected]'
toaddrs  = ['[email protected]']
msg = '''
    From: {fromaddr}
    To: {toaddr}
    Subject: testin'     
    This is a test 
    .
'''

msg = msg.format(fromaddr =fromaddr, toaddr = toaddrs[0])
# The actual mail send
server = smtplib.SMTP('gmail-smtp-in.l.google.com:25')
server.starttls()
server.ehlo("example.com")
server.mail(fromaddr)
server.rcpt(toaddrs[0])
server.data(msg)
server.quit()  

Hoặc thử đoạn trích Telnet sa

telnet gmail-smtp-in.l.google.com 25

HELO sendingdomain.com

MAIL FROM:<[email protected]>

RCPT TO:<[email protected]>

DATA
From: <[email protected]>
To: <[email protected]>
Subject: Just a test email

The body of the mail goes here.          
.

QUIT
32
MaK

Bạn không thể sử dụng gmail smtp-server mà không cần xác thực. Đó là một chính sách của google. Bạn cần nhập mật khẩu tài khoản của bạn. Nhưng có một cách khác. Bạn có thể sử dụng GAE (Google App Engine) với API Gmail. Bằng cách này bạn có thể gửi tin nhắn trực tiếp.

1
SkyFox