2008-09-16 2 views
58

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

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

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

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

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

ответ

97

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

Это довольно часто, чтобы просто использовать Sendmail команду из Python, используя os.popen

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

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

+0

SMTP не работает на ~ NIX коробки, используя такие вещи, как [DMA] (https: // GitHub. com/corecode/dma), который предоставляет sendmail, но не прослушивает порт 25 ... – 2017-12-11 13:31:40

-6

Самый простой ответ является smtplib, вы можете найти документы на него here.

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

+7

Вопрос гласит: «Если я хочу отправлять почту не через SMTP, а через sendmail ...» – S19N 2012-05-31 10:41:59

+1

Ваша программа задержится в случае нет связи или задержки на SMTP-сервере. Используя sendmail, вы передаете сообщение в MTA, и ваша программа продолжается. – 2012-10-12 13:20:47

30

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

действительно хорошая функция python! – aphex 2012-06-19 20:36:42

+0

+1 - только то, что я ищу! – 2012-06-24 10:31:03

+0

отличный, простой пример +1 – 2012-06-28 14:47:19

3

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

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

-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 по умолчанию, но вы можете дважды проверить, столкнулись ли вы с какими-либо проблемами.

6

Ответ Джима для меня не работает в 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 
Смежные вопросы