كيفية تحليل تنسيق عنوان البريد الإلكتروني في اسم العرض وعنوان البريد الإلكتروني ؟

StackOverflow https://stackoverflow.com/questions/162681

  •  03-07-2019
  •  | 
  •  

سؤال

وبالنظر إلى عنوان البريد الإلكتروني:"جيم" <jim@example.com>

إذا كنت في محاولة لتمرير هذا MailAddress أحصل على استثناء:

السلسلة المحددة ليست في شكل مطلوب عنوان البريد الإلكتروني.

كيف يمكنني تحليل هذا العنوان إلى اسم العرض (جيم) وعنوان البريد الإلكتروني (jim@example.com) في C# ؟

تحرير:أنا أبحث عن C# كود لتحليل ذلك.

EDIT2:لقد وجدت أن الاستثناء التي القيت من قبل MailAddress لأنه كان لدي مساحة في بداية عنوان البريد الإلكتروني السلسلة.

هل كانت مفيدة؟

المحلول

إذا كنت تبحث لتحليل عنوان البريد الإلكتروني يدويا، وتريد أن تقرأ RFC2822 (<لأ href = "https://tools.ietf.org/html/rfc822.html#section-3.4" يختلط = "نوفولو noreferrer "> https://tools.ietf.org/html/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 لا يستحق عناء إذا كان يمكنك تجنب ذلك.

نصائح أخرى

ويعمل بالنسبة لي:

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>"

ومحاولة: "جيم" ليس متأكدا مما اذا كان سوف تعمل، ولكن هذه هي الطريقة التي أرى عموما في عملاء البريد الإلكتروني.

وإذا قمت بإجراء افتراض أن هناك دائما مسافة بين 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");
    }
}

وانها قليلا "الخام وعلى استعداد" لكنه سيعمل على سبيل المثال كنت قد أعطيت:

        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);

وتعليقات؟

لا رمز في هذه اللغة ، ولكن أرى المسألتين قد ترغب في التحقق:

1 - أنت لا تعرف بالضبط لماذا تم رفضها.على الفور إمكانية أن لديها القائمة السوداء example.com.

2 - الحل الحقيقي تريده هو أن من المحتمل تنفيذ صارمة المصادقة.تجاوز سعة المكدس هو على الارجح مكان جيد لتطوير هذا, لأن هناك الكثير من الناس مع الخبرة العملية.

هنا بضعة أشياء تحتاج:

  1. تقليم بيضاء و من الواضح الغبار المتراكم تحت السرير.
  2. تحليل في الأجزاء الفردية (اسم العرض ، الأيسر من جانب ، الجانب الأيمن من العنوان).
  3. التحقق من صحة كل من هذه مع بنية بيانات محددة المصادقة.على سبيل المثال, الجانب الأيمن يجب أن يكون ساري المفعول FQDN (أو غير مؤهلين المضيف إذا كنت على الليبرالية نظام البريد).

هذا هو أفضل نهج طويل الأجل لحل هذه المشكلة.

ويمكنني أن أقترح لي حل يستند إلى التعابير المنطقية للقيم حقل عنوان البريد الإلكتروني فك ( "من"، "إلى") وقيمة حقل "الموضوع"

HTTPS: // شبكة الاتصالات العالمية .codeproject.com / نصائح / 1198601 / توزيع و-فك-القيم-من-بعض-البريد الإلكتروني، رسالة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top