in plugins/misc/mail/src/main/java/org/apache/hop/mail/workflow/actions/getpop/ActionGetPOP.java [307:736]
public Result execute(Result previousResult, int nr) throws HopException {
Result result = previousResult;
result.setResult(false);
connection = null;
Session session = null;
mailConn = null;
Date beginDate = null;
Date endDate = null;
SimpleDateFormat df = new SimpleDateFormat(DATE_PATTERN);
try {
boolean usePOP3;
if (connectionName != null) {
usePOP3 = getProtocol().equals(MailServerConnection.PROTOCOL_STRING_POP3);
} else {
usePOP3 = getProtocol().equals(MailConnectionMeta.PROTOCOL_STRING_POP3);
}
boolean moveafter = false;
int nbrmailtoretrieve =
usePOP3
? (getRetrieveMails() == 2 ? Const.toInt(getFirstMails(), 0) : 0)
: Const.toInt(getImapFirstMails(), 0);
String realOutputFolder = createOutputDirectory(ActionGetPOP.FOLDER_OUTPUT);
String targetAttachmentFolder = createOutputDirectory(ActionGetPOP.FOLDER_ATTACHMENTS);
// Check destination folder
String realMoveToIMAPFolder = resolve(getMoveToIMAPFolder());
if (StringUtils.isEmpty(connectionName)) {
if (getProtocol().equals(MailServerConnection.PROTOCOL_STRING_IMAP)
&& (getActionType() == MailServerConnection.ACTION_TYPE_MOVE)
|| (getActionType() == MailServerConnection.ACTION_TYPE_GET
&& getAfterGetIMAP() == MailServerConnection.AFTER_GET_IMAP_MOVE)) {
if (Utils.isEmpty(realMoveToIMAPFolder)) {
throw new HopException(
BaseMessages.getString(PKG, "ActionGetMailsFromPOP.Error.MoveToIMAPFolderEmpty"));
}
moveafter = true;
}
} else {
if (getProtocol().equals(MailConnectionMeta.PROTOCOL_STRING_IMAP)
&& (getActionType() == MailConnectionMeta.ACTION_TYPE_MOVE)
|| (getActionType() == MailConnectionMeta.ACTION_TYPE_GET
&& getAfterGetIMAP() == MailConnectionMeta.AFTER_GET_IMAP_MOVE)) {
if (Utils.isEmpty(realMoveToIMAPFolder)) {
throw new HopException(
BaseMessages.getString(PKG, "ActionGetMailsFromPOP.Error.MoveToIMAPFolderEmpty"));
}
moveafter = true;
}
}
// check search terms
// Received Date
if (StringUtils.isEmpty(connectionName)) {
switch (getConditionReceivedDate()) {
case MailServerConnection.CONDITION_DATE_EQUAL,
MailServerConnection.CONDITION_DATE_GREATER,
MailServerConnection.CONDITION_DATE_SMALLER:
String realBeginDate = resolve(getReceivedDate1());
if (Utils.isEmpty(realBeginDate)) {
throw new HopException(
BaseMessages.getString(
PKG, "ActionGetMailsFromPOP.Error.ReceivedDateSearchTermEmpty"));
}
beginDate = df.parse(realBeginDate);
break;
case MailServerConnection.CONDITION_DATE_BETWEEN:
realBeginDate = resolve(getReceivedDate1());
if (Utils.isEmpty(realBeginDate)) {
throw new HopException(
BaseMessages.getString(
PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
}
beginDate = df.parse(realBeginDate);
String realEndDate = resolve(getReceivedDate2());
if (Utils.isEmpty(realEndDate)) {
throw new HopException(
BaseMessages.getString(
PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
}
endDate = df.parse(realEndDate);
break;
default:
break;
}
} else {
switch (getConditionReceivedDate()) {
case MailConnectionMeta.CONDITION_DATE_EQUAL,
MailConnectionMeta.CONDITION_DATE_GREATER,
MailConnectionMeta.CONDITION_DATE_SMALLER:
String realBeginDate = resolve(getReceivedDate1());
if (Utils.isEmpty(realBeginDate)) {
throw new HopException(
BaseMessages.getString(
PKG, "ActionGetMailsFromPOP.Error.ReceivedDateSearchTermEmpty"));
}
beginDate = df.parse(realBeginDate);
break;
case MailConnectionMeta.CONDITION_DATE_BETWEEN:
realBeginDate = resolve(getReceivedDate1());
if (Utils.isEmpty(realBeginDate)) {
throw new HopException(
BaseMessages.getString(
PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
}
beginDate = df.parse(realBeginDate);
String realEndDate = resolve(getReceivedDate2());
if (Utils.isEmpty(realEndDate)) {
throw new HopException(
BaseMessages.getString(
PKG, "ActionGetMailsFromPOP.Error.ReceivedDatesSearchTermEmpty"));
}
endDate = df.parse(realEndDate);
break;
default:
break;
}
}
String realserver = getRealServername();
String realusername = getRealUsername();
String realpassword = getRealPassword(getPassword());
String realFilenamePattern = getRealFilenamePattern();
int realport = Const.toInt(resolve(sslPort), -1);
String realIMAPFolder = resolve(getImapFolder());
String realProxyUsername = getRealProxyUsername();
initVariables();
// Check if we have a connection name, create a MailServerConnection (metadata item) if we
// have.
// Create a mail connection object (locally in the action) if we don't.
if (!StringUtils.isEmpty(connectionName)) {
try {
connection =
getMetadataProvider().getSerializer(MailServerConnection.class).load(connectionName);
} catch (HopException e) {
throw new RuntimeException(
"Mail server connection '" + connectionName + "' could not be found", e);
}
try {
connection.getSession(getVariables());
connection.getStore().connect();
} catch (Exception e) {
throw new RuntimeException(
"A connection to mail server connection '"
+ connectionName
+ "' could not be established",
e);
}
} else {
mailConn =
new MailConnection(
getLogChannel(),
MailConnectionMeta.getProtocolFromString(
getProtocol(), MailConnectionMeta.PROTOCOL_IMAP),
realserver,
realport,
realusername,
realpassword,
isUseSsl(),
isUseXOauth2(),
isUseProxy(),
realProxyUsername);
// connect
mailConn.connect();
}
if (moveafter) {
if (connection != null) {
connection.setDestinationFolder(realMoveToIMAPFolder, isCreateMoveToFolder());
} else {
// Set destination folder
// Check if folder exists
mailConn.setDestinationFolder(realMoveToIMAPFolder, isCreateMoveToFolder());
}
}
// apply search term?
String realSearchSender = resolve(getSenderSearch());
if (!Utils.isEmpty(realSearchSender)) {
// apply FROM
if (connection != null) {
connection.setSenderTerm(realSearchSender, isNotTermSenderSearch());
} else {
mailConn.setSenderTerm(realSearchSender, isNotTermSenderSearch());
}
}
String realSearchReceipient = resolve(getRecipientSearch());
if (!Utils.isEmpty(realSearchReceipient)) {
// apply TO
if (connection != null) {
connection.setReceipientTerm(realSearchReceipient);
} else {
mailConn.setReceipientTerm(realSearchReceipient);
}
}
String realSearchSubject = resolve(getSubjectSearch());
if (!Utils.isEmpty(realSearchSubject)) {
// apply Subject
if (connection != null) {
connection.setSubjectTerm(realSearchSubject, isNotTermSubjectSearch());
} else {
mailConn.setSubjectTerm(realSearchSubject, isNotTermSubjectSearch());
}
}
String realSearchBody = resolve(getBodySearch());
if (!Utils.isEmpty(realSearchBody)) {
// apply body
if (connection != null) {
connection.setBodyTerm(realSearchBody, isNotTermBodySearch());
} else {
mailConn.setBodyTerm(realSearchBody, isNotTermBodySearch());
}
}
// Received Date
if (connection != null) {
switch (getConditionReceivedDate()) {
case MailServerConnection.CONDITION_DATE_EQUAL:
connection.setReceivedDateTermEQ(beginDate);
break;
case MailServerConnection.CONDITION_DATE_GREATER:
connection.setReceivedDateTermGT(beginDate);
break;
case MailServerConnection.CONDITION_DATE_SMALLER:
connection.setReceivedDateTermLT(beginDate);
break;
case MailServerConnection.CONDITION_DATE_BETWEEN:
connection.setReceivedDateTermBetween(beginDate, endDate);
break;
default:
break;
}
} else {
switch (getConditionReceivedDate()) {
case MailConnectionMeta.CONDITION_DATE_EQUAL:
mailConn.setReceivedDateTermEQ(beginDate);
break;
case MailConnectionMeta.CONDITION_DATE_GREATER:
mailConn.setReceivedDateTermGT(beginDate);
break;
case MailConnectionMeta.CONDITION_DATE_SMALLER:
mailConn.setReceivedDateTermLT(beginDate);
break;
case MailConnectionMeta.CONDITION_DATE_BETWEEN:
mailConn.setReceivedDateTermBetween(beginDate, endDate);
break;
default:
break;
}
}
// set FlagTerm?
if (usePOP3) {
// retrieve messages
if (getRetrieveMails() == 1) {
// New messages
// POP doesn't support the concept of "new" messages!
if (connection != null) {
connection.setFlagTermUnread();
} else {
mailConn.setFlagTermUnread();
}
}
} else {
if (connection != null) {
switch (getValueIMAPList()) {
case MailServerConnection.VALUE_IMAP_LIST_NEW:
connection.setFlagTermNew();
break;
case MailServerConnection.VALUE_IMAP_LIST_OLD:
connection.setFlagTermOld();
break;
case MailServerConnection.VALUE_IMAP_LIST_READ:
connection.setFlagTermRead();
break;
case MailServerConnection.VALUE_IMAP_LIST_UNREAD:
connection.setFlagTermUnread();
break;
case MailServerConnection.VALUE_IMAP_LIST_FLAGGED:
connection.setFlagTermFlagged();
break;
case MailServerConnection.VALUE_IMAP_LIST_NOT_FLAGGED:
connection.setFlagTermNotFlagged();
break;
case MailServerConnection.VALUE_IMAP_LIST_DRAFT:
connection.setFlagTermDraft();
break;
case MailServerConnection.VALUE_IMAP_LIST_NOT_DRAFT:
connection.setFlagTermNotDraft();
break;
default:
break;
}
} else {
switch (getValueIMAPList()) {
case MailConnectionMeta.VALUE_IMAP_LIST_NEW:
mailConn.setFlagTermNew();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_OLD:
mailConn.setFlagTermOld();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_READ:
mailConn.setFlagTermRead();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_UNREAD:
mailConn.setFlagTermUnread();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_FLAGGED:
mailConn.setFlagTermFlagged();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_NOT_FLAGGED:
mailConn.setFlagTermNotFlagged();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_DRAFT:
mailConn.setFlagTermDraft();
break;
case MailConnectionMeta.VALUE_IMAP_LIST_NOT_DRAFT:
mailConn.setFlagTermNotDraft();
break;
default:
break;
}
}
}
// open folder and retrieve messages
fetchOneFolder(
usePOP3,
realIMAPFolder,
realOutputFolder,
targetAttachmentFolder,
realMoveToIMAPFolder,
realFilenamePattern,
nbrmailtoretrieve,
df);
if (isIncludeSubFolders()) {
// Fetch also sub folders?
if (isDebug()) {
logDebug(BaseMessages.getString(PKG, "ActionGetPOP.FetchingSubFolders"));
}
String[] subfolders = null;
if (connection != null) {
subfolders = connection.returnAllFolders();
} else {
subfolders = mailConn.returnAllFolders();
}
if (subfolders.length == 0) {
if (isDebug()) {
logDebug(BaseMessages.getString(PKG, "ActionGetPOP.NoSubFolders"));
}
} else {
for (int i = 0; i < subfolders.length; i++) {
fetchOneFolder(
usePOP3,
subfolders[i],
realOutputFolder,
targetAttachmentFolder,
realMoveToIMAPFolder,
realFilenamePattern,
nbrmailtoretrieve,
df);
}
}
}
result.setResult(true);
if (connection != null) {
result.setNrFilesRetrieved(connection.getSavedAttachedFilesCounter());
result.setNrLinesWritten(connection.getSavedMessagesCounter());
result.setNrLinesDeleted(connection.getDeletedMessagesCounter());
result.setNrLinesUpdated(connection.getMovedMessagesCounter());
} else {
result.setNrFilesRetrieved(mailConn.getSavedAttachedFilesCounter());
result.setNrLinesWritten(mailConn.getSavedMessagesCounter());
result.setNrLinesDeleted(mailConn.getDeletedMessagesCounter());
result.setNrLinesUpdated(mailConn.getMovedMessagesCounter());
}
if (isDetailed()) {
logDetailed("=======================================");
logDetailed(
BaseMessages.getString(
PKG, "ActionGetPOP.Log.Info.SavedMessages", "" + result.getNrLinesWritten()));
logDetailed(
BaseMessages.getString(
PKG, "ActionGetPOP.Log.Info.DeletedMessages", "" + result.getNrLinesDeleted()));
logDetailed(
BaseMessages.getString(
PKG, "ActionGetPOP.Log.Info.MovedMessages", "" + result.getNrLinesUpdated()));
if (((connection != null && getActionType() == MailServerConnection.ACTION_TYPE_GET)
|| (connection == null && getActionType() == MailConnectionMeta.ACTION_TYPE_GET))
&& isSaveAttachment()) {
logDetailed(
BaseMessages.getString(
PKG,
"ActionGetPOP.Log.Info.AttachedMessagesSuccess",
"" + result.getNrFilesRetrieved()));
}
logDetailed("=======================================");
}
} catch (Exception e) {
result.setNrErrors(1);
logError("Unexpected error: " + e.getMessage());
logError(Const.getStackTracker(e));
} finally {
try {
if (connection != null) {
connection.disconnect();
connection = null;
} else {
if (mailConn != null) {
mailConn.disconnect();
mailConn = null;
}
}
} catch (Exception e) {
/* Ignore */
}
}
return result;
}