SOCPTR *socptr; //socket to remote pointer
LOGPTR *logptr; //Log pointer
const char *domain; //Domain to be reached
+ MXTYP *curmx; //Current MX number
MXTYP **mxs; //MX list form domain
}RMTTYP;
/*
*/
/********************************************************/
/* */
+/* Procedure to check answer from remote SMTP */
+/* MX server. */
+/* Return the SMTP status code. */
+/* */
+/********************************************************/
+static _Bool get_smtp_reply(RMTTYP *rmt,int wait)
+
+{
+int code;
+int maxlines;
+
+code=ERRPROC;
+maxlines=20; //maximun number of line error
+while (maxlines>0) {
+ char *line;
+ int sofar;
+
+ line=(char *)0;
+ if (tcp_getline(rmt->socptr,wait,&line)<0) {
+ char cmt[100];
+
+ (void) snprintf(cmt,sizeof(cmt),"%d Timeout waiting '%d' sec for MX <%s>",
+ ERRPROC,wait,rmt->curmx->mxname);
+ line=strdup(cmt);
+ }
+ (void) log_fprintlog(rmt->logptr,false,line);
+ if (sscanf(line,"%d%n",&code,&sofar)==1) {
+ if (line[sofar]==' ')
+ maxlines=0; //found remote status
+ else
+ code=ERRPROC;
+ }
+ line=rou_freestr(line);
+ maxlines--;
+ }
+return code;
+}
+/*
+^L
+*/
+/********************************************************/
+/* */
/* Procedure to connect to the remote SMTP server */
/* */
/********************************************************/
int phase;
int proceed;
-
done=false;
phase=0;
proceed=true;
mxs=rmt->mxs;
srcip=(const char *)0;
while (*mxs!=(MXTYP *)0) {
- rmt->socptr=soc_openfeedsock(pro_smtp,srcip,(*mxs)->mxname,EMLPORT);
+ rmt->curmx=*mxs;
+ rmt->socptr=soc_openfeedsock(pro_smtp,srcip,rmt->curmx->mxname,EMLPORT);
if (rmt->socptr!=(SOCPTR *)0) {
char cmt[100];
(void) snprintf(cmt,sizeof(cmt),"Now Connected to MX <%s>",
- (*mxs)->mxname);
+ rmt->curmx->mxname);
(void) log_fprintlog(rmt->logptr,false,cmt);
break;
}
if (rmt->socptr==(SOCPTR *)0)
phase=999;
break;
+ case 2 : //waiting for signon
+ int res;
+
+ res=get_smtp_reply(rmt,WAITRMT);
+ switch (res) {
+ case SIGNON : //everything fine
+ break;
+ default : //not getting the right signon
+ phase=999; //No need to go further
+ break;
+ }
+ break;
+ case 3 : //establishing secured link
+ break;
default : //SAFE Guard
proceed=false;
break;
case 2 : //Checking if we have email to be sent
char cmt[100];
- (void) strncpy(cmt,sessid,sizeof(cmt));
+ (void) snprintf(cmt,sizeof(cmt),"session-id=%s",sessid);
rmt.logptr=log_openlog(sessid,false,cmt);
if (tosend==(TRATYP **)0)
phase=-1; //lets continue to see other email
#define QUITOK 221 //status on quit
#define CMDOK 250 //Everything OK
#define DATAOK 354 //Ready to accept EMAIL data
+#define ERRPROC 451 //local processing error
#define BADPAR 501 //error in parameters
#define CMDBAD 502 //command not implemented
#define DATRJC 521 //Data Rejected
#define SORTER "sorter" //application email sorter
#define EMLPORT "25" //Default SMTP email port
+#define WAITRMT 60 //how long to wait answer from remote SMTP
//list of keyword
typedef enum { //list of SMTP protocol keyword