14

与えられた電子メールアドレス: "Jim" <jim@example.com>

これをMailAddressに渡そうとすると、例外が発生します。

指定された文字列は、電子メールアドレスに必要な形式ではありません。

このアドレスをC#の表示名(Jim)と電子メールアドレス(jim@example.com)に解析するにはどうすればよいですか?

編集:私はそれを解析するためのC#コードを探しています。

EDIT2:メールアドレス文字列の先頭にスペースがあったため、MailAddressによって例外がスローされていたことがわかりました。

4

13 に答える 13

20

電子メール アドレスを手動で解析する場合は、RFC2822 ( https://www.rfc-editor.org/rfc/rfc822.html#section-3.4 ) を参照してください。セクション 3.4 では、アドレス形式について説明しています。

ただし、電子メール アドレスを正しく解析するのは簡単ではなく、MailAddressほとんどのシナリオを処理できるはずです。

のMSDNドキュメントによるとMailAddress

http://msdn.microsoft.com/en-us/library/591bk9e8.aspx

表示名でアドレスを解析できる必要があります。彼らは"Tom Smith <tsmith@contoso.com>"例として挙げます。多分引用符が問題ですか?その場合は、引用符を取り除き、MailAddress を使用して残りを解析します。

string emailAddress = "\"Jim\" <jim@example.com>";

MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));

手動で RFC2822 を解析することは、回避できるのであれば問題ありません。

于 2008-10-02T15:40:53.023 に答える
4

私のために働く:

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 クラスには、電子メール アドレスを解析するプライベート メソッドがあります。それがどれほど良いかはわかりませんが、自分で書くよりも使用する傾向があります。

于 2008-10-02T17:16:12.187 に答える
2

試す:

"Jimbo <jim@example.com>"
于 2008-10-02T14:46:01.250 に答える
0

私はこの言語でコーディングしていませんが、確認したい2つの問題があります。

1-なぜ拒否されたのか正確にはわかりません。差し迫った可能性は、example.comのブラックリストがあることでした。

2-あなたが望む本当の解決策はおそらく厳密なバリデーターを実装することです。Stack Overflowは、実際の経験を持つ人がたくさんいるので、これを開発するのにおそらく良い場所です。

必要なものは次のとおりです。

  1. 空白を削除し、明らかに無愛想です。
  2. 個々の部分に解析します(表示名、住所の左側、住所の右側)。
  3. これらのそれぞれをデータ構造固有のバリデーターで検証します。たとえば、右側は有効なFQDN(またはリベラルなメールシステムを使用している場合は非修飾のホスト名)である必要があります。

これは、この問題を解決するための最良の長期的アプローチです。

于 2008-10-02T16:42:31.533 に答える
0
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));
于 2008-10-02T14:46:02.390 に答える
0

試してみてください: "Jim" <jim@example.com> うまくいくかどうかはわかりませんが、電子メール クライアントで一般的に見られる方法です。

于 2008-10-02T14:46:04.713 に答える
0
string inputEmailString = "\"Jimbo\" <jim@example.com>";
string[] strSet =  inputEmailString.Split('\"','<','>');   

MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);
于 2008-10-02T14:46:48.457 に答える
0

2つの間に常にスペースがあると仮定すると、 String.Split(' ') を使用してスペースで分割できます。これにより、パーツが分割された配列が得られます。

だから多分このように:

string str = "\"Jimbo\" jim@example.com"
string[] parts = str.Trim().Replace("\"","").Split(' ')

これを確認する際の問題は、表示名にスペースが含まれている場合、配列自体で 2 つ以上の項目に分割されますが、電子メールは常に最後になることです。

編集 - ブラケットを編集して削除する必要がある場合もあります。それらの置換を追加するだけです。

于 2008-10-02T14:49:05.223 に答える
0

これを書いたところ、文字列から最初の適切な形式の電子メール アドレスを取得します。そうすれば、電子メールアドレスが文字列のどこにあるかを推測する必要がなくなります

改善の余地はたくさんありますが、仕事に行く必要があります:)

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");
    }
}
于 2008-10-02T14:49:54.970 に答える
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);

コメント?

于 2008-10-02T16:23:21.097 に答える
0

それは少し「ラフで準備ができている」ですが、あなたが与えた例ではうまくいきます:

        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('>');
        }
于 2008-10-02T14:51:21.910 に答える
0

埋め込まれたスペースを処理するには、次のように括弧で分割します。

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]);
于 2008-10-02T16:08:27.793 に答える