Postfix:更改排队消息中的发件人


8

完全重新安装后,我们遇到了配置问题:发件人地址错误,某些收件人(邮件服务器)拒绝了它们。

因此,Postfix队列中有大量邮件。

理想情况下,直接在排队的邮件中更改发件人地址,然后刷新队列将是最佳选择。

我试图解决这个问题的答案。但是在我使用的版本(2.11.0)中,消息似乎不容易修改。

例如,没有/var/spool/mqueue目录,而是/var/spool/postfix/...

active
bounce
corrupt
defer
deferred
dev
etc
flush
hold
incoming
lib
maildrop
pid
private
public
saved
trace
usr

感兴趣的目录是deferred。我尝试在其中修改一些文件,并用正确的文件更改了错误的域(并小心确保仅更改了那些文件)。

但是随后,这些邮件被移至corrupt,这意味着简单的文本更改似乎无效(已完成vi)。

还有其他更清洁的方式来更改排队邮件中的发件人吗?

Answers:


19

我尝试了解决这个问题的答案。但是在我所拥有的版本(2.11.0)中,消息似乎不容易修改。

例如,没有/ var / spool / mqueue目录,而是/ var / spool / postfix / ...

我想澄清两件事。

  • 首先,该答案适用于sendmail而不是postfix。
  • 其次,根本不支持直接处理原始队列文件。

所以,您这里有几种选择

1. smtp_generic_maps参数

这个答案的灵感来自这个出色的答案。它将自动将旧地址重写为新地址。您可以定义文件以将旧地址映射到新地址。

/etc/postfix/main.cf:
    smtp_generic_maps = hash:/etc/postfix/generic

/etc/postfix/generic:
    account@localdomain.example.com       account@example.com

别忘了postmap /etc/postfix/generic跑步postfix reload

  • 好处:您无需重新排队消息
  • 缺点: Postfix将重写匹配的发件人和收件人地址account@localdomain.example.com

2. sender_canonical_address

要克服首选方法的弊端,可以使用sender_canonical_maps。此解决方案基于Postfix作者的建议。与第一个选项相同,您可以定义文件以将旧地址映射到新地址。

/etc/postfix/main.cf:
    sender_canonical_maps = hash:/etc/postfix/sender_canonical

/etc/postfix/sender_canonical:
    account@localdomain.example.com       account@example.com

先跑postmap /etc/postfix/sender_canonical再跑postfix reload。由于后缀队列的流动,您必须使用命令重新排队受影响的队列postsuper -r queueid

  • 好处: Postfix不重写收件人地址。
  • 缺点:您必须重新排队所有受影响的消息。但是您可以使用单个命令重新排队所有延迟的postsuper -r ALL deferred

3.直接处理后缀队列

这是修改队列以进行高级处理的手动旧方法。这个答案来自postfix-users邮件列表

简而言之

  • 提取队列

    # postsuper -h queueid
    # postcat -qbh queueid > tempfile.eml
    # vi tempfile.eml
    
  • 重新提交队列并删除旧队列

    # sendmail -f $sender $recipient < tempfile.eml
    # postsuper -d queueid
    

有关上述命令的文档,请参阅此页面

注意:
来自postfix-users邮件列表的原始解决方案,用于postcat -q queueid >tempfile提取队列。此命令将提取队列的标头,正文和元信息。如下面的Azendale所指出sendmail由于元信息,它将拒绝发送此格式错误的电子邮件。

-bh除了参数外,还使用参数q将使postcat过滤器仅将输出过滤到标头和正文,不包括元信息。这样做的一个附带好处是,临时文件的格式大多数电子邮件客户端都将其识别为.eml格式,从而使您可以查看生成的(编辑后的)邮件。


1
我尝试了这一点,至少在我的postfix版本中,它似乎没有发送消息,直到我使用了类似的东西postcat -qbh queueid >tempfile。(好处是:它是.eml格式。)如果我刚使用-q它,则在运行sendmail时似乎什么也没做。Postfix版本2.8.4。有人可以确认吗?如果是这样,让我们​​编辑此答案。
Azendale 2015年

@Azendale,您好,我重新测试了第三个解决方案,是的,我们需要使用qbh它才能使其工作。在更新的答案中添加解释... :)
masegaloeh 2015年

谢谢 !寻找类似的第三种解决方案。太完美了!
JazZ

1

大写。我的邮件服务器在配置错误的情况下运行了几天,因此出现问题,因此有很多队列需要重新发送给新的收件人。因此,我创建了两个一体式班轮以遍历所有队列:

第一个查找所有队列,将其保留,将其另存为.eml文件,然后重新发送:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -h $ID; postcat -qbh $ID > tempfile$ID.eml; sendmail -f $sender $recipient < tempfile$ID.eml; done

第二个删除队列:

for ID in `mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }' | tr -d \!`; do postsuper -d $ID; done

只需记住在运行此最后一个代码之前检查是否没有新的队列处于保留状态。通过发出此命令并查找没有'!'的队列ID来做到这一点。在最后:

mailq | awk '$1 !~/^$|[@\(^$-]/ { print $1 }'

On可以很容易地将这两个衬板合二为一,但是我觉得我有更多的控制权,可以在删除队列之前检查邮件是否确实已收到。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.