patternjavaMinor
E-mail MIME message parser
Viewed 0 times
parsermessagemailmime
Problem
As part of a larger Java application I'm working on, I have to retrieve emails and parse the data for the emails' content (subject, date, text, attachments, sender). In the method below, I pass a
```
public MailList getContent(Message message) throws MessagingException, IOException
{
String body = "";
String from = "";
ArrayList attachments = new ArrayList();
String contentType = message.getContentType();
Address[] addresses = message.getFrom();
if(addresses.length == 1)
from = addresses[0].toString();
else
{
for(int num = 0; num < addresses.length - 1; num++)
from += addresses[num].toString() + ", ";
from += addresses[addresses.length].toString();
}
if(contentType.contains("TEXT/PLAIN"))
{
Object content = message.getContent();
if(content != null)
body += content.toString();
}
else if(contentType.contains("TEXT/HTML"))
{
Object content = message.getContent();
if(content != null)
body += Jsoup.parse((String)content).text();
}
else if(contentType.contains("multipart"))
{
Multipart mp = (Multipart)message.getContent();
int numParts = mp.getCount();
for(int count = 0; count < numParts; count++)
{
MimeBodyPart part = (MimeBodyPart)mp.getBodyPart(count);
String content = part.getContent().toString();
if(MimeBodyPart.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
attachments.add(part);
else if(part.getContentType().contains("TEXT/HTML"))
body += Jsoup.parse(content).text();
else
body += content;
}
}
return n
Message as a parameter, which is the Javamail abstract representation of an email. The details of the Message are recovered and then returned as a MailList. A MailList is just a holder for the five objects that describe each email.```
public MailList getContent(Message message) throws MessagingException, IOException
{
String body = "";
String from = "";
ArrayList attachments = new ArrayList();
String contentType = message.getContentType();
Address[] addresses = message.getFrom();
if(addresses.length == 1)
from = addresses[0].toString();
else
{
for(int num = 0; num < addresses.length - 1; num++)
from += addresses[num].toString() + ", ";
from += addresses[addresses.length].toString();
}
if(contentType.contains("TEXT/PLAIN"))
{
Object content = message.getContent();
if(content != null)
body += content.toString();
}
else if(contentType.contains("TEXT/HTML"))
{
Object content = message.getContent();
if(content != null)
body += Jsoup.parse((String)content).text();
}
else if(contentType.contains("multipart"))
{
Multipart mp = (Multipart)message.getContent();
int numParts = mp.getCount();
for(int count = 0; count < numParts; count++)
{
MimeBodyPart part = (MimeBodyPart)mp.getBodyPart(count);
String content = part.getContent().toString();
if(MimeBodyPart.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
attachments.add(part);
else if(part.getContentType().contains("TEXT/HTML"))
body += Jsoup.parse(content).text();
else
body += content;
}
}
return n
Solution
if(addresses.length == 1)
from = addresses[0].toString();
else
{
for(int num = 0; num < addresses.length - 1; num++)
from += addresses[num].toString() + ", ";
from += addresses[addresses.length].toString();
}Concatenations of strings in a loop should be done using a
StringBuilder like so StringBuilder builder = new StringBuilder(1024);
for(int i = 0; i 2)
{
// removing the last appended ", "
builder.setLength(builderLength - 2);
}
String from = builder.toString();if(contentType.contains("TEXT/PLAIN"))
{
Object content = message.getContent();
if(content != null)
body += content.toString();
}
else if(contentType.contains("TEXT/HTML"))
{
Object content = message.getContent();
if(content != null)
body += Jsoup.parse((String)content).text();
}here it would be sufficient to just assign the
content.toString() or Jsoup.parse((String)content).text() to the body variable. There is no need to use +=. else if(contentType.contains("multipart"))
{
Multipart mp = (Multipart)message.getContent();
int numParts = mp.getCount();
for(int count = 0; count < numParts; count++)
{
MimeBodyPart part = (MimeBodyPart)mp.getBodyPart(count);
String content = part.getContent().toString();
if(MimeBodyPart.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
attachments.add(part);
else if(part.getContentType().contains("TEXT/HTML"))
body += Jsoup.parse(content).text();
else
body += content;
}
}As mentioned above if you are using a loop for concatenations of strings this should be done using a
StringBuilder. You will only need the
String content if the execution steps into the else if or else part and because one should declare variables as near to its usage, you could use continue; after the attachment is added like so else if(contentType.contains("multipart"))
{
StringBuilder bodyBuilder = new StringBuilder(1024);
Multipart mp = (Multipart)message.getContent();
int numParts = mp.getCount();
for(int count = 0; count < numParts; count++)
{
MimeBodyPart part = (MimeBodyPart)mp.getBodyPart(count);
if(MimeBodyPart.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
{
attachments.add(part);
continue;
}
String content = part.getContent().toString();
if(part.getContentType().contains("TEXT/HTML"))
{
bodyBuilder.append(Jsoup.parse(content).text());
} else {
bodyBuilder.append(content);
}
}
body = bodyBuilder.toString();
}Code Snippets
if(addresses.length == 1)
from = addresses[0].toString();
else
{
for(int num = 0; num < addresses.length - 1; num++)
from += addresses[num].toString() + ", ";
from += addresses[addresses.length].toString();
}StringBuilder builder = new StringBuilder(1024);
for(int i = 0; i < addresses.length ; i++)
{
builder.append(addresses[i].toString())
.append(", ");
}
int builderLength = builder.length();
if(builderLength > 2)
{
// removing the last appended ", "
builder.setLength(builderLength - 2);
}
String from = builder.toString();if(contentType.contains("TEXT/PLAIN"))
{
Object content = message.getContent();
if(content != null)
body += content.toString();
}
else if(contentType.contains("TEXT/HTML"))
{
Object content = message.getContent();
if(content != null)
body += Jsoup.parse((String)content).text();
}else if(contentType.contains("multipart"))
{
Multipart mp = (Multipart)message.getContent();
int numParts = mp.getCount();
for(int count = 0; count < numParts; count++)
{
MimeBodyPart part = (MimeBodyPart)mp.getBodyPart(count);
String content = part.getContent().toString();
if(MimeBodyPart.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
attachments.add(part);
else if(part.getContentType().contains("TEXT/HTML"))
body += Jsoup.parse(content).text();
else
body += content;
}
}else if(contentType.contains("multipart"))
{
StringBuilder bodyBuilder = new StringBuilder(1024);
Multipart mp = (Multipart)message.getContent();
int numParts = mp.getCount();
for(int count = 0; count < numParts; count++)
{
MimeBodyPart part = (MimeBodyPart)mp.getBodyPart(count);
if(MimeBodyPart.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
{
attachments.add(part);
continue;
}
String content = part.getContent().toString();
if(part.getContentType().contains("TEXT/HTML"))
{
bodyBuilder.append(Jsoup.parse(content).text());
} else {
bodyBuilder.append(content);
}
}
body = bodyBuilder.toString();
}Context
StackExchange Code Review Q#101254, answer score: 6
Revisions (0)
No revisions yet.