Разбор 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
   }
}
Другие вопросы по тегам