Improvisar servidor SMTPD en segundos para recibir correos electrónicos
Código en python sin dependencias que pone en marcha un servidor de correo SMTPD que aceptará cualquier correo entrante a la dirección 0.0.0.0:25.
Muy útil para recibir un correo cualquiera con posibles adjuntos sin tener que instalar, configurar un servicio y crear la/s respectivas cuenta/s.
- script_smtpd.py
#!/usr/bin/env python # encoding: utf-8 # # Copyright (c) 2008 Doug Hellmann All rights reserved. # URL: http://pymotw.com/2/_sources/smtpd/index.txt """ """ __version__ = "$Id$" #end_pymotw_header import smtpd import asyncore class CustomSMTPServer(smtpd.SMTPServer): def process_message(self, peer, mailfrom, rcpttos, data): print 'Receiving message from:', peer print 'Message addressed from:', mailfrom print 'Message addressed to :', rcpttos print 'Message length :', len(data) print 'Message body :', data return server = CustomSMTPServer(('0.0.0.0', 25), None) asyncore.loop()
Ejemplo de la salida del script al recibir un correo desde gmail con adjunto (adjunto.cnf).
./script_smtpd.py Receiving message from: ('209.85.216.49', 35640) Message addressed from: emisor@gmail.com Message addressed to : ['receptorinventado@dominio.org'] Message length : 2909 Message body : Received: by vnbg62 with SMTP id g62so380705vnb.2 for <receptorinventado@dominio.org>; Fri, 19 Jun 2015 16:02:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:reply-to:date:message-id:subject:from:to:content-type; bh=UsxED07zM3FTPUl4ewIceUPDPv1/clF+YPUmlqe4CCY=; b=UwjwLB2LLm7Wvb/PuRnaVMGPfPlAXF59G7PO9iTaxXQepXU3xx69O+kLY2O430zp8/ MMKMR+o8S7+PykJBRXS1AdcYDl5r7ITOGJ+snVTkUaFcYubkc9mAm81pOTTgB2W/3sR/ h4J12Gb8PhaVaKQYqF0NFR7zopiEZyFTrNcio6Fh1B+5ku3+wPipYSXyek7bi9/M1Ohv ++I29yjIN+q/UhLpioCMegAcVbslOEpH/qlyiaeNmR5n7IngwhIVxRBq9u1OssW6TdHX 31F28Yj+OcX0HE5eW8WuLFhAtf+g+AoV+vISi/WxMvv9dJMWALxzgWQIxzlRtvALSoVk LIwg== MIME-Version: 1.0 X-Received: by 10.52.32.34 with SMTP id f2mr14909156vdi.11.1434754925096; Fri, 19 Jun 2015 16:02:05 -0700 (PDT) Received: by 10.31.138.81 with HTTP; Fri, 19 Jun 2015 16:02:04 -0700 (PDT) Reply-To: emisor@gmail.com Date: Sat, 20 Jun 2015 01:02:04 +0200 Message-ID: <CAEvb=MFJsk_wgtrX04gZ62_-EqPaH64Ctcarmh-g+6sQ3_aLbw@mail.gmail.com> Subject: Prueba desde Gmail From: =?UTF-8?Q?NOMBRE_=E2=84=A2_?= <emisor@gmail.com> To: receptorinventado@dominio.org Content-Type: multipart/mixed; boundary=bcaec51d2b80a6a5d40518e6e9db --bcaec51d2b80a6a5d40518e6e9db Content-Type: multipart/alternative; boundary=bcaec51d2b80a6a5ce0518e6e9d9 --bcaec51d2b80a6a5ce0518e6e9d9 Content-Type: text/plain; charset=UTF-8 Hola, este es el cuerpo del mensaje. -- GPG Key ID: ABE8AF92 --bcaec51d2b80a6a5ce0518e6e9d9 Content-Type: text/html; charset=UTF-8 <div dir="ltr">Hola, este es el cuerpo del mensaje.<br clear="all"><div><br>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><span style="background-color:rgb(255,255,255)">GPG Key ID: ABE8AF92</span><br></div></div></div></div> </div></div> --bcaec51d2b80a6a5ce0518e6e9d9-- --bcaec51d2b80a6a5d40518e6e9db Content-Type: application/octet-stream; name="adjunto.cnf" Content-Disposition: attachment; filename="adjunto.cnf" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ib481arh0 aW5wdXQgeyBzdGRpbnt9Cn0gCgpmaWx0ZXIgewoKICAgIAlncm9rIHsKICAgICAgCQltYXRjaCA9 PiB7ICJtZXNzYWdlIiA9PiAiJXtJUE9SSE9TVDpjbGllbnRpcH0gLSAtIFxbJXtIVFRQREFURTp0 ZGQvTU1NL1lZWVk6SEg6bW06c3MgWiIgXSBsb2NhbGUgPT4gImVuIiB9Cgp9IAoKb3V0cHV0IHsg CgoJZWxhc3RpY3NlYXJjaCB7IAoJCWhvc3QgPT4gbG9jYWxob3N0IGNsdXN0ZXIgPT4gZXNjbHVz dGVyCgkJfSAKCXN0ZG91dCB7Y29kZWMgPT4gcnVieWRlYnVnIH0JCn0K --bcaec51d2b80a6a5d40518e6e9db-- Timeout, server dominio.org not responding.
Posible problema.
Traceback (most recent call last): File "smtpd.py", line 12, in <module> import smtpd File "/root/smtpd.py", line 15, in <module> class CustomSMTPServer(smtpd.SMTPServer): AttributeError: 'module' object has no attribute 'SMTPServer'
Traceback (most recent call last): File "email.py", line 12, in <module> import smtpd File "/root/smtpd.py", line 15, in <module> -V AttributeError: 'module' object has no attribute 'SMTPServer
Solución: Renombrar el script y borrar también los ficheros pyc generados. La causa se debe a que el script no puede llamar igual que una de sus librerías, en el caso de usar el nombre “smtpd.py”, este fallará mostrando el primer error anteriormente comentado. Si no se borra el fichero “.pyc” correspondiente, se mostrará un error como el del segundo recuadro.
ls /usr/lib/python2.X/*.py /usr/lib/python2.X/smtpd.py