如何在 C# 中屏蔽/隐藏电子邮件地址
Posted
技术标签:
【中文标题】如何在 C# 中屏蔽/隐藏电子邮件地址【英文标题】:how to do masking/hiding email address in c# 【发布时间】:2015-08-04 10:14:28 【问题描述】:我有一个问题,我必须在 c# 中应用屏蔽/隐藏电子邮件地址的一部分。例子
jhon@abc.com==> jh**n@abc.com
bigjhon@abc.com==> bi****n@abc.com
brotherhood@abc.com==>br*******od@abc.com
我有这个代码,但它对某些电子邮件给出了例外。 “索引超出了数组的范围。”
for (int i = 0; i < eml.Length; i++)
int j = i == (eml.Length - 1) ? 0 : 1;
cc = eml[i].ToString();
if (i <= 1)
dispeml += cc;
else
if (eml[i + (j + k)].ToString() == "@")
dispeml += cc;
k = 0;
fl = 1;
else
if (eml[i + j].ToString() == "@")
dispeml += cc;
fl = 1;
else
if (fl == 1)
dispeml += cc;
else
dispeml += "*";
【问题讨论】:
“为某些电子邮件提供例外”:我想我们可以猜到它们是什么。但最好在代码中包含哪些电子邮件失败、哪些异常以及哪些点失败的详细信息。 实际上该代码已在网站上运行,我没有这些电子邮件地址详细信息,但我只收到此错误。 你为什么不启动你的调试器,看看这段代码发生了什么?您处于发现故障的最佳位置。只需在此代码的开头放置一个断点并运行调试器即可。 我做了,但很好,这就是我把它放在这里的原因。可能是我错过了一些东西,所以其他人可以帮助我 您是否有示例测试电子邮件地址可以显示哪些失败? 【参考方案1】:这是一种使用正则表达式解决此问题的方法
string input = "jhon@abc.com";
string pattern = @"(?<=[\w]1)[\w-\._\+%]*(?=[\w]1@)";
string result = Regex.Replace(input, pattern, m => new string('*', m.Length));
//j**n@abc.com
说明:
(?<=[\w]1)
名称必须以 1 个单词字符开头
[\w-\._\+%]*
替换部分可以包含 0-n 个单词字符,包括 -_.+%
(?=[\w]1@)
名称必须以一个单词字符结尾,后跟@
根据您希望保持不变的字符数量,您可以在开头或结尾将1
更改为2
或其他内容。
【讨论】:
很好的解决方案。感谢您的正则表达式! :) 如何让这也影响电子邮件地址的域? @Djorge 这有点棘手,因为从技术上讲,域是@foo
、@foo.bar.com
或@192.168.1.1
,除了琐碎的情况@foo.com
我最终将|(?<=@[\w]1)[\w-_\+%]*(?=\.)
添加到您的正则表达式的末尾以获得我想要的,但不处理@foo
。
@Djorge 如果您删除添加中的 at 符号,您还可以匹配多个域部分。整个表达式将是 (?
【参考方案2】:
如果你总是想用固定数量的屏蔽字符屏蔽@之前的第一个字符和最后一个字符之间的任何内容,你可以使用下面的
var email="abcdef@ghij.com";
var maskedEmail = string.Format("0****1", email[0],
email.Substring(email.IndexOf('@')-1));
您可以根据需要更改上述行。
上面的行会给你结果“a****f@ghij.com”
请注意,始终使用固定数量的字符来屏蔽电子邮件会让人难以猜测电子邮件,并且会稍微安全一些。
例如:ab@c.com
掩码后:a****b@c.com
【讨论】:
【参考方案3】:我看不到你的 k 变量在你的代码 sn-p 中的初始化位置。如果我不得不猛烈抨击为什么你会得到一个索引超出范围的异常,那将是我的刺。
虽然我会说您可以实现与使用 Regex 所做的非常相似的事情。我是这样做的:
public string ObfuscateEmail(string email)
var displayCase = email;
var partToBeObfuscated = Regex.Match(displayCase, @"[^@]*").Value;
if (partToBeObfuscated.Length - 3 > 0)
var obfuscation = "";
for (var i = 0; i < partToBeObfuscated.Length - 3; i++) obfuscation += "*";
displayCase = String.Format("0123", displayCase[0], displayCase[1], obfuscation, displayCase.Substring(partToBeObfuscated.Length - 1));
else if (partToBeObfuscated.Length - 3 == 0)
displayCase = String.Format("0*1", displayCase[0], displayCase.Substring(2));
return displayCase;
这里是你所有测试用例的一个小提琴,只要通过非常接近你描述的https://dotnetfiddle.net/fU2RUo
[编辑] 我的代码不会尝试混淆 @ 之前的地址长度小于 3 个字符的电子邮件,如果这是您需要修改代码的要求,但我认为这不太现实必须建立一个案例。
【讨论】:
【参考方案4】:我想屏蔽像 A****B@C****D.com 这样的电子邮件。这也适用于具有多个点或没有域扩展名的电子邮件。
public string MaskEmail(string email)
if (string.IsNullOrEmpty(email) || !email.Contains("@"))
return email;
string[] emailArr = email.Split('@');
string domainExt = Path.GetExtension(email);
string maskedEmail = string.Format("0****1@2****34",
emailArr[0][0],
emailArr[0].Substring(emailArr[0].Length - 1),
emailArr[1][0],
emailArr[1].Substring(emailArr[1].Length - domainExt.Length - 1, 1),
domainExt
);
return maskedEmail;
结果
info@stakofervlow.com >> i****o@s****w.com
me@google.nl >> m****e@g****e.nl
webmaster@stack.over.flow.org >> w****r@s****w.org
test@noextension >> t****t@n****n
x@y.net >> x****x@y****y.net
【讨论】:
【参考方案5】:我编写此方法是因为它更容易根据我的特定屏蔽要求进行自定义。
输入:myemail@address.com 输出:m****il@*****.com我希望这对某人有所帮助。如果是这样,请将答案标记为有帮助。
public static string MaskEmail(this string email)
var emailsplit = email.Split('@');
var newsplit = emailsplit[1].Split('.');
char[] array1 = emailsplit[0].ToCharArray();
char[] array2 = newsplit[0].ToCharArray();
var output = "";
for (int i = 0; i < array1.Length; i++)
if (array1.Length > 4)
if (i == 0 || i == array1.Length - 1 || i == array1.Length - 2)
output += array1[i];
else
output += "*";
else
if (i == 0)
output += array1[i];
else
output += "*";
output += "@";
for (int i = 0; i < array2.Length; i++) output += "*";
for (int i = 1; i < newsplit.Length; i++) output += "." + newsplit[i];
return output;
【讨论】:
【参考方案6】: public static string EmailStarString(string email)
string[] parts = email.Split('@');
string star = string.Empty;
string firstCharEmailName = parts[0].First().ToString();
string lastCharEmailName = parts[0].Last().ToString();
for (int i = 0; i < parts[0].Length - 2; i++)
star += "*";
return firstCharEmailName + star + lastCharEmailName + "@" + parts[1];
【讨论】:
【参考方案7】:我会采取另一种方法,知道@是一个电子邮件地址,如果@之前有字母,字母和@*.在@符号之后,则取出该部分包含@和点“.”的空格之间的文本,现在我们可以安全地过滤那些短为电子邮件的文本
var parts = someText.Split(' ').ToArray();
for (var i=0;i<parts.Length;i++)
if (parts[i].Length>5 && parts[i].Any(a => a.Equals('@')) && parts[i].Any(a => a.Equals('.')))
parts[i] = "EMAIL@REMOVED.COM";
someText = string.Join(' ', parts);
您可以在空白处替换整个块,或者花哨并替换一些字母或单词。不像正则表达式巫毒教那么花哨,但对我有用。顺便说一句,您还可以通过将其包含在“任何”逻辑中来捕获诸如 email(a)mydomain[dot]com 之类的内容
【讨论】:
以上是关于如何在 C# 中屏蔽/隐藏电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章
在 WooCommerce 电子邮件通知中隐藏本地取货的送货地址
如何在 C# 中使用 AD 组名称查找 Active Directory 组电子邮件地址
ASP .Net C# 代码向多个用户发送邮件,这些用户的邮件 ID 应隐藏在组名中