答案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]>'