Как разобрать форматированный адрес электронной почты в отображаемое имя и адрес электронной почты?
Учитывая адрес электронной почты: "Jim" < [email protected] >
Если я попытаюсь передать это в MailAddress, я получаю исключение:
Указанная строка не в форме, необходимой для адреса электронной почты.
Как разобрать этот адрес в отображаемом имени (Jim) и адрес электронной почты ([email protected]) на С#?
EDIT: Я ищу код С# для его анализа.
EDIT2: Я обнаружил, что исключение было выбрано MailAddress, потому что у меня было место в начале строки адреса электронной почты.
Ответы
Ответ 1
Если вы хотите вручную проанализировать адрес электронной почты, вы хотите прочитать 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 <[email protected]>"
. Может быть, цитаты - это проблема? Если это так, просто разделите кавычки и используйте MailAddress для анализа остальных.
string emailAddress = "\"Jim\" <[email protected]>";
MailAddress address = new MailAddress(emailAddress.Replace("\"", ""));
В ручном анализе RFC2822 не стоит проблем, если вы можете избежать этого.
Ответ 2
Работает для меня:
string s = "\"Jim\" <[email protected]>";
System.Net.Mail.MailAddress a = new System.Net.Mail.MailAddress(s);
Debug.WriteLine("DisplayName: " + a.DisplayName);
Debug.WriteLine("Address: " + a.Address);
Класс MailAddress имеет закрытый метод, который анализирует адрес электронной почты. Не знаю, насколько это хорошо, но я хотел бы использовать его, а не писать свои собственные.
Ответ 3
Try:
"Jimbo <[email protected]>"
Ответ 4
new MailAddress("[email protected]", "Jimbo");
чтобы проанализировать строку, которую вы дали:
string input = "\"Jimbo\" [email protected]";
string[] pieces = input.Split(' ');
MailAddress ma = new MailAddress(pieces[1].Replace("<", string.Empty).Replace(">",string.Empty), pieces[0].Replace("\"", string.Empty));
Ответ 5
попробуйте: "Джим" < [email protected].com > не уверен, что это сработает, но как я обычно вижу это в почтовых клиентах.
Ответ 6
string inputEmailString = "\"Jimbo\" <[email protected]>";
string[] strSet = inputEmailString.Split('\"','<','>');
MailAddress mAddress = new MailAddress(strSet[0], strSet[2]);
Ответ 7
если вы сделаете предположение, что между 2 всегда есть пробел, вы можете просто использовать String.Split(''), чтобы разделить его на пробелы. Это даст вам массив с разделенными частями.
так может быть так:
string str = "\"Jimbo\" [email protected]"
string[] parts = str.Trim().Replace("\"","").Split(' ')
Проблема с этим для проверки заключается в том, что если в отображаемом имени есть пробел, он будет разбит на 2 или более элементов в вашем массиве, но письмо всегда будет последним.
Изменить - вам также может потребоваться отредактировать скобки, просто добавьте замену с ними.
Ответ 8
Я только что написал это, он захватывает первый хорошо сформированный адрес электронной почты из строки. Таким образом, вы не должны предполагать, где находится адрес электронной почты в строке
Множество возможностей для улучшения, но мне нужно уйти на работу:)
class Program
{
static void Main(string[] args)
{
string email = "\"Jimbo\" <[email protected]>";
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");
}
}
Ответ 9
Это немного "грубо и готово", но будет работать для примера, который вы указали:
string emailAddress, displayname;
string unparsedText = "\"Jimbo\" <[email protected]>";
string[] emailParts = unparsedText.Split(new char[] { '<' });
if (emailParts.Length == 2)
{
displayname = emailParts[0].Trim(new char[] { ' ', '\"' });
emailAddress = emailParts[1].TrimEnd('>');
}
Ответ 10
Чтобы обрабатывать встроенные пространства, разделите их на скобки следующим образом:
string addrin = "\"Jim Smith\" <[email protected]>";
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]);
Ответ 11
Итак, это то, что я сделал. Это немного быстро и грязно, но, похоже, работает.
string emailTo = "\"Jim\" <[email protected]>";
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);
Комментарии?
Ответ 12
Я не кодирую на этом языке, но вижу два вопроса, которые вы можете проверить:
1- Вы точно не знаете, почему это было отклонено. Сразу появилась возможность, что у него есть черный список для example.com.
2- Реальное решение, которое вы хотите, - это, вероятно, реализовать строгий валидатор. Переполнение стека, вероятно, является хорошим местом для его развития, потому что есть много людей с практическим опытом.
Вот пара вещей, которые вам нужны:
- обрезать пробелы и, очевидно, крутить.
- разобрать на отдельные части (отображаемое имя, левая сторона адреса, правая сторона адреса).
- проверить каждый из них с помощью валидатора, специфичного для структуры данных. Например, правая сторона должна быть допустимым FQDN (или неквалифицированным именем хоста, если вы находитесь в либеральной почтовой системе).
Это лучший долгосрочный подход к решению этой проблемы.
Ответ 13
Я могу предложить свое решение на основе regex для декодирования значений полей адреса электронной почты ( "От", "Кому" ) и значения поля "Тема"
https://www.codeproject.com/Tips/1198601/Parsing-and-Decoding-Values-of-Some-Email-Message