2013-08-28 2 views
4

Как многие люди не знают, адреса электронной почты требуют библиотеки для разбора. Простых регулярных выражений, таких как @(.*), недостаточно. Адреса электронной почты могут содержать комментарии, которые могут содержать символы, такие как @, разбивая простые регулярные выражения.Parse RFC 2822 адреса электронной почты в Java

Существует Node.js library, который анализирует RFC 2822 адреса:

var address = addresses[0]; 
console.log("Email address: " + address.address); 
console.log("Email name: " + address.name()); 
console.log("Reformatted: " + address.format()); 
console.log("User part: " + address.user()); 
console.log("Host part: " + address.host()); 

, который является почти прямым портом модуля PERL Mail::Address.

Это то, чего я ожидал бы существовать в классе Java InternetAddress, но он не разрушает вещи дальше, чем полный адрес, который может включать, например, [email protected]. Но я пытаюсь извлечь часть gmail.com, которая не включает в себя метод.

Я удивлен, что не могу найти общую библиотеку, которая решает это, но, вероятно, у многих людей есть эта проблема. Как это можно решить с помощью библиотеки или нет?

+1

Может комментарии появляются в имени домена? Если нет, просто проанализируйте адрес электронной почты после 'lastIndexOf (« @ »)' –

+0

@SotiriosDelimanolis да, они могут. – djechlin

ответ

0

В большинстве случаев нет необходимости разбить адрес на его составные части, так как вы ничего не можете сделать с частями. Предполагая, что у вас есть настоятельная необходимость, есть библиотеки, которые будут выполнять более полную проверку, чем это делает JavaMail. Here's one I found quickly. Я уверен, что есть и другие.

+1

Ну, в частности, мне нужен домен прямо сейчас - попытка, например, извлеките «gmail.com» с «[email protected]». Я был очень удивлен, что не смог найти это в Javamail или Apache, но я посмотрю вашу ссылку. Я думаю, что это может быть менее полезно с точки зрения создания IMAP или SMTP-клиента или сервера, но мы используем этот материал больше для анализа писем (категоризация как личных/подписных и т. Д.), – djechlin

1

Если вам нужно просто получить часть домена из адреса электронной почты (быть в курсе рассылки групп, так как они не имеют @), вы можете сделать так:

int index = "[email protected]".lastIndexOf("@"); 
String domain = "[email protected]".substring(index+1); 

Я LastIndexOf здесь с помощью RFC2822 адреса электронной почты может содержать более одного символа @ (если он экранирован). Если вы хотите, чтобы пропустить рассылки групп есть метод в InternetAddress класса isGroup()

PS также может быть, что адрес содержит информацию о маршрутизации:

@donald.mit.edu,@mail.mit.edu:[email protected] 

или адрес литералы:

[email protected][192.168.134.1] 
Смежные вопросы