Отправка почты с помощью sendmail от python


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

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

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

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

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

7 63

7 ответов:

инъекция заголовка не является фактором в том, как вы отправляете почту, это фактор в том, как вы строите почту. Проверьте почта пакет, построить почту с этим, сериализовать его, и отправить его в /usr/sbin/sendmail С помощью подпроцесс модуль:

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

msg = MIMEText("Here is the body of my message")
msg["From"] = "me@example.com"
msg["To"] = "you@example.com"
msg["Subject"] = "This is the subject."
p = Popen(["/usr/sbin/sendmail", "-t", "-oi"], stdin=PIPE)
p.communicate(msg.as_string())

это простая функция 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" % "from@somewhere.com")
    p.write("To: %s\n" % "to@somewhereelse.com")
    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

ответ Джима не работал для меня в Python 3.4. Мне пришлось добавить дополнительный до subrocess.Popen()

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

msg = MIMEText("Here is the body of my message")
msg["From"] = "me@example.com"
msg["To"] = "you@example.com"
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

Это довольно часто, чтобы просто использовать команду sendmail от Python с помощью ОС.попен

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

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

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

теперь он портируется для поддержки Python 3 и обновляется как часть мозг люкс.

Я просто искал то же самое и нашел хороший пример на веб-сайте Python:http://docs.python.org/2/library/email-examples.html

С упомянутого сайта:

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.mime.text import MIMEText

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
fp = open(textfile, 'rb')
# Create a text/plain message
msg = MIMEText(fp.read())
fp.close()

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('localhost')
s.sendmail(me, [you], msg.as_string())
s.quit()

обратите внимание, что для этого требуется правильно настроить sendmail/mailx для приема подключений на "localhost". Это работает на моих серверах Mac, Ubuntu и Redhat по умолчанию, но вы можете дважды проверить, если у вас возникнут какие-либо проблемы.

самый простой ответ-smtplib, вы можете найти документы на него здесь.

все, что вам нужно сделать, это настроить локальный sendmail для приема подключения от localhost, что он, вероятно, уже делает по умолчанию. Конечно, вы все еще используете SMTP для передачи, но это локальная sendmail, которая в основном совпадает с использованием инструмента командной строки.