it-swarm.cn

从python通过sendmail发送邮件

如果我不是通过SMTP发送邮件,而是通过sendmail发送邮件,是否有一个用于封装此进程的python库?

更好的是,是否有一个好的库可以抽象出整个'sendmail -versus-smtp'的选择?

我将在一堆unix主机上运行这个脚本,其中只有一些正在监听localhost:25;其中一些是嵌入式系统的一部分,无法设置为接受SMTP。

作为良好实践的一部分,我真的希望让库自己处理标题注入漏洞 - 所以只需将字符串转储到popen('/usr/bin/sendmail', 'w')就比我想要的更接近金属。

如果答案是'去写一个库',那就这样吧;-)

69
Nate

标题注入不是您发送邮件的因素,它是您构建邮件的一个因素。检查 email package,用它构造邮件,序列化它,然后使用 subprocess module将它发送到/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"] = "[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())
113
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
32
Pieter

Jim的回答在Python 3.4中对我不起作用。我不得不为subrocess.Popen()添加一个额外的universal_newlines=True参数

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

使用os.popen从Python使用sendmail命令是很常见的

就个人而言,对于我自己不写的脚本,我认为只使用SMTP协议更好,因为它不需要安装说sendmail克隆在Windows上运行。

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

3
tovare

这个问题已经很老了,但是值得注意的是,有一个消息构造和电子邮件传递系统名为 Marrow Mailer (以前的TurboMail),在此消息被提出之前就已经可用了。

它现在被移植到支持Python 3并作为 Marrow suite的一部分进行更新。

3
amcgregor