Разбор MIME-отправителя в Java (RFC 822)
Отправители сообщений MIME отображаются в таких форматах, как:
"John Doe" <johndoe@gmail.com>
<johndoe@gmail.com>
Я пытаюсь выяснить, как извлечь строку "johndoe@gmail.com" в приведенных выше примерах, хотя мне также понадобятся части "johndoe" и "gmail.com" (согласно RFC, я вполне уверен, что разделение на @
это все что нужно отсюда). Очевидно, что регулярное выражение моего собственного синтаксического анализатора - один (не очень) вариант.
Казалось, это возможно с помощью javax.mail.internet.MimeMessage
, Все конструкторы требуют Folder
которого у меня нет (ну, вроде как, он существует на уровне IMAP), например
MimeMessage(Folder folder, InputStream is, int msgnum)
Что заставляет меня чувствовать, что я использую этот класс неправильно. Тем не менее, если я проанализирую таким образом, я получу доступ к getFrom()
метод, который возвращает массив Address
, который сам не предлагает методы использования для меня.
Используя mime4j, это легко сделать:
case T_FIELD: // field means header
if(token.getName() == "from") {
// get raw string as above - unparsed
Поэтому, используя mime4j или утилиты java, javax и т. Д., Можно извлечь часть адреса "a@b.com", но я не нашел внутри javax или mime4j класса, который бы отвечал за это.,
1 ответ
Я думаю, что вам нужен класс InternetAddress от javax.mail: http://docs.oracle.com/javaee/6/api/javax/mail/internet/InternetAddress.html
Минимальный рабочий пример:
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
public class JavaMailExample {
public static void main(String[] args) throws AddressException {
String fullemail = "\"John Doe\" <johndoe@gmail.com>";
InternetAddress addr = new InternetAddress(fullemail);
System.out.println(addr.getPersonal()); // John Doe
System.out.println(addr.getAddress()); // johndoe@gmail.com
}
}