Подтвердить что ты не робот

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

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

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

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

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

Если ответ "go write library", пусть будет так: -)

4b9b3361

Ответ 1

Ввод заголовка не является фактором в том, как вы отправляете почту, это фактор в том, как вы создаете почту. Проверьте 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())

Ответ 2

Это простая функция 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

Ответ 3

Джим ответил мне не на 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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

Я просто искал одно и то же и нашел хороший пример на веб-сайте 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 email address
# you == the recipient 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 по умолчанию, но вы можете дважды проверить, есть ли у вас какие-либо проблемы.

Ответ 7

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

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