it-swarm-pt.tech

Enviando email via sendmail de python

Se eu quiser enviar emails não via SMTP, mas via sendmail, existe uma biblioteca para python que encapsula esse processo?

Melhor ainda, existe uma boa biblioteca que abstrai toda a opção 'sendmail -versus- smtp'?

Estarei executando este script em vários hosts unix, apenas alguns dos quais estão ouvindo no localhost: 25; alguns deles fazem parte de sistemas incorporados e não podem ser configurados para aceitar SMTP.

Como parte das Boas Práticas, eu realmente gostaria que a biblioteca cuidasse das próprias vulnerabilidades de injeção de cabeçalho - portanto, apenas colocar uma string em popen('/usr/bin/sendmail', 'w') está um pouco mais próxima do metal do que eu gostaria.

Se a resposta for 'vá escrever uma biblioteca', que assim seja ;-)

70
Nate

A injeção de cabeçalho não é um fator na maneira como você envia o correio, é um fator na maneira como você constrói o correio. Verifique o pacote email , construa o email com ele, serialize-o e envie-o para /usr/sbin/sendmail usando o módulo subprocesso :

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())
116
Jim

Esta é uma função simples python que usa o sendmail unix para entregar um email.

def sendMail():
    sendmail_location = "/usr/sbin/sendmail" # sendmail location
    p = os.popen("%s -t" % sendmail_location, "w")
    p.write("From: %s\n" % "[email protected]")
    p.write("To: %s\n" % "[email protected]")
    p.write("Subject: thesubject\n")
    p.write("\n") # blank line separating headers from body
    p.write("body of the mail")
    status = p.close()
    if status != 0:
           print "Sendmail exit status", status
34
Pieter

A resposta de Jim não funcionou para mim em Python 3.4. Eu tive que adicionar um argumento adicional universal_newlines=True A subrocess.Popen()

from email.mime.text import MIMEText
from subprocess import Popen, PIPE

msg = MIMEText("Here is the body of my message")
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE, universal_newlines=True)
p.communicate(msg.as_string())

Sem o universal_newlines=True Eu recebo

TypeError: 'str' does not support the buffer interface
10
MEI

É bastante comum usar apenas o comando sendmail de Python usando os.popen

Pessoalmente, para scripts que não escrevi, acho melhor usar apenas o protocolo SMTP, já que não seria necessário instalar, por exemplo, um clone do sendmail para rodar no Windows.

https://docs.python.org/library/smtplib.html

3
tovare

Essa pergunta é muito antiga, mas vale a pena notar que existe um sistema de construção de mensagens e entrega de e-mail chamado Marrow Mailer (anteriormente TurboMail) que estava disponível desde antes de essa mensagem ser solicitada.

Agora está sendo portado para suportar Python 3 e atualizado como parte do conjunto Marrow .

3
amcgregor