下面列出了javax.mail.Folder#HOLDS_FOLDERS 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private HashSet<String> returnSubfolders( Folder folder ) throws HopException {
HashSet<String> list = new HashSet<String>();
try {
if ( ( folder.getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
Folder[] f = folder.list();
for ( int i = 0; i < f.length; i++ ) {
// Search for sub folders
if ( ( f[ i ].getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
list.add( f[ i ].getFullName() );
list.addAll( returnSubfolders( f[ i ] ) );
}
}
}
} catch ( MessagingException m ) {
throw new HopException( m );
}
return list;
}
public cfQueryResultData listAllFolders( cfImapConnection imapConnection) throws cfmRunTimeException {
cfQueryResultData query = new cfQueryResultData( new String[]{"fullname","name","totalmessages","unread","new"},"CFIMAP" );
try{
Folder folderToList;
folderToList = imapConnection.mailStore.getDefaultFolder();
if ( (folderToList.getType() & Folder.HOLDS_FOLDERS) != 0){
Folder[] folderArray = folderToList.list("*");
query.addRow( folderArray.length );
for (int i = 0; i < folderArray.length; i++)
folderRow( query, i+1, folderArray[i] );
}
}catch(Exception E){}
return query;
}
public void receiveByFolder(Folder folder, JavamailConfig javamailConfig)
throws MessagingException, IOException {
logger.info("receive : {}", folder);
if ((Folder.HOLDS_MESSAGES & folder.getType()) != 0) {
this.receiveMessageByFolder(folder, javamailConfig);
}
if ((Folder.HOLDS_FOLDERS & folder.getType()) != 0) {
for (Folder childFolder : folder.list()) {
this.receiveByFolder(childFolder, javamailConfig);
}
}
if (folder.isOpen()) {
// 关闭资源
folder.close(false);
}
}
private void deleteTargetFolder(Folder folder) throws MessagingException {
final String targetFolderName = folder.getFullName();
final String sourceFolderName = targetToSourceFolderName(targetFolderName, sourceIndex, targetIndex);
//Delete folder
if (!sourceIndex.containsFolder(sourceFolderName)) {
//Delete recursively
targetStore.getFolder(targetFolderName).delete(true);
incrementFoldersDeletedCount();
}
//Folder recursion. Get all children
if ((folder.getType() & Folder.HOLDS_FOLDERS) == Folder.HOLDS_FOLDERS) {
for (Folder child : folder.list()) {
deleteTargetFolder(child);
}
}
}
/**
* Create folders in the target server recursively from the source.
*
* It also indexes the source store folders if we want to delete target folders that no longer
* exist
*/
private void copySourceFolder(Folder folder) throws MessagingException {
final String sourceFolderName = folder.getFullName();
final String targetFolderName = sourceFolderNameToTarget(sourceFolderName, sourceIndex,
targetIndex);
//Index for delete after copy (if necessary)
if (sourceIndex != null) {
sourceIndex.addFolder(sourceFolderName);
}
//Copy folder
if (!targetIndex.containsFolder(targetFolderName)) {
if (!targetStore.getFolder(targetFolderName).create(folder.getType())) {
throw new MessagingException(String.format(
"Couldn't create folder: %s in target server.", sourceFolderName));
}
incrementFoldersCopiedCount();
} else {
incrementFoldersSkippedCount();
}
//Folder recursion. Get all children
if ((folder.getType() & Folder.HOLDS_FOLDERS) == Folder.HOLDS_FOLDERS) {
for (Folder child : folder.list()) {
copySourceFolder(child);
}
}
}
private HashSet<String> returnSubfolders( Folder folder ) throws KettleException {
HashSet<String> list = new HashSet<String>();
try {
if ( ( folder.getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
Folder[] f = folder.list();
for ( int i = 0; i < f.length; i++ ) {
// Search for sub folders
if ( ( f[i].getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
list.add( f[i].getFullName() );
list.addAll( returnSubfolders( f[i] ) );
}
}
}
} catch ( MessagingException m ) {
throw new KettleException( m );
}
return list;
}
private void buildFoldersTree( Folder folder, TreeItem parentTreeItem, boolean topfolder ) throws MessagingException {
if ( ( folder.getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
Folder[] f = folder.list();
for ( int i = 0; i < f.length; i++ ) {
tiTree = topfolder ? new TreeItem( wTree, SWT.NONE ) : new TreeItem( parentTreeItem, SWT.NONE );
tiTree.setImage( guiresource.getImageBol() );
tiTree.setText( f[ i ].getName() );
// Search for sub folders
if ( ( f[ i ].getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
buildFoldersTree( f[ i ], tiTree, false );
}
}
}
}
public FolderIterator(JavaxMailFolder folder) {
this.folder = folder;
logger.fine(() -> "Opening folder:" + folder.getName());
if (!folder.isOpen()) {
folder.open(Folder.READ_ONLY);
}
this.messageIterator = (folder.getType() & Folder.HOLDS_MESSAGES) > 0
? new MessageIterator()
: Collections.emptyIterator();
this.subfolderIterator = (folder.getType() & Folder.HOLDS_FOLDERS) > 0
? new SubfolderIterator()
: Collections.emptyIterator();
}
/**
* Method recurse.
*
* @throws MessagingException
*/
protected void recurse() throws MessagingException {
if ((getFolder().getType() & Folder.HOLDS_FOLDERS) == Folder.HOLDS_FOLDERS) {
// folder contains subfolders...
Folder[] folders = getFolder().list();
for (Folder folder : folders) {
new FolderProcessor(folder, getAccount()).process();
}
}
}
protected void recurseFolders(final Folder folder, final Pattern pattern) throws MessagingException, IOException {
if (folder != null) {
if (es == null || es.isShutdown() || es.isTerminated() || Thread.currentThread().isInterrupted()) {
logger.warn("Stop processing of mails due to mail source is closed");
return;
}
if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) {
if (pattern != null && !pattern.matcher(folder.getFullName()).matches()) {
logger.debug("Pattern {} does not match {}", pattern.pattern(), folder.getFullName());
return;
}
IMAPUtils.open(folder);
try {
fetch(folder);
} finally {
IMAPUtils.close(folder);
logger.debug("fetch {} done", folder.getFullName());
}
}
if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0) {
for (final Folder subfolder : folder.list()) {
recurseFolders(subfolder, pattern);
}
}
}
}
protected void recurseFolders(final Folder folder, final Pattern pattern) throws MessagingException, IOException {
if (folder != null) {
if (es == null || es.isShutdown() || es.isTerminated() || Thread.currentThread().isInterrupted()) {
logger.warn("Stop processing of mails due to mail source is closed");
return;
}
if ((folder.getType() & Folder.HOLDS_MESSAGES) != 0) {
if (pattern != null && !pattern.matcher(folder.getFullName()).matches()) {
logger.debug("Pattern {} does not match {}", pattern.pattern(), folder.getFullName());
return;
}
IMAPUtils.open(folder);
try {
fetch(folder);
} finally {
IMAPUtils.close(folder);
}
}
if ((folder.getType() & Folder.HOLDS_FOLDERS) != 0) {
for (final Folder subfolder : folder.list()) {
recurseFolders(subfolder, pattern);
}
}
}
}
private static void crawlFolders(Store store, Index index, Folder folder,
ExecutorService service) throws MessagingException {
if (folder != null) {
final String folderName = folder.getFullName();
index.addFolder(folderName);
if ((folder.getType() & Folder.HOLDS_MESSAGES) == Folder.HOLDS_MESSAGES) {
folder.open(Folder.READ_ONLY);
if (folder.getMode() != Folder.READ_ONLY) {
folder.expunge();
}
final int messageCount = folder.getMessageCount();
folder.close(false);
int pos = 1;
while (pos + MNIMAPSync.BATCH_SIZE <= messageCount) {
service.execute(new FolderCrawler(store, folderName, pos,
pos + MNIMAPSync.BATCH_SIZE, index));
pos = pos + MNIMAPSync.BATCH_SIZE;
}
service.execute(new FolderCrawler(store, folderName, pos, messageCount, index));
}
//Folder recursion. Get all children
if ((folder.getType() & Folder.HOLDS_FOLDERS) == Folder.HOLDS_FOLDERS) {
for (Folder child : folder.list()) {
crawlFolders(store, index, child, service);
}
}
}
}
private void deleteTargetMessages(Folder targetFolder) throws MessagingException {
if (targetFolder != null) {
final String targetFolderName = targetFolder.getFullName();
final String sourceFolderName = targetToSourceFolderName(targetFolderName, sourceIndex, targetIndex);
if ((targetFolder.getType() & Folder.HOLDS_MESSAGES) == Folder.HOLDS_MESSAGES) {
targetFolder.open(Folder.READ_WRITE);
if (targetFolder.getMode() != Folder.READ_ONLY) {
targetFolder.expunge();
}
final int messageCount = targetFolder.getMessageCount();
targetFolder.close(false);
int pos = 1;
while (pos + MNIMAPSync.BATCH_SIZE <= messageCount) {
service.execute(
new MessageDeleter(this, targetFolderName, pos,
pos + MNIMAPSync.BATCH_SIZE, false, sourceIndex.
getFolderMessages(sourceFolderName)));
pos = pos + MNIMAPSync.BATCH_SIZE;
}
service.execute(new MessageDeleter(this, targetFolderName,
pos, messageCount, true, sourceIndex.getFolderMessages(sourceFolderName)));
}
//Folder recursion. Get all children
if ((targetFolder.getType() & Folder.HOLDS_FOLDERS) == Folder.HOLDS_FOLDERS) {
for (Folder child : targetFolder.list()) {
deleteTargetMessages(child);
}
}
}
}
/**
* Once the folder structure has been created it copies messages recursively from the root
* folder.
*/
private void copySourceMessages(IMAPFolder sourceFolder) throws MessagingException {
if (sourceFolder != null) {
final String sourceFolderName = sourceFolder.getFullName();
final String targetFolderName = sourceFolderNameToTarget(sourceFolderName, sourceIndex,
targetIndex);
if ((sourceFolder.getType() & Folder.HOLDS_MESSAGES) == Folder.HOLDS_MESSAGES) {
//Manage Servers with public/read only folders.
try {
sourceFolder.open(Folder.READ_WRITE);
} catch (ReadOnlyFolderException ex) {
sourceFolder.open(Folder.READ_ONLY);
}
if (sourceFolder.getMode() != Folder.READ_ONLY) {
sourceFolder.expunge();
}
///////////////////////
final int messageCount = sourceFolder.getMessageCount();
sourceFolder.close(false);
int pos = 1;
while (pos + MNIMAPSync.BATCH_SIZE <= messageCount) {
//Copy messages
service.execute(new MessageCopier(this, sourceFolderName, targetFolderName, pos,
pos + MNIMAPSync.BATCH_SIZE, targetIndex.getFolderMessages(
targetFolderName)));
pos = pos + MNIMAPSync.BATCH_SIZE;
}
service.execute(new MessageCopier(this, sourceFolderName, targetFolderName, pos,
messageCount,
targetIndex.getFolderMessages(targetFolderName)));
}
//Folder recursion. Get all children
if ((sourceFolder.getType() & Folder.HOLDS_FOLDERS) == Folder.HOLDS_FOLDERS) {
for (Folder child : sourceFolder.list()) {
copySourceMessages((IMAPFolder) child);
}
}
}
}
private void buildFoldersTree( Folder folder, TreeItem parentTreeItem, boolean topfolder ) throws MessagingException {
if ( ( folder.getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
Folder[] f = folder.list();
for ( int i = 0; i < f.length; i++ ) {
tiTree = topfolder ? new TreeItem( wTree, SWT.NONE ) : new TreeItem( parentTreeItem, SWT.NONE );
tiTree.setImage( guiresource.getImageBol() );
tiTree.setText( f[i].getName() );
// Search for sub folders
if ( ( f[i].getType() & Folder.HOLDS_FOLDERS ) != 0 ) {
buildFoldersTree( f[i], tiTree, false );
}
}
}
}
public cfQueryResultData listFolder( cfImapConnection imapConnection, String rootFolder) throws cfmRunTimeException {
cfQueryResultData query = new cfQueryResultData( new String[]{"fullname","name","totalmessages","unread","new"},"CFIMAP" );
try{
Folder folderToList;
if ( rootFolder == null || rootFolder.length() == 0 )
folderToList = imapConnection.mailStore.getDefaultFolder();
else
folderToList = imapConnection.mailStore.getFolder(rootFolder);
if ( (folderToList.getType() & Folder.HOLDS_FOLDERS) != 0){
Folder[] folderArray = folderToList.list();
query.addRow( folderArray.length );
for (int i = 0; i < folderArray.length; i++)
folderRow( query, i+1, folderArray[i] );
}
}catch(Exception E){}
return query;
}