/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
*/
package com.liferay.mail.reader.internal.imap;
import com.liferay.mail.reader.attachment.AttachmentHandler;
import com.liferay.mail.reader.configuration.MailGroupServiceConfiguration;
import com.liferay.mail.reader.constants.MailConstants;
import com.liferay.mail.reader.exception.MailException;
import com.liferay.mail.reader.exception.NoSuchMessageException;
import com.liferay.mail.reader.internal.util.HtmlContentUtil;
import com.liferay.mail.reader.model.Account;
import com.liferay.mail.reader.model.MailFile;
import com.liferay.mail.reader.service.AttachmentLocalServiceUtil;
import com.liferay.mail.reader.service.FolderLocalServiceUtil;
import com.liferay.mail.reader.service.MessageLocalServiceUtil;
import com.liferay.petra.mail.InternetAddressUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.module.configuration.ConfigurationException;
import com.liferay.portal.kernel.module.configuration.ConfigurationProviderUtil;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.UIDFolder;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.commons.lang.time.StopWatch;
/**
* @author Scott Lee
* @author Peter Fellwock
*/
public class IMAPAccessor {
public IMAPAccessor(User user, Account account, String password) {
_user = user;
_account = account;
_password = password;
_imapConnection = new IMAPConnection(account, password);
}
public String[] addFolder(String displayName) throws MailException {
try {
String fullName = displayName;
if (Validator.isNotNull(_account.getFolderPrefix())) {
Store store = _imapConnection.getStore(true);
Folder jxFolder = store.getDefaultFolder();
fullName =
_account.getFolderPrefix() + jxFolder.getSeparator() +
displayName;
}
Folder jxFolder = getFolder(fullName);
if (jxFolder.exists()) {
throw new MailException(MailException.FOLDER_ALREADY_EXISTS);
}
else {
if (jxFolder.create(Folder.HOLDS_MESSAGES)) {
return new String[] {
jxFolder.getFullName(), jxFolder.getName()
};
}
throw new MailException(MailException.FOLDER_CREATE_FAILED);
}
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public void closeFolder(Folder jxFolder, boolean expunge)
throws MailException {
try {
if ((jxFolder == null) || !jxFolder.isOpen()) {
return;
}
if (expunge) {
jxFolder.expunge();
}
jxFolder.close(expunge);
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public void deleteFolder(long folderId) throws PortalException {
try {
Folder jxFolder = getFolder(folderId);
if (!jxFolder.exists()) {
throw new MailException(MailException.FOLDER_DOES_NOT_EXIST);
}
jxFolder.delete(true);
if (jxFolder.exists()) {
throw new MailException(MailException.FOLDER_DELETE_FAILED);
}
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public void deleteMessages(long folderId, long[] messageIds)
throws PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
jxFolder.addMessageCountListener(
new IMAPMessageCountListener(_user, _account, _password));
List<Message> jxMessages = getMessages(jxFolder, messageIds, true);
for (Message jxMessage : jxMessages) {
jxMessage.setFlag(Flags.Flag.DELETED, true);
}
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, true);
}
}
public AttachmentHandler getAttachment(
long folderId, long messageId, String contentPath)
throws IOException, PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
Message jxMessage = getMessage(jxFolder, messageId);
if (jxMessage == null) {
throw new MailException(
MailException.MESSAGE_NOT_FOUND_ON_SERVER);
}
Part part = getPart(jxMessage, contentPath);
AttachmentHandler attachmentHandler = new IMAPAttachmentHandler(
part.getInputStream(), jxFolder);
return attachmentHandler;
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public List<Folder> getFolders() throws MailException {
try {
List<Folder> jxFolders = new ArrayList<>();
Store store = _imapConnection.getStore(true);
Folder jxFolder = store.getDefaultFolder();
getFolders(jxFolders, jxFolder.list());
return jxFolders;
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public long[] getMessageUIDs(Folder jxFolder, Message[] jxMessages)
throws MailException {
try {
FetchProfile fetchProfile = new FetchProfile();
fetchProfile.add(UIDFolder.FetchProfileItem.UID);
jxFolder.fetch(jxMessages, fetchProfile);
long[] remoteMessageIds = new long[jxMessages.length];
for (int i = 0; i < jxMessages.length; i++) {
Message jxMessage = jxMessages[i];
remoteMessageIds[i] = getUID(jxFolder, jxMessage);
}
return remoteMessageIds;
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public long[] getMessageUIDs(
long folderId, int pageNumber, int messagesPerPage)
throws PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
int[] messageIndexes = getMessageIndexes(
jxFolder.getMessageCount(), pageNumber, messagesPerPage);
if (messageIndexes[0] == 0) {
return new long[0];
}
Message[] jxMessages = jxFolder.getMessages(
messageIndexes[0], messageIndexes[1]);
return getMessageUIDs(jxFolder, jxMessages);
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, false);
}
}
public boolean hasNewMessages(long folderId) throws PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
int messageCount = jxFolder.getMessageCount();
Message jxMessage = getMessage(folderId, jxFolder, false);
if (jxMessage == null) {
if (messageCount <= 0) {
return false;
}
return true;
}
if (messageCount == jxMessage.getMessageNumber()) {
return false;
}
return true;
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, false);
}
}
public void moveMessages(
long sourceFolderId, long destinationFolderId, long[] messageIds,
boolean deleteMissingMessages)
throws PortalException {
Folder sourceJxFolder = null;
Folder destinationJxFolder = null;
try {
sourceJxFolder = openFolder(sourceFolderId);
sourceJxFolder.addMessageCountListener(
new IMAPMessageCountListener(_user, _account, _password));
destinationJxFolder = openFolder(destinationFolderId);
destinationJxFolder.addMessageCountListener(
new IMAPMessageCountListener(_user, _account, _password));
List<Message> jxMessages = getMessages(
sourceJxFolder, messageIds, deleteMissingMessages);
for (Message jxMessage : jxMessages) {
destinationJxFolder.appendMessages(new Message[] {jxMessage});
jxMessage.setFlag(Flags.Flag.DELETED, true);
}
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(sourceJxFolder, true);
closeFolder(destinationJxFolder, false);
}
}
public Folder openFolder(Folder jxFolder) throws MailException {
try {
if (jxFolder.isOpen()) {
return jxFolder;
}
jxFolder.open(Folder.READ_WRITE);
return jxFolder;
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public String[] renameFolder(long folderId, String newDisplayName)
throws PortalException {
try {
Folder jxFolder = getFolder(folderId);
String newFullName = StringPool.BLANK;
if (Validator.isNotNull(_account.getFolderPrefix())) {
Store store = _imapConnection.getStore(true);
Folder defaultJxFolder = store.getDefaultFolder();
newFullName =
_account.getFolderPrefix() +
defaultJxFolder.getSeparator() + newDisplayName;
}
if (!jxFolder.exists()) {
throw new MailException(MailException.FOLDER_DOES_NOT_EXIST);
}
if (jxFolder.renameTo(getFolder(newFullName))) {
return new String[] {
jxFolder.getFullName(), jxFolder.getName()
};
}
else {
throw new MailException(MailException.FOLDER_RENAME_FAILED);
}
}
catch (MessagingException me) {
throw new MailException(me);
}
}
public void sendMessage(
String personalName, String sender, Address[] to, Address[] cc,
Address[] bcc, String subject, String body,
List<MailFile> mailFiles)
throws PortalException {
Thread currentThread = Thread.currentThread();
currentThread.setContextClassLoader(Session.class.getClassLoader());
Folder jxFolder = null;
try {
jxFolder = openFolder(_account.getSentFolderId());
Message jxMessage = createMessage(
personalName, sender, to, cc, bcc, subject, body, mailFiles);
Transport transport = _imapConnection.getTransport();
transport.sendMessage(jxMessage, jxMessage.getAllRecipients());
transport.close();
jxFolder.addMessageCountListener(
new IMAPMessageCountListener(_user, _account, _password));
jxFolder.appendMessages(new Message[] {jxMessage});
}
catch (MessagingException me) {
throw new MailException(me);
}
catch (UnsupportedEncodingException uee) {
throw new MailException(uee);
}
finally {
closeFolder(jxFolder, false);
currentThread.setContextClassLoader(
IMAPAccessor.class.getClassLoader());
}
}
public void storeContents(long folderId, long[] remoteMessageIds)
throws IOException, PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
Message[] jxMessages = getMessagesByUID(jxFolder, remoteMessageIds);
FetchProfile fetchProfile = new FetchProfile();
fetchProfile.add(UIDFolder.FetchProfileItem.CONTENT_INFO);
fetchProfile.add(UIDFolder.FetchProfileItem.FLAGS);
fetchProfile.add(UIDFolder.FetchProfileItem.UID);
jxFolder.fetch(jxMessages, fetchProfile);
for (Message jxMessage : jxMessages) {
String flags = getFlags(jxMessage);
long remoteMessageId = getUID(jxFolder, jxMessage);
com.liferay.mail.reader.model.Message message =
MessageLocalServiceUtil.getMessage(
folderId, remoteMessageId);
StringBundler bodyPlain = new StringBundler();
StringBundler bodyHtml = new StringBundler();
List<MailFile> mailFiles = new ArrayList<>();
getParts(
_user.getUserId(), bodyPlain, bodyHtml, StringPool.BLANK,
jxMessage, mailFiles);
if (bodyHtml.length() == 0) {
if (bodyPlain.length() == 0) {
bodyHtml.append(" ");
}
else {
bodyHtml = bodyPlain;
}
}
if (flags.indexOf(MailConstants.FLAG_SEEN) == -1) {
jxMessage.setFlag(Flags.Flag.SEEN, false);
}
AttachmentLocalServiceUtil.deleteAttachments(
message.getCompanyId(), message.getMessageId());
for (MailFile mailFile : mailFiles) {
AttachmentLocalServiceUtil.addAttachment(
_user.getUserId(), message.getMessageId(),
mailFile.getContentPath(), mailFile.getFileName(),
mailFile.getSize(), mailFile.getFile());
}
MessageLocalServiceUtil.updateContent(
message.getMessageId(), bodyHtml.toString(), flags);
}
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, false);
}
}
public void storeEnvelopes(long folderId, boolean allMessages)
throws PortalException {
Folder jxFolder = null;
try {
com.liferay.mail.reader.model.Folder folder =
FolderLocalServiceUtil.fetchFolder(folderId);
if (folder == null) {
return;
}
jxFolder = openFolder(folderId);
int messageCount = jxFolder.getMessageCount();
FolderLocalServiceUtil.updateFolder(
folderId, folder.getFullName(), folder.getDisplayName(),
messageCount);
if (messageCount == 0) {
return;
}
Message oldestJxMessage = getMessage(folderId, jxFolder, true);
Message newestJxMessage = getMessage(folderId, jxFolder, false);
Message[] jxMessages = new Message[0];
if (allMessages) {
if (_log.isDebugEnabled()) {
_log.debug(
"Downloading all messages from folder " +
jxFolder.getFullName());
}
jxMessages = jxFolder.getMessages();
}
else if ((oldestJxMessage == null) && (newestJxMessage == null)) {
if (_log.isDebugEnabled()) {
_log.debug(
"Downloading messages from folder " +
jxFolder.getFullName() + " for the first time");
}
int startingMessageNumber =
messageCount - getMessageSyncContact();
if (startingMessageNumber < 1) {
startingMessageNumber = 1;
}
jxMessages = jxFolder.getMessages(
startingMessageNumber, messageCount);
}
else {
int oldestMessageNumber = oldestJxMessage.getMessageNumber();
int newestMessageNumber = newestJxMessage.getMessageNumber();
if (newestMessageNumber != messageCount) {
if (_log.isDebugEnabled()) {
_log.debug(
"Downloading new messages from folder " +
jxFolder.getFullName());
}
jxMessages = jxFolder.getMessages(
newestMessageNumber + 1, messageCount);
}
else if (oldestMessageNumber != 1) {
if (_log.isDebugEnabled()) {
_log.debug(
"Downloading old messages from folder " +
jxFolder.getFullName());
}
int startingMessageNumber =
oldestMessageNumber - getMessageSyncContact();
if (startingMessageNumber < 1) {
startingMessageNumber = 1;
}
jxMessages = jxFolder.getMessages(
startingMessageNumber, oldestMessageNumber - 1);
}
}
storeEnvelopes(folderId, jxFolder, jxMessages);
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, false);
}
}
public void storeEnvelopes(
long folderId, Folder jxFolder, Message[] jxMessages)
throws PortalException {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
try {
FetchProfile fetchProfile = new FetchProfile();
fetchProfile.add(UIDFolder.FetchProfileItem.ENVELOPE);
fetchProfile.add(UIDFolder.FetchProfileItem.FLAGS);
fetchProfile.add(UIDFolder.FetchProfileItem.UID);
jxFolder.fetch(jxMessages, fetchProfile);
for (Message jxMessage : jxMessages) {
String sender = InternetAddressUtil.toString(
jxMessage.getFrom());
String to = InternetAddressUtil.toString(
jxMessage.getRecipients(RecipientType.TO));
String cc = InternetAddressUtil.toString(
jxMessage.getRecipients(RecipientType.CC));
String bcc = InternetAddressUtil.toString(
jxMessage.getRecipients(RecipientType.BCC));
Date sentDate = jxMessage.getSentDate();
String subject = jxMessage.getSubject();
String flags = getFlags(jxMessage);
long remoteMessageId = getUID(jxFolder, jxMessage);
String contentType = jxMessage.getContentType();
try {
MessageLocalServiceUtil.getMessage(
folderId, remoteMessageId);
}
catch (NoSuchMessageException nsme) {
MessageLocalServiceUtil.addMessage(
_user.getUserId(), folderId, sender, to, cc, bcc,
sentDate, subject, StringPool.BLANK, flags,
remoteMessageId, contentType);
}
}
com.liferay.mail.reader.model.Folder folder =
FolderLocalServiceUtil.getFolder(folderId);
FolderLocalServiceUtil.updateFolder(
folderId, folder.getFullName(), folder.getDisplayName(),
jxFolder.getMessageCount());
}
catch (MessagingException me) {
throw new MailException(me);
}
if (_log.isDebugEnabled()) {
stopWatch.stop();
_log.debug(
"Downloaded " + jxMessages.length + " messages from folder " +
jxFolder.getFullName() + " completed in " +
stopWatch.getTime() + " ms");
}
}
public void storeEnvelopes(long folderId, long[] remoteMessageIds)
throws PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
Message[] jxMessages = getMessagesByUID(jxFolder, remoteMessageIds);
storeEnvelopes(folderId, jxFolder, jxMessages);
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, false);
}
}
public void updateFlags(
long folderId, long[] messageIds, int flag, boolean value,
boolean deleteMissingMessages)
throws PortalException {
Folder jxFolder = null;
try {
jxFolder = openFolder(folderId);
List<Message> jxMessages = getMessages(
jxFolder, messageIds, deleteMissingMessages);
for (Message jxMessage : jxMessages) {
if (flag == MailConstants.FLAG_FLAGGED) {
jxMessage.setFlag(Flags.Flag.FLAGGED, value);
}
else if (flag == MailConstants.FLAG_SEEN) {
jxMessage.setFlag(Flags.Flag.SEEN, value);
}
else {
throw new MailException(MailException.MESSAGE_INVALID_FLAG);
}
}
}
catch (MessagingException me) {
throw new MailException(me);
}
finally {
closeFolder(jxFolder, true);
}
}
protected Message createMessage(
String personalName, String sender, Address[] to, Address[] cc,
Address[] bcc, String subject, String body,
List<MailFile> mailFiles)
throws MessagingException, UnsupportedEncodingException {
Message jxMessage = new MimeMessage(_imapConnection.getSession());
jxMessage.setFrom(new InternetAddress(sender, personalName));
jxMessage.addRecipients(Message.RecipientType.TO, to);
jxMessage.addRecipients(Message.RecipientType.CC, cc);
jxMessage.addRecipients(Message.RecipientType.BCC, bcc);
jxMessage.setSentDate(new Date());
jxMessage.setSubject(subject);
MimeMultipart multipart = new MimeMultipart();
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setContent(body, ContentTypes.TEXT_HTML_UTF8);
multipart.addBodyPart(messageBodyPart);
if (mailFiles != null) {
for (MailFile mailFile : mailFiles) {
File file = mailFile.getFile();
if (!file.exists()) {
continue;
}
DataSource dataSource = new FileDataSource(file);
BodyPart attachmentBodyPart = new MimeBodyPart();
attachmentBodyPart.setDataHandler(new DataHandler(dataSource));
attachmentBodyPart.setFileName(mailFile.getFileName());
multipart.addBodyPart(attachmentBodyPart);
}
}
jxMessage.setContent(multipart);
return jxMessage;
}
protected String getFlags(Message jxMessage) throws MessagingException {
StringBundler sb = new StringBundler();
if (jxMessage.isSet(Flags.Flag.FLAGGED)) {
sb.append(MailConstants.FLAG_FLAGGED);
sb.append(StringPool.COMMA);
}
if (jxMessage.isSet(Flags.Flag.SEEN)) {
sb.append(MailConstants.FLAG_SEEN);
sb.append(StringPool.COMMA);
}
return sb.toString();
}
protected Folder getFolder(long folderId)
throws MessagingException, PortalException {
Store store = _imapConnection.getStore(true);
com.liferay.mail.reader.model.Folder folder =
FolderLocalServiceUtil.getFolder(folderId);
return store.getFolder(folder.getFullName());
}
protected Folder getFolder(String fullName)
throws MailException, MessagingException {
Store store = _imapConnection.getStore(true);
return store.getFolder(fullName);
}
protected void getFolders(List<Folder> allJxFolders, Folder[] jxFolders) {
for (Folder jxFolder : jxFolders) {
try {
int folderType = jxFolder.getType();
if ((folderType & Folder.HOLDS_MESSAGES) != 0) {
allJxFolders.add(jxFolder);
}
if ((folderType & Folder.HOLDS_FOLDERS) != 0) {
getFolders(allJxFolders, jxFolder.list());
}
}
catch (MessagingException me) {
_log.error(
"Unable to get folder " + jxFolder.getFullName(), me);
}
}
}
protected Message getMessage(Folder jxFolder, long remoteMessageId)
throws MessagingException {
UIDFolder uidFolder = (UIDFolder)jxFolder;
return uidFolder.getMessageByUID(remoteMessageId);
}
protected Message getMessage(long folderId, Folder jxFolder, boolean oldest)
throws MessagingException, PortalException {
com.liferay.mail.reader.model.Message message = null;
try {
message = MessageLocalServiceUtil.getRemoteMessage(
folderId, oldest);
}
catch (NoSuchMessageException nsme) {
return null;
}
long remoteMessageId = message.getRemoteMessageId();
Message jxMessage = getMessage(jxFolder, remoteMessageId);
if (jxMessage == null) {
MessageLocalServiceUtil.deleteMessage(message);
return getMessage(folderId, jxFolder, oldest);
}
else {
return jxMessage;
}
}
protected int[] getMessageIndexes(
int messageCount, int page, int messagesPerPage)
throws MailException {
int pageCount =
(int)(Math.ceil(messageCount / (double)messagesPerPage));
if (messageCount == 0) {
return new int[] {0, 0};
}
else if (page > pageCount) {
throw new MailException(MailException.FOLDER_PAGE_DOES_NOT_EXIST);
}
int startIndex = messageCount - (page * messagesPerPage) + 1;
int endIndex = messageCount - ((page - 1) * messagesPerPage);
if (startIndex < 1) {
startIndex = 1;
}
if (endIndex < 1) {
endIndex = 1;
}
return new int[] {startIndex, endIndex};
}
protected List<Message> getMessages(
Folder jxFolder, long[] messageIds, boolean deleteMissingMessages)
throws MessagingException, PortalException {
long[] remoteMessageIds = new long[messageIds.length];
for (int i = 0; i < messageIds.length; i++) {
com.liferay.mail.reader.model.Message message =
MessageLocalServiceUtil.getMessage(messageIds[i]);
remoteMessageIds[i] = message.getRemoteMessageId();
}
List<Message> jxMessages = new ArrayList<>();
Message[] jxMessagesArray = getMessagesByUID(
jxFolder, remoteMessageIds);
for (int i = 0; i < jxMessagesArray.length; i++) {
Message jxMessage = jxMessagesArray[i];
if (jxMessage != null) {
jxMessages.add(jxMessage);
}
else if (deleteMissingMessages && (remoteMessageIds[i] != 0)) {
MessageLocalServiceUtil.deleteMessage(messageIds[i]);
}
}
return jxMessages;
}
protected Message[] getMessagesByUID(
Folder jxFolder, long[] remoteMessageIds)
throws MessagingException {
UIDFolder uidFolder = (UIDFolder)jxFolder;
return uidFolder.getMessagesByUID(remoteMessageIds);
}
protected int getMessageSyncContact() {
if (_mailGroupServiceConfiguration == null) {
long companyId = PortalUtil.getDefaultCompanyId();
try {
_mailGroupServiceConfiguration =
ConfigurationProviderUtil.getCompanyConfiguration(
MailGroupServiceConfiguration.class, companyId);
}
catch (ConfigurationException ce) {
_log.error("Unable to get mail configuration", ce);
}
}
return _mailGroupServiceConfiguration.messagesSyncCount();
}
protected Part getPart(Part part, String contentPath)
throws IOException, MessagingException {
int index = GetterUtil.getInteger(
StringUtil.split(contentPath.substring(1), StringPool.PERIOD)[0]);
if (!(part.getContent() instanceof Multipart)) {
return part;
}
Multipart multipart = (Multipart)part.getContent();
for (int i = 0; i < multipart.getCount(); i++) {
if (i != index) {
continue;
}
String prefix = String.valueOf(index).concat(StringPool.PERIOD);
return getPart(
multipart.getBodyPart(i),
contentPath.substring(prefix.length()));
}
return part;
}
protected void getParts(
long userId, StringBundler bodyPlain, StringBundler bodyHtml,
String contentPath, Part part, List<MailFile> mailFiles)
throws IOException, MessagingException {
String fileName = part.getFileName();
Object content = part.getContent();
if (content instanceof Multipart) {
Multipart multipart = (Multipart)content;
for (int i = 0; i < multipart.getCount(); i++) {
Part curPart = multipart.getBodyPart(i);
getParts(
userId, bodyPlain, bodyHtml,
contentPath.concat(StringPool.PERIOD).concat(
String.valueOf(i)),
curPart, mailFiles);
}
}
else if (Validator.isNull(fileName)) {
String contentType = StringUtil.toLowerCase(part.getContentType());
if (contentType.startsWith(ContentTypes.TEXT_PLAIN)) {
bodyPlain.append(
content.toString().replaceAll("\r\n", "<br />"));
}
else if (contentType.startsWith(ContentTypes.TEXT_HTML)) {
bodyHtml.append(
HtmlContentUtil.getInlineHtml(content.toString()));
}
//else if (contentType.startsWith(ContentTypes.MESSAGE_RFC822)) {
//}
}
else {
MailFile mailFile = new MailFile(
contentPath.concat(StringPool.PERIOD).concat("-1"), fileName,
part.getSize());
mailFiles.add(mailFile);
}
}
protected InternetAddress[] getRecipients(long messageId)
throws PortalException {
try {
com.liferay.mail.reader.model.Message message =
MessageLocalServiceUtil.getMessage(messageId);
StringBundler sb = new StringBundler(6);
sb.append(message.getTo());
sb.append(StringPool.COMMA);
sb.append(message.getCc());
sb.append(StringPool.COMMA);
sb.append(message.getBcc());
sb.append(StringPool.COMMA);
return InternetAddress.parse(sb.toString(), true);
}
catch (AddressException ae) {
throw new MailException(MailException.MESSAGE_INVALID_ADDRESS, ae);
}
}
protected InternetAddress[] getRecipients(
long messageId, RecipientType recipientType)
throws PortalException {
try {
com.liferay.mail.reader.model.Message message =
MessageLocalServiceUtil.getMessage(messageId);
if (recipientType.equals(RecipientType.TO)) {
return InternetAddress.parse(message.getTo());
}
else if (recipientType.equals(RecipientType.CC)) {
return InternetAddress.parse(message.getCc());
}
else if (recipientType.equals(RecipientType.BCC)) {
return InternetAddress.parse(message.getBcc());
}
else {
throw new IllegalArgumentException(
"Invalid recipient type " + recipientType);
}
}
catch (AddressException ae) {
throw new MailException(MailException.MESSAGE_INVALID_ADDRESS, ae);
}
}
protected long getUID(Folder jxFolder, Message jxMessage)
throws MessagingException {
UIDFolder uidFolder = (UIDFolder)jxFolder;
return uidFolder.getUID(jxMessage);
}
protected Folder openFolder(long folderId)
throws MessagingException, PortalException {
return openFolder(getFolder(folderId));
}
private static final Log _log = LogFactoryUtil.getLog(IMAPAccessor.class);
private final Account _account;
private final IMAPConnection _imapConnection;
private MailGroupServiceConfiguration _mailGroupServiceConfiguration;
private final String _password;
private final User _user;
}