如何在 Exim(relay) 中重写全名

如何在 Exim(relay) 中重写全名

我在 Exim 上有一个中继服务器。我需要更改通过它发送的邮件中的完整发件人姓名。例如,它是“Иванов Иван[电子邮件保护]' 变成了 '伊万诺夫·伊万[电子邮件保护]'。 如何做呢?

在“Exime rewrite”的帮助下,我只能更改电子邮件地址

仅应针对特定发件人执行此操作

谢谢

答案1

您可以在 smtp_data ACL 中删除或添加标头。假设您在某处有一个 mysql 表,其中包含两列,一列用于原始地址,一列用于替换。在这种情况下,您可以使用类似这样的方法(可能您想修改它,但它可以给您一些想法):

warn condition=${if eq {1}{ \
                       ${lookup mysql {SELECT 1 FROM the_table WHERE \
                         original_column='${quote_mysql:${sg{$h_From:}{ *<.*>\$}{}}}' } \
                   } \
                   {yes}{no} \
               }
     add_header = From: ${lookup mysql {SELECT replacement_column FROM the_table WHERE \
                         original_column='${quote_mysql:${sg{$h_From:}{ *<.*>\$}{}}}' } ${sg{$h_From:}{.*(<[^>]+>)}{\$1}}
     remove_header = From:

或者,假设您有一个/etc/exim4/fullnames.txt包含替换项的文件(但请记住,这将按顺序读取该文件):

   warn condition=${if eq \
                {${lookup{${sg{$h_From:}{ *<.*>\$}{}}}lsearch{/etc/exim4/fullname.txt}}}\
                {}\
                {no}{yes}}
            add_header = From: ${lookup{${sg{$h_From:}{ *<.*>\$}{}}}lsearch{/etc/exim4/fullname.txt}} ${sg{$h_From:}{.*(<[^>]+>)}{\$1}}
            remove_header = From:

请注意,您需要将用作搜索关键字的全名括在引号中,以便转义姓氏和名字之间的空格。因此文件应如下所示:

"Иванов Иван":Ivanov Ivan

现在,这种方法不是最好的方法,但它应该有效。它添加一个From:标题(这将是消息中的最后一个标题),并删除一个From:标题(它遇到的第一个标题,这将是原始标题)。只有当 mysql 表或文件包含合适的替换时,它才会这样做。

对于替换,它假定地址是“显示名称”的形式,根据RFC2822 3.4对于替换,它会剪切 <...> 部分,而对于新标题,它会将其从原始From:标题放回原处。

有关exim中查找的更多信息:文件和数据库查找

答案2

w带标志的Exim 重写

可以使用 exim 仅重写电子邮件地址的工作部分或者整个地址,包括 RFC 2822“短语”(显示名称):

有时需要替换整个地址项,可以通过在规则中添加标志字母“w”来实现。

https://www.exim.org/exim-html-current/doc/html/spec_html/ch-address_rewriting.html#SECID155

重写通常情况下适用仅有的到地址的工作部分,而不是显示名称。使用以下和w标志f应该重写你正在寻找的方式(参见其他标志,例如F设置信封发件人):

例子

begin rewrite

[email protected]    "\"Ivanov Ivan\" <[email protected]>"    wf

测试

检查结果使用exim -brw '"Иванов Иван" <[email protected]>'

相关内容