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