Parse MIME sender in Java (RFC 822)

1.2k Views Asked by At

MIME message senders appear in formats such as:

"John Doe" <[email protected]>
<[email protected]>

I'm trying to figure out how to extract the string "[email protected]" in the above examples, although I will also need the "johndoe" and "gmail.com" parts (per RFC I'm pretty sure splitting on @ is all that's needed from here). Obviously regex-ing up my own parser is one (not great) option.

It seemed this may be possible using javax.mail.internet.MimeMessage. All of the constructors require a Folder which I do not have (well, I sort of do, it exists in the IMAP layer), e.g.

MimeMessage(Folder folder, InputStream is, int msgnum) 

Which makes me feel I'm using this class wrong. Nonetheless, if I parse this way I do get access to the getFrom() method which returns an array of Address, which itself doesn't offer methods of use to me.

Using mime4j it's easy to get this far:

case T_FIELD: // field means header
    if(token.getName() == "from") {
        // get raw string as above - unparsed

So using mime4j or using java, javax etc. utilities it should be possible to extract the "[email protected]" part of the address from there, but I haven't found a class within javax or mime4j that is responsible for this yet.

1

There are 1 best solutions below

1
On

I think you need InternetAddress class from javax.mail: http://docs.oracle.com/javaee/6/api/javax/mail/internet/InternetAddress.html#getAddress()

Minimum working example:

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\" <[email protected]>";
        InternetAddress addr = new InternetAddress(fullemail);
        System.out.println(addr.getPersonal()); // John Doe
        System.out.println(addr.getAddress());  // [email protected]
   }
}