2014-06-17 15 views
11

Tôi đã sử dụng python để gửi email bằng máy chủ SMTP bên ngoài. Trong đoạn code dưới đây, tôi đã thử sử dụng gmail SMTP để gửi email từ một id gmail tới một số id khác. Tôi đã có thể sản xuất đầu ra với mã dưới đây.gửi thư nặc danh từ máy tính cục bộ

import smtplib 
from email.MIMEText import MIMEText 
import socket 


socket.setdefaulttimeout(None) 
HOST = "smtp.gmail.com" 
PORT = "587" 
sender= "[email protected]" 
password = "pass" 
receiver= "[email protected]" 

msg = MIMEText("Hello World") 

msg['Subject'] = 'Subject - Hello World' 
msg['From'] = sender 
msg['To'] = receiver 

server = smtplib.SMTP() 
server.connect(HOST, PORT) 
server.starttls() 
server.login(sender,password) 
server.sendmail(sender,receiver, msg.as_string()) 
server.close() 

Nhưng tôi phải làm tương tự mà không cần sự trợ giúp của máy chủ SMTP bên ngoài. Làm thế nào có thể làm tương tự với python? Xin vui lòng giúp đỡ.

+0

Bạn có ý nghĩa gì chính xác bởi 'không có sự trợ giúp của máy chủ SMTP bên ngoài.'? Bạn không muốn sử dụng bất kỳ máy chủ SMTP nào cả? Bạn có muốn sử dụng máy chủ SMTP của riêng mình không? Bạn có muốn sử dụng một số máy chủ SMTP khác không? –

+0

thực sự tôi muốn nó với máy chủ SMTP của riêng tôi. Và nếu có thể đạt được yêu cầu tương tự mà không cần một máy chủ SMTP, thì nó cũng tốt cho tôi. Những gì tôi đang cố gắng để đạt được là gửi một email từ một id email tùy chỉnh nặc danh cho một số id email khác từ máy tính địa phương của tôi. –

Trả lời

1

Cách tốt nhất để đạt được điều này là hiểu mã Fake SMTP mà nó sử dụng số smtpd module tuyệt vời.

#!/usr/bin/env python 
"""A noddy fake smtp server.""" 

import smtpd 
import asyncore 

class FakeSMTPServer(smtpd.SMTPServer): 
    """A Fake smtp server""" 

    def __init__(*args, **kwargs): 
     print "Running fake smtp server on port 25" 
     smtpd.SMTPServer.__init__(*args, **kwargs) 

    def process_message(*args, **kwargs): 
     pass 

if __name__ == "__main__": 
    smtp_server = FakeSMTPServer(('localhost', 25), None) 
    try: 
     asyncore.loop() 
    except KeyboardInterrupt: 
     smtp_server.close() 

Để sử dụng, tiết kiệm trên như fake_stmp.py và:

chmod +x fake_smtp.py 
sudo ./fake_smtp.py 

Nếu bạn thực sự muốn đi vào chi tiết, sau đó tôi đề nghị bạn nên hiểu mã nguồn của mô-đun đó.

Nếu điều đó không làm việc thử smtplib:

import smtplib 

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, message) 
server.quit() 
+1

Tôi tìm thấy ví dụ này ở đâu đó và đã thử. Nhưng những gì tôi hiểu là bất cứ khi nào tôi đang cố gắng gửi một thư với sự giúp đỡ của máy chủ smtp giả địa phương này, phương thức "process_message" xử lý yêu cầu. Nhưng ở đây phương pháp không làm gì cả. Vì vậy, các email không được gửi đến hộp thư đến của người nhận. Xin vui lòng cho tôi một hướng. –

+0

@NidhinJoseph, hãy xem tập lệnh thứ hai này và thử xem, nếu nó cũng không hoạt động, hãy đảm bảo bạn đã cài đặt đúng các mô-đun đó trên máy tính của mình. – Mansueli

+0

Tôi đang cố gắng làm theo các ví dụ này, nhưng không có gì xảy ra khi tôi thực thi phần thứ hai của mã. Tập lệnh không trả lại bất kỳ lỗi hoặc trạng thái nào. Làm thế nào tôi nên gỡ lỗi mà cố gắng để hiểu những gì đang xảy ra? – AlvaroAV

1

Nhiều khả năng, bạn có thể đã có một máy chủ SMTP chạy trên các máy chủ mà bạn đang làm việc trên. Nếu bạn thực hiện ls -l /usr/sbin/sendmail, nó có cho thấy tệp thực thi (hoặc liên kết tượng trưng đến tệp khác) tồn tại ở vị trí này không? Nếu có, thì bạn có thể sử dụng để gửi thư đi. Hãy thử /usr/sbin/sendmail [email protected] < /path/to/file.txt để gửi thư chứa trong /path/to/file.txt đến [email protected] (/path/to/file.txt phải là thư email tuân thủ RFC). Nếu nó hoạt động, bạn có thể sử dụng/usr/sbin/sendmail để gửi thư từ tập lệnh python của bạn - bằng cách mở một tay cầm đến/usr/sbin/sendmail và viết thư cho nó, hoặc đơn giản bằng cách thực hiện lệnh trên từ python script bằng cách gọi hệ thống.

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