구문 분석하는 방법 포맷 이메일 주소로 전시의 이름과 이메일 주소?
-
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- 당신이 원하는 실제 솔루션은 아마도 엄격한 검증기를 구현하는 것입니다. 스택 오버 플로우는 아마도 실용적인 경험을 가진 사람들이 많기 때문에 이것을 개발하기에 좋은 곳일 것입니다.
필요한 몇 가지 사항은 다음과 같습니다.
- 공백과 분명히 Cruft를 다듬습니다.
- 개별 부품 (디스플레이 이름, 주소의 왼쪽, 주소 오른쪽)으로 구문 분석합니다.
- 데이터 구조 특정 유효성 검사기로 각각을 검증하십시오. 예를 들어, 오른쪽은 유효한 FQDN (또는 자유 메일 시스템에있는 경우 자격이없는 호스트 이름)이어야합니다.
이것이이 문제를 해결하기위한 최고의 장기 접근법입니다.
이메일 주소 필드 값 ( "From", "to") 및 필드 값 "주제"를 디코딩하기위한 Regex 기반 솔루션을 제안 할 수 있습니다.
https://www.codeproject.com/tips/1198601/parsing-and-decoding-values-of-some-email-message