Exim:将退回的邮件转换回原始邮件

Exim:将退回的邮件转换回原始邮件

我们在 Debian 上设置了 exim4 作为智能主机,通过 Google 的邮件服务器发送邮件。我们用 Google Apps 处理其他所有事情,所以这样做很合理。问题是,智能主机帐户的密码被更改,导致 exim 退回邮件然后冻结它们。现在我有大量未发送的邮件/var/spool/exim4/[input|msglog]

我曾尝试运行:

exim-d-M 1Mx6IS-0006bC-3h

但这导致退回/var/spool/exim4/input/1Mx6IS-0006bC-3h-D要发送的消息,而不是原始消息。我可以在行下看到原始消息的副本

------ This is a copy of the message, including all the headers. ------

...但我还没有找到办法来获取这个冻结的退回邮件,并将其转换回原始邮件,以便可以重试。

有任何想法吗?

答案1

未经测试!

这是一个 Python 脚本,应该可以满足您的要求。它未经彻底测试,并且保证不会在所有情况下都有效。如果您不懂 Python,那没关系,这对我来说是一个很好的练习。

import os
import smtplib
import email

mydir = os.open("/mydir")
server = smtplib.SMTP()

files = [mydir + "/" + f for f in os.listdir(mydir) if os.path.isfile(mydir + "/" + f)]

while files:
    f = files.pop()
    msg = email.message_from_file(open(f))
    body = msg.get_payload().split("------ This is a copy of the message, including all the headers. ------")[1].strip()    
    from_addr = msg["To"]
    to_addr = msg["X-Failed-Recipients"]
    print "Sending message to ", to_addr
    server.send(from_addr, to_addr, body)
    print "Message sent"

答案2

这是最后一次退回吗?还是说将在几个小时后再次尝试投递,如果更晚的话,是不是会同时发送原始邮件和退回邮件?因为两封邮件都在队列中,正如我从您的问题中理解的那样。

相关内容