フォーマットされたメールアドレスを表示名とメールアドレスに解析する方法は?
-
03-07-2019 - |
質問
メールアドレスを指定:<!> quot; Jim <!> quot; <!> lt; jim@example.com <!> gt;
これをMailAddressに渡そうとすると、例外が発生します:
指定された文字列は、電子メールアドレスに必要な形式ではありません。
このアドレスをC#で表示名(Jim)とメールアドレス(jim@example.com)に解析するにはどうすればよいですか
編集:解析するC#コードを探しています。
EDIT2:メールアドレス文字列の先頭にスペースがあるため、MailAddressによって例外がスローされていることがわかりました。
解決
電子メールアドレスを手動で解析する場合は、RFC2822( https://tools.ietf.org/html/rfc822.html#section-3.4 )。セクション3.4では、アドレス形式について説明します。
ただし、メールアドレスを正しく解析するのは簡単ではなく、MailAddress
はほとんどのシナリオを処理できるはずです。
"Tom Smith <tsmith@contoso.com>"
のMSDNドキュメントによると:
http://msdn.microsoft.com/en-us/library /591bk9e8.aspx
表示名を使用してアドレスを解析できる必要があります。例として<=>を示しています。たぶん引用符が問題ですか?その場合は、引用符を取り除き、MailAddressを使用して残りを解析します。
string emailAddress = "\"Jim\" <jim@example.com>";
MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));
RFC2822を手動で解析することは、回避できれば問題になりません。
他のヒント
私のために働く:
string s = "\"Jim\" <jim@example.com>";
System.Net.Mail.MailAddress a = new System.Net.Mail.MailAddress(s);
Debug.WriteLine("DisplayName: " + a.DisplayName);
Debug.WriteLine("Address: " + a.Address);
MailAddressクラスには、電子メールアドレスを解析するプライベートメソッドがあります。どれだけ良いかわかりませんが、自分で書くよりも使う傾向があります。
試してください:
"Jimbo <jim@example.com>"
try:<!> quot; Jim <!> quot; <!> lt; jim@example.com <!> gt; 動作するかどうかはわかりませんが、通常は電子メールクライアントでそれを確認します。
2の間に常にスペースがあると仮定した場合、String.Split( '')を使用してスペースで分割できます。これにより、パーツが分割された配列が得られます。
したがって、次のようになります:
string str = "\"Jimbo\" jim@example.com"
string[] parts = str.Trim().Replace("\"","").Split(' ')
これを確認する際の問題は、表示名にスペースが含まれている場合、配列自体で2つ以上の項目に分割されるが、電子メールは常に最後になることです。
編集-括弧を編集する必要がある場合がありますが、それらに置き換えを追加するだけです。
これを書き上げたところ、文字列から最初の適切な形式の電子メールアドレスを取得します。そうすれば、メールアドレスが文字列のどこにあるかを推測する必要がなくなります
改善の余地はたくさんありますが、仕事に出る必要があります:)
class Program
{
static void Main(string[] args)
{
string email = "\"Jimbo\" <jim@example.com>";
Console.WriteLine(parseEmail(email));
}
private static string parseEmail(string inputString)
{
Regex r =
new Regex(@"^((?:(?:(?:[a-zA-Z0-9][\.\-\+_]?)*)[a-zA-Z0-9])+)\@((?:(?:(?:[a-zA-Z0-9][\.\-_]?){0,62})[a-zA-Z0-9])+)\.([a-zA-Z0-9]{2,6})$");
string[] tokens = inputString.Split(' ');
foreach (string s in tokens)
{
string temp = s;
temp = temp.TrimStart('<'); temp = temp.TrimEnd('>');
if (r.Match(temp).Success)
return temp;
}
throw new ArgumentException("Not an e-mail address");
}
}
少し<!> quot;ラフで準備ができている<!> quot;ただし、指定した例では機能します:
string emailAddress, displayname;
string unparsedText = "\"Jimbo\" <jim@example.com>";
string[] emailParts = unparsedText.Split(new char[] { '<' });
if (emailParts.Length == 2)
{
displayname = emailParts[0].Trim(new char[] { ' ', '\"' });
emailAddress = emailParts[1].TrimEnd('>');
}
new MailAddress("jim@example.com", "Jimbo");
指定した文字列を解析するには:
string input = "\"Jimbo\" jim@example.com";
string[] pieces = input.Split(' ');
MailAddress ma = new MailAddress(pieces[1].Replace("<", string.Empty).Replace(">",string.Empty), pieces[0].Replace("\"", string.Empty));
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet = inputEmailString.Split('\"','<','>');
MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);
埋め込みスペースを処理するには、次のように角括弧で分割します:
string addrin = "\"Jim Smith\" <jim@example.com>";
char[] bracks = {'<','>'};
string[] pieces = addrin.Split(bracks);
pieces[0] = pieces[0]
.Substring(0, pieces[0].Length - 1)
.Replace("\"", string.Empty);
MailAddress ma = new MailAddress(pieces[1], pieces[0]);
だから、これは私がやったことです。少し速くて汚いですが、動作しているようです。
string emailTo = "\"Jim\" <jim@example.com>";
string emailRegex = @"(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|""(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*"")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])";
string emailAddress = Regex.Match(emailTo.ToLower(), emailRegex).Value;
string displayName = null;
try
{
displayName = emailTo.Substring(0, emailTo.ToLower().IndexOf(emailAddress) - 1);
}
catch
{
// No display name
}
MailAddress addr = new MailAddress(emailAddress, displayName);
コメント?
この言語ではコーディングしていませんが、確認したい問題が2つあります:
1-拒否された理由は正確にはわかりません。差し迫った可能性は、example.comのブラックリストがあることです。
2-あなたが望む本当の解決策は、おそらく厳密なバリデータを実装することです。スタックオーバーフローは、おそらくこれを開発するのに適した場所です。実際の経験を持つ人がたくさんいるからです。
必要なものは次のとおりです。
- 空白を削除し、明らかに不要です。
- 個々の部分(表示名、住所の左側、住所の右側)に解析します。
- これらのそれぞれを、データ構造固有のバリデーターで検証します。たとえば、右側は有効なFQDN(またはリベラルメールシステムを使用している場合は非修飾ホスト名)である必要があります。
これは、この問題を解決するための最良の長期的アプローチです。
電子メールアドレスフィールド値(<!> quot; From <!> quot;、<!> quot; To <!> quot;)およびフィールド値<!> quot;をデコードするための正規表現ベースのソリューションを提案できます。件名<!>引用;
https:// www .codeproject.com / Tips / 1198601 / Parsing-and-Decoding-Values-of-Some-Email-Message