синхронизированный простой означает, что два потока не могут одновременно обращаться к блоку / методу. Когда мы говорим, что любой блок / метод класса синхронизирован, это означает, что только один поток может обращаться к ним за раз. Внутренний поток, который пытается получить к нему доступ, сначала берет блокировку этого объекта, и пока эта блокировка недоступна, ни один другой поток не может получить доступ к любому из синхронизированных методов / блоков этого экземпляра класса.
Обратите внимание, что другой поток может получить доступ к методу того же объекта, который не определен для синхронизации. Поток может освободить блокировку, вызвав
Object.wait()
Если Вы надеетесь анализировать адрес электронной почты вручную, Вы хотите считать 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 имеет закрытый метод, который анализирует адрес электронной почты. Не знайте, насколько хороший это, но я был бы склонен использовать его вместо того, чтобы писать мое собственное.
попытка: "Jim" < jim@example.com> не уверенный, если это будет работать, но это - то, как я обычно вижу его в почтовых клиентах.
при создании предположения всегда существует пространство между этими 2, Вы могли бы просто использовать Строку. Разделение ('') для разделения его на пробелах. Это дало бы Вам массив с разделением частей.
поэтому, возможно, как это:
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-действительное решение, которое Вы хотите, состоит в том, чтобы, вероятно, реализовать строгий блок проверки допустимости. Переполнение стека является, вероятно, хорошим местом для разработки этого, потому что существует много людей с практическим опытом.
Вот пара вещей, в которых Вы нуждаетесь:
Это - лучший долгосрочный подход к решению этой проблемы.