Attach is a script i made to transfert a uwimap to dbmail And a program source code and binary to help in the transfert
Hope it is of some help Jacques/Montreal Canada shon a écrit : > does anyone have a utility to take maildir and insert into a dbmail database? > > thanks, > shon > > -- > "power off einstein" - moe syzlak > > _______________________________________________ > Dbmail mailing list > [email protected] > https://mailman.fastxs.nl/mailman/listinfo/dbmail
uw2dbmail.sh
Description: Bourne shell script
/*
* This program converts a user from an mbox style imap server (like UW-imap)
* to dbmail. It converts the inbox (from the mail spool) and optionally
* takes the path to the user's imap root folder directory and converts the
* full hierarchy of folders and messages.
*
* The dbmail account must already exist for the user.
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <dirent.h>
#include <time.h>
#include <sys/stat.h>
#include <unistd.h>
#include "db.h"
#include "auth.h"
#include "dbmailtypes.h"
#include "debug.h"
#include "config.h"
#include <regex.h>
#define MAX_LINESIZE 1024
#define UID_SIZE 70
const char *mbox_delimiter_pattern = "^From .* ";
const char *spool = "/var/spool/mail/";
char blk[READ_BLOCK_SIZE + MAX_LINESIZE + 1];
/* syslog */
#define PNAME "dbmail/uw2db"
struct list sysItems; /* config item lists */
char *configFile = "/etc/dbmail.conf";
int processmbox (char *path, char *mailroot);
int process_mboxfile(char *file, u64_t userid, char *folder);
int recurse_folders(u64_t userid, char *topdir, char *topfolder);
int create_folder(u64_t userid, char *folder);
/* set up database login data */
extern field_t _db_host;
extern field_t _db_db;
extern field_t _db_user;
extern field_t _db_pass;
extern char *query;
int total_msgs = 0;
int main (int argc, char* argv[])
{
int result;
char *mailroot = "";
if (argc < 2)
{
printf ("Usage: mbox2dbmail <userid> [mailroot] \n");
printf (" userid = existing dbmail account name\n");
printf (" mailroot = optional full path to user's imap folder root.\n");
return -1;
}
if (argc == 3)
{
mailroot = argv[2];
}
openlog(PNAME, LOG_PID, LOG_MAIL); /* open connection to syslog */
configure_debug(TRACE_ERROR, 1, 0);
ReadConfig("DBMAIL", configFile, &sysItems);
GetDBParams(_db_host, _db_db, _db_user, _db_pass, &sysItems);
/* open dbase connections */
if (db_connect() < 0)
{
printf("Error opening dbase connections\n");
return -1;
}
result = processmbox(argv[1], mailroot);
printf("\n\nTotal mesages procesed: %d\n", total_msgs);
return result;
}
int processmbox (char *username, char *mailroot)
{
char path[256];
u64_t userid;
strcpy(path, spool);
strcat(path, username);
printf ("username %s\n", username);
printf("looking up existing user");
userid = auth_user_exists(username);
if (userid != -1 && userid != 0)
{
printf("Ok id [%llu]\n", userid);
fflush(stdout);
total_msgs += process_mboxfile(path, userid, "INBOX");
if (strlen(mailroot) > 0)
recurse_folders(userid, mailroot, "");
}
else
{
printf("user not found. Skipping\n");
}
return 0;
}
int recurse_folders(u64_t userid, char *topdir, char *topfolder)
{
char path[256];
char folder[256];
DIR *dir;
struct dirent *entry;
struct stat sbuf;
dir = opendir(topdir);
while((entry = readdir(dir)))
{
/* ignore . files */
if (strncmp(entry->d_name, ".", 1) == 0)
continue;
/* determine folder name */
strcpy(folder, topfolder);
if (strlen(topfolder) != 0)
strcat(folder, "/");
strcat(folder, entry->d_name);
strcpy(path, topdir);
strcat(path, "/");
strcat(path, entry->d_name);
stat(path, &sbuf);
if (sbuf.st_mode & S_IFDIR)
{
/* if a directory, recurse */
create_folder(userid, folder);
recurse_folders(userid, path, folder);
}
else
{
/* if a file, process it */
total_msgs += process_mboxfile(path, userid, folder);
}
}
return 0;
}
int create_folder(u64_t userid, char *folder)
{
if (db_findmailbox(folder, userid) == 0)
{
printf("\nCreating folder %s\n", folder);
db_createmailbox(folder, userid);
}
else
{
printf("\nFolder %s already exists\n", folder);
}
return 0;
}
int process_mboxfile(char *file, u64_t userid, char *folder)
{
regex_t preg;
int result;
FILE *infile;
int in_msg, header_passed=0;
char newunique[UID_SIZE];
unsigned cnt,len,newlines;
u64_t msgid=0, size, mailboxid;
char saved;
int msgcount = 0;
int flags[IMAP_NFLAGS] = {0,0,0,0,0,0};
if ((result = regcomp(&preg, mbox_delimiter_pattern, REG_NOSUB)) != 0)
{
trace(TRACE_ERROR,"Regex compilation failed.");
return -1;
}
if ( (infile = fopen(file, "r")) == 0)
{
trace(TRACE_ERROR,"Could not open file [%s]", infile);
return -1;
}
in_msg = 0;
cnt = 0;
size = 0;
newlines = 0;
while (!feof(infile) && !ferror(infile))
{
if (fgets(&blk[cnt], MAX_LINESIZE, infile) == 0)
break;
/* check if this is an mbox delimiter */
if (regexec(&preg, &blk[cnt], 0, NULL, 0) == 0)
{
if (!in_msg)
{
/* first header found - create folder */
create_folder(userid, folder);
in_msg = 1;
}
else
{
/* update & end message */
msgcount++;
printf("\rConverting %s :: %d", folder, msgcount);
db_insert_message_block(blk, cnt, msgid);
snprintf(newunique, UID_SIZE, "%lluA%lu", userid, time(NULL));
db_update_message(msgid, newunique, size+cnt, size+cnt+newlines);
trace(TRACE_ERROR, "message [%llu] inserted, [%u] bytes", msgid,
size+cnt);
/* move to correct folder */
mailboxid = db_get_mailboxid (userid, folder);
if (strcmp(folder, "INBOX") != 0)
{
snprintf (query, DEF_QUERYSIZE,
"UPDATE messages SET mailbox_idnr = %llu "
"where message_idnr=%llu",
mailboxid, msgid);
if (db_query (query)==-1)
{
trace(TRACE_STOP,"Move folders failed: dbquery failed");
}
}
/* set seen and answered flags */
db_set_msgflag(msgid, mailboxid, flags, IMAPFA_ADD);
}
/* start new message */
msgid = db_insert_message(userid, 0, 0);
header_passed = 0;
cnt = 0;
size = 0;
newlines = 0;
flags[0] = 0;
flags[1] = 0;
}
else
{
newlines++;
if (header_passed == 0)
{
/* we're still reading the header */
len = strlen(&blk[cnt]);
if (strcmp(&blk[cnt], "Status: RO\n") == 0)
{
flags[0] = 1;
}
if (strcmp(&blk[cnt], "X-Status: A\n") == 0)
{
flags[1] = 1;
}
if (strcmp(&blk[cnt], "\n") == 0)
{
db_insert_message_block(blk, cnt+len, msgid);
header_passed = 1;
size += (cnt+len);
cnt = 0;
}
else
cnt += len;
}
else
{
/* this is body data */
len = strlen(&blk[cnt]);
cnt += len;
if (cnt >= READ_BLOCK_SIZE)
{
/* write block */
saved = blk[READ_BLOCK_SIZE];
blk[READ_BLOCK_SIZE] = '\0';
db_insert_message_block(blk, READ_BLOCK_SIZE, msgid);
blk[READ_BLOCK_SIZE] = saved;
memmove(blk, &blk[READ_BLOCK_SIZE], cnt - (READ_BLOCK_SIZE));
size += READ_BLOCK_SIZE;
cnt -= READ_BLOCK_SIZE;
}
}
}
}
/* update & end message */
if (msgid > 0)
{
db_insert_message_block(blk, cnt, msgid);
snprintf(newunique, UID_SIZE, "%lluA%lu", userid, time(NULL));
db_update_message(msgid, newunique, size+cnt, size+cnt+newlines);
trace(TRACE_ERROR, "message [%llu] inserted, [%u] bytes", msgid,
size+cnt);
/* Set flags and move to correct folder */
mailboxid = db_get_mailboxid (userid, folder);
if (strcmp(folder, "INBOX") != 0)
{
snprintf (query, DEF_QUERYSIZE,
"UPDATE messages SET mailbox_idnr = %llu "
"where message_idnr=%llu",
mailboxid, msgid);
if (db_query (query)==-1)
{
trace(TRACE_STOP,"Move folders failed: dbquery failed");
}
}
db_set_msgflag(msgid, mailboxid, flags, IMAPFA_ADD);
msgcount++;
}
fclose(infile);
printf("\rConverting %s :: %d", folder, msgcount);
return msgcount;
}
mb2db
Description: Binary data
