Reputation: 5954
Is it possible to get only the count of attachments for a mail in Java? I tried using this:
DataHandler handler = message.getDataHandler();
AttachedFileName= handler.getName();
This lists out all the attachments for all mails inbox but not for specific mails.
Is this possible if so how?
Thanks!
Upvotes: 5
Views: 1584
Reputation: 1
I had a similar problem. The accepted answer didn't work for me because multipart may not necessarily be an attachment file. I counted the number of attachments by ignoring the other possible cases in multipart.
int count = 0;
Multipart multipart = (Multipart) message.getContent();
for(int i = multipart.getCount() - 1; i >= 0; i--)
{
BodyPart bodyPart = multipart.getBodyPart(i);
String bodyPartContentType = bodyPart.getContentType();
if(isSimpleType(bodyPartContentType)) continue;
else if(isMultipartType(bodyPartContentType)) continue;
else if(!isTextPlain(bodyPartContentType)) count++;
}
You can check simple type, multipart type, and text using these methods:
private boolean isTextPlain(String contentType)
{
return (contentType.contains("TEXT/PLAIN") || (contentType.contains("TEXT/plain")));
}
private boolean isSimpleType(String contentType)
{
if(contentType.contains("TEXT/HTML") || contentType.contains("text") ||
contentType.contains("TEXT/html")) return true;
return false;
}
private boolean isMultipartType(String contentType)
{
if(contentType.contains("multipart") || contentType.contains("multipart/mixed")) return true;
return false;
}
This worked for me.
Upvotes: 0
Reputation: 3234
I don't have enough reputation to comment on the accepted solution:
Multipart multipart = (Multipart) message.getContent();
int attachmentCount = multipart.getCount();
But I don't think that it is ideal for the following reasons:
Many email clients [For example: Thunderbird] send all HTML emails as multipart/alternative. They include a HTML part and an alternative plain text part. Historically, it was done to let clients choose the best alternative that they are capable of displaying.
Not everything included as a part is an attachment. For example, many images are not displayed as attachments in email clients because their disposition is set to "inline".
In summary, this solution potentially counts all HTML emails as having attachments and all emails with inline images as having attachments.
Here is an alternative that ignores parts not normally considered attachments:
private int getAttachmentCount(Message message) {
int count = 0;
try {
Object object = mMessage.getContent();
if (object instanceof Multipart) {
Multipart parts = (Multipart) object;
for (int i = 0; i < parts.getCount(); ++i) {
MimeBodyPart part = (MimeBodyPart) parts.getBodyPart(i);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()))
++count;
}
}
} catch (IOException | MessagingException e) {
e.printStackTrace();
}
return count;
}
I know that this solution gets the body part, but I believe that it is the only accurate way to see if it is an attachment.
Upvotes: 4
Reputation: 12924
This should give you the attachment count,
Multipart multipart = (Multipart) message.getContent();
int attachmentCount = multipart.getCount();
Upvotes: 4