#include #include #include #include #include #include #include struct _F_smtpproto_private{ _F_tcpconnect *con; }; #define _TLMP_smtpproto struct _F_smtpproto { class _F_smtpproto_private *priv; void send(const char *s); #define _F_smtpproto_data(nom) void nom data (bool &fail) virtual _F_smtpproto_data( )=0; #define _F_smtpproto_error(nom) void nom error (const char *msg) virtual _F_smtpproto_error( ); }; void _F_smtpproto::send (const char *s) { if (s[0] == '.' && (s[1] == '\r' || s[1] == '\n')){ priv->con->send ("..\n"); }else{ priv->con->send (s); } } void _F_smtpproto::error (const char *msg) { fprintf (stderr,"%s\n",msg); } int smtpproto ( _F_smtpproto &c, const char *server, const char *from, const SSTRINGS &to) { int state; const SSTRINGS *to; const char *from; _F_smtpproto *c; _F_smtpproto_private priv; int ret; c.priv = &glocal.priv; glocal.state = 0; glocal.from = from; glocal.to = &to; glocal.c = &c; glocal.ret = -1; int ret = (server,"smtp",60); glocal.priv.con = this; char hostname[1000]; if (gethostname(hostname,1000)==-1) strcpy (hostname,"unknown"); sendf ("helo %s\n",hostname); int status = atoi(line); int endstate = glocal.to->getnb()+1; if (status >= 500){ glocal.c->error (line); end = true; glocal.ret = status - 500; }else if (status >= 200){ if (glocal.state == 0){ sendf ("mail from: %s\n",glocal.from); glocal.state = 1; }else if (glocal.state < endstate){ sendf ("rcpt to: %s\n",glocal.to->getitem(glocal.state-1)->get()); glocal.state++; }else if (glocal.state == endstate){ send ("data\n"); glocal.state++; }else if (glocal.state == endstate+1){ bool fail = false; glocal.c->data(fail); send (".\n"); glocal.state++; }else{ glocal.ret = 0; end = true; } }else{ end = true; } if (ret == 0) ret = glocal.ret; return ret; } int main (int argc, char *argv[]) { SSTRING server; SSTRING from; SSTRINGS to; int ret = (argc,argv); setarg ('f',"from","From (email address)",glocal.from,true); setarg ('s',"server","SMTP server",glocal.server,true); setarg ('t',"to","TO (email address)",glocal.to,true); setproginfo ("sendsmtp","0.0","Send a mail directly to an SMTP server"); int ret = (glocal.server.get(),glocal.from.get(),glocal.to); char buf[1000]; while (fgets(buf,sizeof(buf)-1,stdin)!=NULL){ send (buf); } return ret; int ret = -1; if (argc != 1){ usage(); }else{ } return ret; return ret; }