구문 분석하는 방법 포맷 이메일 주소로 전시의 이름과 이메일 주소?

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

  •  03-07-2019
  •  | 
  •  

문제

주메일 주소:"짐" <jim@example.com>

면 내가 전달하려고 이 메일 주소가 나는 예외:

지정된 문자열이지에서 필요한 양식을 위해 전자 메일 주소입니다.

어떻게 분석 이 주소를 표시 이름(Jim)및 이메일 주소(jim@example.com),C#?

편집:내가 찾는 C#코드에 구문 분석합니다.

EDIT2:내가 찾는 예외에서 발생 MailAddress 했기 때문에 공간에서 시작 이메일 주소의 문자열입니다.

도움이 되었습니까?

해결책

찾고 있다면 분석하의 이메일 주소를 직접 읽고 싶 RFC2822(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>"

시도 : "Jim"u003Cjim@example.com> 그것이 작동하는지 확실하지 않지만 일반적으로 이메일 클라이언트에서 볼 수 있습니다.

당신이 가정을한다면 항상 2 사이에 공간이 있다고 가정하면 string.split ( '')을 사용하여 공백에 분할 할 수 있습니다. 그것은 당신에게 부품 분할이있는 배열을 줄 것입니다.

그래서 아마도 : 아마도 :

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

이를 확인 해야하는 문제는 디스플레이 이름에 공간이 있으면 배열 자체의 2 개 이상의 항목으로 분할되지만 이메일은 항상 마지막이라는 것입니다.

편집 - 브래킷을 편집해야 할 수도 있습니다. 대체를 추가하면 대체를 추가하십시오.

나는 단지 이것을 썼고,그것을 잡고 첫 번째 아니라 형성된 e-mail 주소의 문자열입니다.되는 것을 방지할 수 있습니다 있다고 가정하는 전자 메일 주소에서 문자열

을위한 공간을 많이 개선,하지만 나는 일을 떠날 필요가:)

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- 왜 그것이 거부되었는지 정확히 모른다. 즉각적인 가능성은 exember의 블랙리스트가 있다는 것이 었습니다.

2- 당신이 원하는 실제 솔루션은 아마도 엄격한 검증기를 구현하는 것입니다. 스택 오버 플로우는 아마도 실용적인 경험을 가진 사람들이 많기 때문에 이것을 개발하기에 좋은 곳일 것입니다.

필요한 몇 가지 사항은 다음과 같습니다.

  1. 공백과 분명히 Cruft를 다듬습니다.
  2. 개별 부품 (디스플레이 이름, 주소의 왼쪽, 주소 오른쪽)으로 구문 분석합니다.
  3. 데이터 구조 특정 유효성 검사기로 각각을 검증하십시오. 예를 들어, 오른쪽은 유효한 FQDN (또는 자유 메일 시스템에있는 경우 자격이없는 호스트 이름)이어야합니다.

이것이이 문제를 해결하기위한 최고의 장기 접근법입니다.

이메일 주소 필드 값 ( "From", "to") 및 필드 값 "주제"를 디코딩하기위한 Regex 기반 솔루션을 제안 할 수 있습니다.

https://www.codeproject.com/tips/1198601/parsing-and-decoding-values-of-some-email-message

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top