diff --git a/src/import.c b/src/import.c index dfdd6a68..125796ab 100644 --- a/src/import.c +++ b/src/import.c @@ -28,11 +28,6 @@ int import_message(struct session_data *sdata, struct data *data, struct config init_session_data(sdata, cfg); - if(data->import->extra_recipient){ - snprintf(sdata->rcptto[0], SMALLBUFSIZE-1, "%s", data->import->extra_recipient); - sdata->num_of_rcpt_to = 1; - } - if(cfg->verbosity > 1) printf("processing: %s\n", data->import->filename); if(strcmp(data->import->filename, "-") == 0){ diff --git a/src/parser.c b/src/parser.c index b7d700a9..50e82ca4 100644 --- a/src/parser.c +++ b/src/parser.c @@ -55,6 +55,10 @@ struct parser_state parse_message(struct session_data *sdata, int take_into_piec fclose(f); + if(data->import->extra_recipient){ + add_recipient(data->import->extra_recipient, strlen(data->import->extra_recipient), sdata, &state, data, cfg); + } + return state; } @@ -165,7 +169,7 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata char *p, *q, puf[SMALLBUFSIZE]; char tmpbuf[MAXBUFSIZE]; int writelen, boundary_line=0, result; - unsigned int len, domainlen; + unsigned int len; if(cfg->debug == 1) printf("line: %s", buf); @@ -698,43 +702,7 @@ int parse_line(char *buf, struct parser_state *state, struct session_data *sdata if(cfg->verbosity >= _LOG_DEBUG) syslog(LOG_PRIORITY, "%s: journal rcpt: '%s'", sdata->ttmpfile, puf); } - if(findnode(state->rcpt, puf) == NULL){ - - /* skip any address matching ...@cfg->hostid, 2013.10.29, SJ */ - if(q && strncmp(q+1, cfg->hostid, cfg->hostid_len) == 0){ - continue; - } - - addnode(state->rcpt, puf); - memcpy(&(state->b_to[state->tolen]), puf, len); - state->tolen += len; - - if(len >= MIN_EMAIL_ADDRESS_LEN && does_it_seem_like_an_email_address(puf) == 1){ - - if(is_email_address_on_my_domains(puf, data) == 1) sdata->internal_recipient = 1; - else sdata->external_recipient = 1; - - if(q){ - if(findnode(state->rcpt_domain, q+1) == NULL){ - addnode(state->rcpt_domain, q+1); - domainlen = strlen(q+1); - - if(state->todomainlen < SMALLBUFSIZE-domainlen-1){ - memcpy(&(state->b_to_domain[state->todomainlen]), q+1, domainlen); - state->todomainlen += domainlen; - } - } - } - - if(state->tolen < MAXBUFSIZE-len-1){ - split_email_address(puf); - memcpy(&(state->b_to[state->tolen]), puf, len); - state->tolen += len; - } - - } - } - + add_recipient(puf, len, sdata, state, data, cfg); } else if(state->message_state == MSG_BODY && len >= (unsigned int)(cfg->min_word_len) && state->bodylen < BIGBUFSIZE-len-1){ // 99% of email addresses are longer than 8 characters diff --git a/src/parser.h b/src/parser.h index 3d43cd2e..19153327 100644 --- a/src/parser.h +++ b/src/parser.h @@ -25,6 +25,7 @@ void translateLine(unsigned char *p, struct parser_state *state); void fix_email_address_for_sphinx(char *s); void split_email_address(char *s); int does_it_seem_like_an_email_address(char *email); +void add_recipient(char *email, unsigned int len, struct session_data *sdata, struct parser_state *state, struct data *data, struct config *cfg); void reassembleToken(char *p); void degenerateToken(unsigned char *p); void fixURL(char *buf, int buflen); diff --git a/src/parser_utils.c b/src/parser_utils.c index d8f75aa5..1c77886a 100644 --- a/src/parser_utils.c +++ b/src/parser_utils.c @@ -693,6 +693,49 @@ int does_it_seem_like_an_email_address(char *email){ } +void add_recipient(char *email, unsigned int len, struct session_data *sdata, struct parser_state *state, struct data *data, struct config *cfg){ + char *q; + + if(findnode(state->rcpt, email) == NULL){ + + q = strchr(email, '@'); + + /* skip any address matching ...@cfg->hostid, 2013.10.29, SJ */ + if(q && strncmp(q+1, cfg->hostid, cfg->hostid_len) == 0){ + return; + } + + addnode(state->rcpt, email); + memcpy(&(state->b_to[state->tolen]), email, len); + state->tolen += len; + + if(len >= MIN_EMAIL_ADDRESS_LEN && does_it_seem_like_an_email_address(email) == 1){ + + if(is_email_address_on_my_domains(email, data) == 1) sdata->internal_recipient = 1; + else sdata->external_recipient = 1; + + if(q){ + if(findnode(state->rcpt_domain, q+1) == NULL){ + addnode(state->rcpt_domain, q+1); + unsigned int domainlen = strlen(q+1); + + if(state->todomainlen < SMALLBUFSIZE-domainlen-1){ + memcpy(&(state->b_to_domain[state->todomainlen]), q+1, domainlen); + state->todomainlen += domainlen; + } + } + } + + if(state->tolen < MAXBUFSIZE-len-1){ + split_email_address(email); + memcpy(&(state->b_to[state->tolen]), email, len); + state->tolen += len; + } + } + } +} + + /* * reassemble 'V i a g r a' to 'Viagra' */ diff --git a/src/pilerimport.c b/src/pilerimport.c index 3d1355d5..296b93ff 100644 --- a/src/pilerimport.c +++ b/src/pilerimport.c @@ -64,7 +64,7 @@ void usage(){ int main(int argc, char **argv){ int i, c, n_mbox=0; char *configfile=CONFIG_FILE, *mbox[MBOX_ARGS], *directory=NULL; - char *imapserver=NULL, *pop3server=NULL; + char puf[SMALLBUFSIZE], *imapserver=NULL, *pop3server=NULL; struct session_data sdata; struct config cfg; struct data data; @@ -253,7 +253,8 @@ int main(int argc, char **argv){ break; case 'a' : - data.import->extra_recipient = optarg; + snprintf(puf, sizeof(puf)-1, "%s ", optarg); + data.import->extra_recipient = puf; break; case 'D' : diff --git a/src/test.c b/src/test.c index e3cce722..8b796806 100644 --- a/src/test.c +++ b/src/test.c @@ -37,6 +37,7 @@ int main(int argc, char **argv){ struct data data; struct import import; char *configfile=CONFIG_FILE, *rule, *emlfile=NULL; + char puf[SMALLBUFSIZE]; import.extra_recipient = NULL; @@ -74,7 +75,8 @@ int main(int argc, char **argv){ break; case 'a': - import.extra_recipient = optarg; + snprintf(puf, sizeof(puf)-1, "%s ", optarg); + import.extra_recipient = puf; break; default :