/* * pilerimport.c, SJ */ #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define SKIPLIST "junk,trash,spam,draft," #define MBOX_ARGS 1024 extern char *optarg; extern int optind; int dryrun=0; int import_from_gui=0; void usage(){ printf("\nusage: pilerimport\n\n"); printf(" [-c ] Config file to use if not the default\n"); printf(" -e EML file to import\n"); printf(" -m Mbox file to import\n"); printf(" -d Directory with EML files to import\n"); printf(" -i IMAP server to connect\n"); printf(" -K POP3 server to connect\n"); printf(" -u Username for imap/pop3 import\n"); printf(" -p Password for imap/pop3 import\n"); printf(" -P Port for imap/pop3 import (default: 143/110\n"); printf(" -t Timeout in sec for imap/pop3 import\n"); printf(" -x Comma separated list of imap folders to skip. Add the trailing comma!\n"); printf(" -f IMAP folder name to import\n"); printf(" -g Move email after import to this IMAP folder\n"); printf(" -F Piler folder name to assign to this import\n"); printf(" -R Assign IMAP folder names as Piler folder names\n"); printf(" -b Import only this many emails\n"); printf(" -s Start importing POP3 emails from this position\n"); printf(" -j Move failed to import emails to this folder\n"); printf(" -a Add recipient to the To:/Cc: list\n"); printf(" -D Dry-run, do not import anything\n"); printf(" -o Only download emails for POP3/IMAP import\n"); printf(" -r Remove imported emails\n"); printf(" -q Quiet mode\n"); exit(0); } int main(int argc, char **argv){ int i, c, rc=0, n_mbox=0, tot_msgs=0, port=143; char *configfile=CONFIG_FILE, *emlfile=NULL, *mboxdir=NULL, *mbox[MBOX_ARGS], *directory=NULL; char *imapserver=NULL, *pop3server=NULL, *username=NULL, *password=NULL, *skiplist=SKIPLIST, *folder=NULL, *folder_imap=NULL; struct session_data sdata; struct __config cfg; struct __data data; struct import import; for(i=0; i arguments: %s\n", optarg); } break; case 'M' : mboxdir = optarg; break; case 'i' : imapserver = optarg; break; case 'K' : pop3server = optarg; if(port == 143) port = 110; break; case 'u' : username = optarg; break; case 'p' : password = optarg; break; case 'P' : port = atoi(optarg); break; case 'x' : skiplist = optarg; break; case 'F' : folder = optarg; break; case 'f' : folder_imap = optarg; break; case 'R' : data.recursive_folder_names = 1; break; case 'r' : data.import->remove_after_import = 1; break; case 'g' : data.import->move_folder = optarg; break; case 'j' : data.import->failed_folder = optarg; break; case 'o' : data.import->download_only = 1; dryrun = 1; break; case 'b' : data.import->batch_processing_limit = atoi(optarg); break; case 't' : data.import->timeout = atoi(optarg); break; case 's' : if(atoi(optarg) < 1){ printf("invalid start position: %s\n", optarg); return -1; } data.import->start_position = atoi(optarg); break; case 'a' : data.import->extra_recipient = optarg; break; case 'G' : import_from_gui = 1; break; case 'D' : dryrun = 1; break; case 'q' : data.quiet = 1; break; case 'h' : case '?' : usage(); break; default : break; } } if(!mbox[0] && !mboxdir && !emlfile && !directory && !imapserver && !pop3server && import_from_gui == 0) usage(); if(data.import->failed_folder && !can_i_write_directory(data.import->failed_folder)){ printf("cannot write failed directory '%s'\n", data.import->failed_folder); return ERR; } if(!can_i_write_directory(NULL)) __fatal("cannot write current directory!"); cfg = read_config(configfile); if((data.recursive_folder_names == 1 || folder) && cfg.enable_folders == 0){ printf("please set enable_folders=1 in piler.conf to use the folder options\n"); return ERR; } /* make sure we don't discard messages without a valid Message-Id when importing manually */ cfg.archive_emails_not_having_message_id = 1; if(read_key(&cfg)){ printf("%s\n", ERR_READING_KEY); return ERR; } /* enable using the extra email address */ if(data.import->extra_recipient) cfg.process_rcpt_to_addresses = 1; if(open_database(&sdata, &cfg) == ERR) return 0; setlocale(LC_CTYPE, cfg.locale); (void) openlog("pilerimport", LOG_PID, LOG_MAIL); #ifdef HAVE_MEMCACHED memcached_init(&(data.memc), cfg.memcached_servers, 11211); #endif if(folder){ data.folder = get_folder_id(&sdata, &data, folder, 0); if(data.folder == ERR_FOLDER){ data.folder = add_new_folder(&sdata, &data, folder, 0); } if(data.folder == ERR_FOLDER){ printf("error: cannot get/add folder '%s'\n", folder); close_database(&sdata); return 0; } } load_rules(&sdata, &data, data.archiving_rules, SQL_ARCHIVING_RULE_TABLE); load_rules(&sdata, &data, data.retention_rules, SQL_RETENTION_RULE_TABLE); load_rules(&sdata, &data, data.folder_rules, SQL_FOLDER_RULE_TABLE); load_mydomains(&sdata, &data, &cfg); if(emlfile) rc = import_message(emlfile, &sdata, &data, &cfg); if(mbox[0]){ for(i=0; i