it-swarm-ru.tech

Отправка почты через sendmail из python

Если я хочу отправлять почту не через SMTP, а через sendmail, есть ли библиотека для python, которая инкапсулирует этот процесс?

А еще лучше, есть ли хорошая библиотека, которая абстрагирует весь выбор 'sendmail -versus- smtp'?

Я буду запускать этот скрипт на нескольких хостах Unix, только некоторые из которых прослушивают localhost: 25; некоторые из них являются частью встроенных систем и не могут быть настроены для приема SMTP.

Как часть хорошей практики, мне бы очень хотелось, чтобы библиотека сама позаботилась об уязвимостях внедрения заголовков - так что простой вывод строки в popen('/usr/bin/sendmail', 'w') немного ближе к металлу, чем мне бы хотелось.

Если ответ "иди напиши библиотеку", пусть будет так ;-)

70
Nate

Внедрение заголовка не влияет на то, как вы отправляете почту, а на то, как вы создаете почту. Проверьте пакет email , составьте письмо с ним, сериализовайте его и отправьте в /usr/sbin/sendmail с помощью модуля subprocess :

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

Это простая функция python, которая использует unix sendmail для доставки почты.

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
33
Pieter

Ответ Джима не сработал для меня в Python 3.4. Мне пришлось добавить дополнительный аргумент universal_newlines=True к 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())

Без universal_newlines=True я получаю

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

Весьма распространено просто использовать команду sendmail из Python с использованием os.popen

Лично для сценариев, которые я не писал сам, я думаю, что лучше использовать SMTP-протокол, так как для его запуска не потребуется установка, скажем, клона sendmail для запуска в Windows.

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

3
tovare

Этот вопрос очень старый, но стоит отметить, что существует система создания сообщений и доставки электронной почты Marrow Mailer (ранее TurboMail), которая была доступна еще до того, как было запрошено это сообщение.

Теперь он переносится для поддержки Python 3 и обновляется как часть набора Marrow .

3
amcgregor