2011-12-09 24 views
5

Tôi đang cố gắng gửi email bằng python. Đây là mã của tôi.Gửi email với python smtplib không hoạt động, nhầm lẫn về trường "từ"

import smtplib 

if __name__ == '__main__': 
SERVER = "localhost" 

FROM = "[email protected]" 
TO = ["[email protected]"] # must be a list 

SUBJECT = "Hello!" 

TEXT = "This message was sent with Python's smtplib." 

# Prepare actual message 

message = """\ 
From: %s 
To: %s 
Subject: %s 

%s 
""" % (FROM, ", ".join(TO), SUBJECT, TEXT) 

# Send the mail 

server = smtplib.SMTP(SERVER) 
server.sendmail(FROM, TO[0], message) 
server.quit() 
print "Message sent!" 

Thao tác này không xảy ra lỗi, nhưng không có email nào được gửi đến [email protected].

Câu hỏi

Một điều tôi không hiểu về mã này --- những gì hạn chế nào để tôi có khi thiết lập các lĩnh vực FROM?

Bằng cách nào đó tôi có thể nói rằng đó là từ máy tính của tôi?

Có gì để ngăn tôi giả mạo email của người khác?

Hoặc tôi có tự do làm điều đó không?

+1

lý do TO [0] và không TO? – sherpya

+0

tôi nghĩ có lẽ tôi đã không được giả sử để vượt qua trong một danh sách, nhưng tôi đoán đó không phải là vấn đề. (Tôi đã thử cả hai cách, không tạo sự khác biệt) – WillHaack

+0

nó làm việc cho tôi, in kết quả của hàm sendmail nó phải là một dict trống, cũng thử server.set_debuglevel (1) – sherpya

Trả lời

6

Điều này không có lỗi, nhưng không có email nào được gửi tới [email protected]

Điều này thường có nghĩa là thư được chuyển tới MTA (máy chủ thư) của bạn trên 'localhost', nhưng máy chủ này không thể chuyển tiếp nó tới gmail. nó có thể đã cố gắng gửi một tin nhắn bị trả lại đến "[email protected]" và điều đó cũng không thành công. hoặc nó đã gửi tin nhắn thành công nhưng nó đã nằm trong thư mục spam gmails (thư có thể kích hoạt các quy tắc spam vì nó thiếu tiêu đề ngày)

Một điều tôi không hiểu về mã này --- Tôi có khi thiết lập trường FROM?

nó phải là một địa chỉ email hợp lệ cú pháp

Tôi bằng cách nào đó có thể nói rằng đó là từ máy tính của tôi?

không. nhưng đó có thể là vấn đề tại sao nó không được giao. là máy tính của bạn trên IP nhà/động/quay số? gmail (và nhiều nhiều nhà cung cấp khác) không chấp nhận thư từ các IP như vậy. HELO của máy chủ thư của bạn có thể sai, cài đặt DNS có thể không chính xác, v.v. bạn cần phải kiểm tra nhật ký máy chủ. bạn có thể phải cấu hình máy chủ thư địa phương của bạn để chuyển tiếp tin nhắn thông qua một máy chủ thông minh thay vì cố gắng liên lạc trực tiếp với máy chủ đích.

Có gì để ngăn tôi lừa đảo email của người khác?

không nhiều, đó là lý do tại sao chúng tôi có quá nhiều spam từ địa chỉ giả mạo. những thứ như SPF/DKIM có thể giúp một chút, nhưng bản thân giao thức SMTP không cung cấp sự bảo vệ chống giả mạo.

Hoặc tôi có tự do làm điều đó không?

về mặt kỹ thuật có.

0

Vâng, vì bạn không chỉ định chính xác loại máy chủ email bạn đang sử dụng và cài đặt của máy chủ, có một số điều có thể xảy ra ở đây. Trước hết, bạn cần phải chỉ định HOST và PORT của máy chủ của bạn và kết nối với nó. Ví dụ:

HOST = "smtp.gmail.com" 
PORT = "587" 
SERVER = smtplib.SMTP() 
SERVER.connect(HOST, PORT) 

Sau đó, bạn cần chỉ định người dùng và mật khẩu của mình cho máy chủ lưu trữ này. Ví dụ:

USER = "[email protected]" 
PASSWD = "123456" 

Một số máy chủ yêu cầu giao thức TLS. Ví dụ:

SERVER.starttls() 

Sau đó, bạn cần đăng nhập. Ví dụ:

SERVER.login(USER,PASSWD) 

Chỉ khi đó bạn có thể gửi email với sendmail của bạn. Ví dụ này hoạt động khá tốt trong hầu hết các máy chủ phổ biến. Nếu bạn đang sử dụng, có vẻ như, máy chủ của riêng bạn, không có nhiều thay đổi bạn cần áp dụng. Nhưng bạn cần biết loại máy chủ này có yêu cầu gì.

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