【问题标题】:Effective way of extracting alias from email address从电子邮件地址中提取别名的有效方法
【发布时间】:2019-01-28 13:18:32
【问题描述】:

我想从电子邮件地址中提取别名部分。例如,如果我有“name+alias1+alias2+alias3@email.com”,我希望它返回子地址列表,在本例中为 alias1、alias2、alias3。

我有提取第一个别名的代码,如下所示:

var addr = new MailAddress("name+alias@email.com");
var username = addr.User;
var domain = addr.Host;

if (!username.Contains("+")) return;
var split = username.Split('+').ToList();
var name = split[0];
var alias = split[1];

但这不适用于多个地址。我也不想使用正则表达式(因为“现在你有两个问题”)。

【问题讨论】:

  • 如果邮箱地址是name@email.com怎么办?
  • @mjwills 根据 RFC 5233,只允许一个加号,因此不应将其视为有效的电子邮件地址。
  • 不管标准文档怎么说,gmail 允许在一个电子邮件地址中有两个+。因此,您可能需要考虑输入 name+alias+alias2@email.com 时期望返回的内容。
  • 非常好。刚刚自己测试过,它有效,我将编辑我的问题。
  • 您可以使用拆分或正则表达式

标签: c# alias email-address


【解决方案1】:

如果你打算重用它,我建议你编写一个扩展方法来检索别名列表。 由于@mnieto 已经发布了一个拆分的解决方案,所以我想在这里使用正则表达式。

public static class MailAddressExtension
{
    private static Regex AliasRegex = new Regex(@"\+([A-Za-z0-9]+)");
    public static List<string> Alias(this MailAddress mail)
    {
        return AliasRegex.Matches(mail.User).Select(a => a.Groups[1].Value).ToList();
    }
}

然后在你的代码中,你就可以写了

var addr = new MailAddress("name+alias@email.com");
var username = addr.User;
var domain = addr.Host;
var alias = addr.Alias();

【讨论】:

    【解决方案2】:

    诀窍是使用 Linq 获取除第一个之外的所有别名,该别名与名称相对应:

        var addr = new MailAddress("name+alias@email.com");
        var username = addr.User;
        var domain = addr.Host;
    
        if (!username.Contains("+")) return;
        var split = username.Split('+').ToList();
        var name = split[0];
        var alias = split.Skip(1);
    

    【讨论】:

    • 这非常简单明了。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-28
    • 2013-09-29
    相关资源
    最近更新 更多