Отправка почты через sendmail из python
Если я хочу отправлять почту не через SMTP, а через sendmail, есть ли библиотека для python, которая инкапсулирует этот процесс?
Еще лучше, есть ли хорошая библиотека, которая абстрагирует весь выбор sendmail -versus-smtp?
Я буду запускать этот script на кучу хостов unix, только некоторые из которых прослушивают localhost: 25; некоторые из них являются частью встроенных систем и не могут быть настроены для приема SMTP.
Как часть Good Practice, мне бы очень хотелось, чтобы библиотека сама позаботилась о уязвимостях, связанных с вложением заголовков, поэтому просто сбросить строку до popen('/usr/bin/sendmail', 'w')
немного ближе к тексту, чем хотелось бы.
Если ответ "go write library", пусть будет так: -)
Ответы
Ответ 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, который в основном такой же, как с помощью инструмента командной строки.