2014-06-17 17 views
11

Stavo usando python per inviare un messaggio di posta elettronica usando un server SMTP esterno. Nel codice qui sotto, ho provato a utilizzare gmail SMTP per inviare un messaggio di posta elettronica da un ID gmail a qualche altro id. Sono stato in grado di produrre l'output con il codice qui sotto.invia posta anonima dal PC locale

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() 

Ma devo fare lo stesso senza l'aiuto di un server SMTP esterno. Come può fare lo stesso con Python? Per favore aiuto.

+0

Cosa si intende esattamente per "senza l'aiuto di un server SMTP esterno"? Non vuoi affatto usare alcun server SMTP? Vuoi usare il tuo server SMTP? Vuoi usare qualche altro server SMTP? –

+0

effettivamente lo voglio con il mio server SMTP. E se è possibile ottenere lo stesso requisito senza un server SMTP, allora è anche ok per me. Quello che sto cercando di realizzare è inviare una e-mail da un ID e-mail personalizzato anonimo a qualche altro ID e-mail dal mio pc locale. –

risposta

1

Il modo migliore per ottenere questo è comprendere il codice Fake SMTP che utilizza il grande smtpd module.

#!/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() 

Per utilizzare questa, salvo quanto sopra come fake_stmp.py e:

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

Se davvero si vuole entrare in ulteriori dettagli, quindi suggerisco che si capisce il codice sorgente di quel modulo.

Se questo non funziona provare lo 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

Ho trovato questo esempio da qualche parte e provato. Ma quello che ho capito è che ogni volta che sto cercando di inviare una mail con l'aiuto di questo server smtp falso locale, il metodo "process_message" gestisce la richiesta. Ma qui il metodo non sta facendo nulla. Quindi le e-mail non vengono recapitate nella casella di posta del destinatario. Per favore dammi una direzione. –

+0

@NidhinJoseph, guarda questo secondo script e provalo, se anche non funziona assicurati di avere quei moduli installati correttamente sul tuo computer. – Mansueli

+0

Sto cercando di seguire questi esempi, ma non succede nulla quando eseguo la seconda parte del codice. Lo script non restituisce alcun errore o stato. Come dovrei eseguire il debug che cerca di capire cosa sta succedendo? – AlvaroAV

1

Molto probabilmente, si può già avere un server SMTP in esecuzione sulla macchina che si sta lavorando. Se lo fai, ls -l /usr/sbin/sendmail mostra che un file eseguibile (o un collegamento simbolico ad un altro file) esiste in questa posizione? Se è così, allora potresti essere in grado di usarlo per inviare la posta in uscita. Prova /usr/sbin/sendmail [email protected] < /path/to/file.txt per inviare il messaggio contenuto in /path/to/file.txt a [email protected] (/path/to/file.txt dovrebbe essere un messaggio di posta elettronica conforme a RFC). Se funziona, puoi usare/usr/sbin/sendmail per inviare posta dal tuo script python - aprendo un handle in/usr/sbin/sendmail e scrivendo il messaggio, o semplicemente eseguendo il comando precedente dal tuo script python tramite una chiamata di sistema.

Problemi correlati