Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python popen2函数重写(php邮件解析)_Php_Python_Subprocess_Popen - Fatal编程技术网

Python popen2函数重写(php邮件解析)

Python popen2函数重写(php邮件解析),php,python,subprocess,popen,Php,Python,Subprocess,Popen,我尝试将popen2重写为subprocess.Popen。我得到了一个错误 我的代码: cmd = '/usr/sbin/sendmail -t -i' if len(sys.argv) == 3: cmd += " -f%s" % sys.argv[2] # OLD CODE ======================= #(out, s) = popen2(cmd) #s.write(data) #s.close() # ==============================

我尝试将popen2重写为subprocess.Popen。我得到了一个错误

我的代码:

cmd = '/usr/sbin/sendmail -t -i'
if len(sys.argv) == 3:
  cmd += " -f%s" % sys.argv[2]

# OLD CODE =======================
#(out, s) = popen2(cmd)
#s.write(data)
#s.close()
# ================================

# NEW CODE =======================

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True)
(out, s) = (p.stdin, p.stdout)
s.write(data)
s.close()
sys.stdout.flush()
在apache错误日志中,我得到错误:

Traceback (most recent call last):
  File "/opt/php-secure-sendmail/secure_sendmail.py", line 80, in <module>
    s.write(data)
IOError: File not open for writing
sendmail: fatal: test@serve.tld(10000): No recipient addresses found in message header
plesk sendmail[2576]: sendmail unsuccessfully finished with exitcode 75
回溯(最近一次呼叫最后一次):
文件“/opt/php secure sendmail/secure_sendmail.py”,第80行,在
s、 写入(数据)
IOError:文件未打开以进行写入
sendmail:致命:test@serve.tld(10000):在邮件头中找不到收件人地址
plesk sendmail[2576]:sendmail使用exitcode 75未成功完成

也许有人知道该如何理解这段代码?

您正试图在只开放阅读的标准输出上编写

stdout包含新进程的打印输出,您必须写入stdin以向其发送数据

popen2返回一个元组(stdout,stdin),这就是注释代码工作的原因。

只需颠倒元组中的顺序即可:

p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, close_fds=True)
(out, s) = (p.stdout, p.stdin)
s.write(data)
s.close()
sys.stdout.flush()
您可以使用将
数据
传递给子进程:

cmd = '/usr/sbin/sendmail -t -i'.split()
if len(sys.argv) > 2:
  cmd += ["-f", sys.argv[2]]
p = Popen(cmd, stdin=PIPE, close_fds=True)
p.communicate(data)
注意,这里不需要
shell=True


我删除了stdout=PIPE,因为我看不到代码中使用的输出。如果要抑制输出;请参阅。

您的电子邮件内容必须是错误的,才能获得错误。因此,请将答案标记为正确,这样问题将显示为已解决,并将帮助其他人。要执行此操作,只需单击其附近向上的箭头。