|
#define MAILADDRoriginALIAS 0
#define MAILADDRextractALIAS 0x4000
typedef enum{
MAILADDR_EMPTY = -1,
MAILADDR_ERROR = 0,
MAILADDR_NORM,
MAILADDR_LOTUSNOTES,
MAILADDR_UNKNOWN,
}MAILADDRTYPE;
/*
* 保存邮件地址及联系人别名的回调函数原型
**/
typedef void (*MAILADDRDIVPROC)(void *lpvoid, int type, char * alias, int num_alias, char * addr, int num_addr);
#define LOTUSNOTES_ADDR_SUPPORTED
#ifdef _WIN32
#define QUOTATION '\''
#else
#define QUOTATION '"'
#endif
#define MasCHR 'x' /* mail address' supported character */
#ifndef SKIP_SPACE_FORWARD
#define SKIP_SPACE_FORWARD(p) while(' ' == *p){ ++p; }
#endif
#ifndef SKIP_SPACE_BACKWARD
#define SKIP_SPACE_BACKWARD(p) while(' ' == *p){ --p; }
#endif
/*
* MasCHR表示普通字符; '@'表示只能在中间出现,且只能出现一次的字符;'.'表示分段字符
*/
#ifndef LOTUSNOTES_ADDR_SUPPORTED
static CHAR emladdrchr[]=
// "01234567890123456789012345678900 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
// "01234567890123456789012345678900 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~";
"################################;##^#########..#xxxxxxxxxx#;####@xxxxxxxxxxxxxxxxxxxxxxxxxx####x#xxxxxxxxxxxxxxxxxxxxxxxxxx####";
#else
static CHAR emladdrchr[]=
"################################;##^#########../xxxxxxxxxx#;####@xxxxxxxxxxxxxxxxxxxxxxxxxx####x#xxxxxxxxxxxxxxxxxxxxxxxxxx####";
#endif
INT xeml_address_verify(CHAR * lpszMailAddress, MAILADDRDIVPROC saveproc, void *lpvoid, BOOL fOnlyVerifyFirstOne)
{
BYTE * p = (unsigned char*)lpszMailAddress;
INT iNormAddrCount = 0L, iLotusNotesCount = 0L;
if(NULL == lpszMailAddress){
return MAILADDR_ERROR;
}else{
SKIP_SPACE_FORWARD(p);
if('\0' == *p){
return MAILADDR_EMPTY;
}
}
while(*p){
CHAR * alias_begin = NULL; /* first quotation if address includes alias */
CHAR * alias_end = NULL;
CHAR * virgule = NULL; /* first virgule mark in LotusNotes' address */
CHAR * p_start = NULL; /* first character of a real mail address */
CHAR * p_tail = NULL;
CHAR * p_chrAt = 0L; /* position of character '@' in a mail address */
INT iDotCount = 0L;
SKIP_SPACE_FORWARD(p);
if(QUOTATION == *p){ /* seek alias from "alias" <accountname@isp.com.org>, no space between braces */
alias_begin = ++p;
if(NULL == (p_start = strchr(alias_begin, QUOTATION))){
return MAILADDR_ERROR; /* isn't a brace of double-quotation-mark */
}else{
alias_end = p_start++; /* jump to the first character after right double-quotation-mark */
}
SKIP_SPACE_FORWARD(p_start);
if('<' == *p_start) { p = ++p_start; }
else{
return MAILADDR_ERROR;
}
}
for(p_tail = NULL, p_start = p; *p; ++p){
if(*p>127){ return MAILADDR_ERROR; }
switch(emladdrchr[*p]) {
#ifdef LOTUSNOTES_ADDR_SUPPORTED
case '/': /* Lotus Notes' address is like "user/sub-group/.../group@domain" */
if(p==p_start || MasCHR != emladdrchr[*(p-1)]){ return MAILADDR_ERROR; }
if(NULL == virgule) { virgule = p; }
if(NULL != p_chrAt) { return MAILADDR_ERROR; }
break;
#endif
case '@': if(p==p_start || MasCHR != emladdrchr[*(p-1)]){ return MAILADDR_ERROR; }
if(NULL == p_chrAt){
p_chrAt = p;
}else{
return MAILADDR_ERROR;
}
break;
case '.': if(p==p_start || MasCHR != emladdrchr[*(p - 1)])/* it's dot or minus mark */
return MAILADDR_ERROR; /* error format like ab..cd, or ab.-cd */
if(NULL != p_chrAt && '.' == *p){ iDotCount++; }
break;
case ';': p_tail=p; break;
case MasCHR:break;
default: if(NULL != alias_end && *p=='>'){ p_tail=p++; break; }else{ return MAILADDR_ERROR; }
}
if(NULL != p_tail){ break; }
}
SKIP_SPACE_FORWARD(p);
if(';' == *p){
++p;
}else if('\0' != *p){
return MAILADDR_ERROR;
}
if(NULL == virgule){ /* It's a normal mail address such as " 'mary'<abc@edu.cn>" */
if(NULL == p_chrAt){
return MAILADDR_ERROR;
}
if(iDotCount <= 0){ /* must include '.' in a mail address ? */
return MAILADDR_ERROR;
}
++iNormAddrCount;
}else{ /* LotusNotes address, but the address like "abcd/bb/cc" is valid ? */
++iLotusNotesCount;
}
if(NULL != saveproc && NULL != lpvoid){
INT iAlias = 0;
INT iAddr = 0;
if(NULL == alias_end){ /* no alias in this address */
alias_begin = p_start; iAlias = (NULL==virgule ? p_chrAt : virgule) - alias_begin;
}else{
iAlias = alias_end - alias_begin;
}
iAddr = p_tail - p_start;
saveproc(lpvoid,
(NULL == virgule ? MAILADDR_NORM : MAILADDR_LOTUSNOTES) | (NULL == alias_end ? MAILADDRextractALIAS : 0),
alias_begin, iAlias, p_start, iAddr);
}
if(fOnlyVerifyFirstOne){
break;
}
SKIP_SPACE_FORWARD(p);
}
if(iNormAddrCount > 0 || iLotusNotesCount > 0){
return (iLotusNotesCount > 0) ? MAILADDR_LOTUSNOTES : MAILADDR_NORM;
}else{
return MAILADDR_ERROR;
}
} |
|