我们的 webapp 有一项功能,允许用户通过向特定电子邮件地址发送电子邮件来导入数据。当我们的应用程序收到电子邮件时,它们的处理方式会因发送者的不同而有所不同。我们查看电子邮件的“发件人”字段,并将其与数据库中的用户进行匹配。一旦确定了发送电子邮件的用户,我们将根据该用户的个人设置处理该电子邮件。
对于大多数用户来说,这通常运行良好。但是,某些用户抱怨他们的电子邮件没有得到处理。当我们查看它时,我们发现他们的电子邮件服务器正在向发件人的电子邮件地址添加信息,这导致电子邮件地址与数据库中我们的用户表中的内容不匹配。例如,用户的电子邮件可能testuser@example.com
在数据库中,但我们收到的电子邮件中的“发件人”字段可能类似于btv1==502867923ab==testuser@example.com
. 一些研究表明这是由发件人的服务器使用的退回地址标签验证 (BATV)引起的。
我们需要能够从提供给我们的“发件人”字段中提取规范的电子邮件地址,以便我们可以将其与我们的用户表相匹配。这里的其他开发人员之一编写了一个函数来执行此操作,并将其提交给我进行代码审查。这是他写的(C#):
private static string SanitizeEmailSender(string sender)
{
if (sender == null)
return null;
return System.Text.RegularExpressions.Regex.Replace(
sender,
@"^((btv1==.{11}==)|(prvs=.{9}=))",
"",
System.Text.RegularExpressions.RegexOptions.None);
}
此处的正则表达式模式涵盖了我们在电子邮件日志中看到的特定情况。我担心的是正则表达式可能过于具体。这些标签中是否使用btv1
并且prvs
唯一的前缀?后面总是正好有 9 个字符prvs=
吗?除了 BATV 之外,还有其他我们需要注意的电子邮件发件人标记方案吗?我不希望将此修复程序投入生产,只是为了发现下个月我们需要再次修复它,因为还有其他情况我们没有考虑。
我的直觉是将电子邮件地址修剪为仅包含最后一个=
. 但是,研究表明这=
是电子邮件地址中的有效字符,因此可能是用户规范电子邮件地址的一部分。我个人从未见过=
在某种标记或子地址方案之外的电子邮件地址中使用过,但你永远不知道。墨菲定律表明,一旦我假设用户的电子邮件地址中永远不会包含某个字符,那么拥有该地址的人就会立即注册。
我的问题是:如果给定更长的地址,可能包含 BATV 或其他标签,是否有行业接受的可靠方法来提取用户的规范电子邮件地址?如果做不到这一点,是否有至少比我们目前所拥有的更可靠的方法?还是我们所拥有的真的足够了?