Return TypeFunction nameArguments
hzEcodehzEmail::SendSmtp(const char*,const char*,const char*,)

Declared in file: hzMailer.h
Defined in file : hzMailer.cpp

Function Logic:

0:START 1:GetThreadLogger plog 2:!plog 3:Fatal 4:!server||!server[0] 5:rc hzLogger::Out 6:!uname||!uname[0] 7:rc hzLogger::Out 8:!passwd||!passwd[0] 9:rc hzLogger::Out hzList::Count 10:!m_Recipients.Count() 11:rc hzLogger::Out 12:!m_AddrFrom 13:rc hzLogger::Out 14:rc!=E_OK 15:Return rc 16:!m_RealFrom 17:m_RealFrom 18:S hzTcpClient::ConnectStd rc 19:rc!=E_OK 20:Return rc 21:hzTcpClient::Recv 22:nRecv>=0 23:rbuf 24:rbuf 25:_getSmtpCode smtpCode 26:smtpCode!=SMTP_READY 27:hzLogger::Out rc 28:Goto Quit 29:sprintf 30:(rc=C.Send(sbuf,strlen(sbuf)))!=E_OK 31:hzLogger::Out 32:Goto Quit 33:_hzGlobal_Debug&HZ_DEBUG_MAILER 34:hzLogger::Out 35:(rc=C.Recv(rbuf,nRecv,HZ_MAXPACKET))!=E_OK 36:hzLogger::Out 37:Goto Quit 38:nRecv>=0 39:rbuf 40:rbuf 41:_getSmtpCode smtpCode 42:smtpCode!=SMTP_OK 43:rc hzLogger::Out 44:Goto Quit 45:_hzGlobal_Debug&HZ_DEBUG_MAILER 46:hzLogger::Out 47:uname&&passwd 48:_hzGlobal_Debug&HZ_DEBUG_MAILER 49:hzLogger::Out 50:strcpy 51:(rc=C.Send(sbuf,strlen(sbuf)))!=E_OK 52:hzLogger::Out 53:Goto Quit 54:_hzGlobal_Debug&HZ_DEBUG_MAILER 55:hzLogger::Out 56:hzTcpClient::Recv 57:nRecv>0 58:rbuf 59:rbuf 60:_getSmtpCode smtpCode 61:_hzGlobal_Debug&HZ_DEBUG_MAILER 62:hzLogger::Out 63:smtpCode!=SMTP_LOGINFO 64:rc hzLogger::Out 65:Goto Quit 66:hzChain::Clear hzChain::Clear inp Base64Encode items S 67:(rc=C.Send(*S,S.Length()))!=E_OK 68:hzLogger::Out 69:Goto Quit 70:_hzGlobal_Debug&HZ_DEBUG_MAILER 71:hzLogger::Out 72:hzTcpClient::Recv 73:nRecv>0 74:rbuf 75:rbuf 76:_hzGlobal_Debug&HZ_DEBUG_MAILER 77:hzLogger::Out 78:_getSmtpCode smtpCode 79:smtpCode!=SMTP_LOGINFO 80:hzLogger::Out rc 81:Goto Quit 82:hzChain::Clear hzChain::Clear inp Base64Encode items S 83:(rc=C.Send(*S,S.Length()))!=E_OK 84:hzLogger::Out 85:Goto Quit 86:_hzGlobal_Debug&HZ_DEBUG_MAILER 87:hzLogger::Out 88:hzTcpClient::Recv 89:nRecv>0 90:rbuf 91:rbuf 92:_hzGlobal_Debug&HZ_DEBUG_MAILER 93:hzLogger::Out 94:_getSmtpCode smtpCode 95:smtpCode!=SMTP_GO_AHEAD 96:hzLogger::Out rc 97:Goto Quit 98:sprintf 99:(rc=C.Send(sbuf,strlen(sbuf)))!=E_OK 100:hzLogger::Out 101:Goto Quit 102:_hzGlobal_Debug&HZ_DEBUG_MAILER 103:hzLogger::Out 104:hzTcpClient::Recv 105:nRecv>0 106:rbuf 107:rbuf 108:_hzGlobal_Debug&HZ_DEBUG_MAILER 109:hzLogger::Out 110:_getSmtpCode smtpCode 111:smtpCode!=SMTP_OK 112:hzLogger::Out rc 113:Goto Quit 114:rx.Valid(); 115:hzList::Iter::Element e sprintf strlen hzTcpClient::Send 116:_hzGlobal_Debug&HZ_DEBUG_MAILER 117:hzLogger::Out 118:hzTcpClient::Recv rc 119:rc!=E_OK 120:hzLogger::Out 121:Goto Quit 122:nRecv>0 123:rbuf 124:rbuf 125:_hzGlobal_Debug&HZ_DEBUG_MAILER 126:hzLogger::Out 127:_getSmtpCode smtpCode 128:smtpCode!=SMTP_OK&&smtpCode!=SMTP_GO_AHEAD 129:hzLogger::Out rc 130:Goto Quit 131:rx.Valid(); 132:hzList::Iter::Element e sprintf strlen hzTcpClient::Send 133:_hzGlobal_Debug&HZ_DEBUG_MAILER 134:hzLogger::Out 135:hzTcpClient::Recv rc 136:rc!=E_OK 137:hzLogger::Out 138:Goto Quit 139:nRecv>0 140:rbuf 141:rbuf 142:_hzGlobal_Debug&HZ_DEBUG_MAILER 143:hzLogger::Out 144:_getSmtpCode smtpCode 145:smtpCode!=SMTP_OK 146:hzLogger::Out rc 147:Goto Quit 148:rx.Valid(); 149:hzList::Iter::Element e sprintf strlen hzTcpClient::Send 150:_hzGlobal_Debug&HZ_DEBUG_MAILER 151:hzLogger::Out 152:hzTcpClient::Recv rc 153:rc!=E_OK 154:hzLogger::Out 155:Goto Quit 156:nRecv>0 157:rbuf 158:rbuf 159:_hzGlobal_Debug&HZ_DEBUG_MAILER 160:hzLogger::Out 161:_getSmtpCode smtpCode 162:smtpCode!=SMTP_OK 163:hzLogger::Out rc 164:Goto Quit 165:sprintf strlen hzTcpClient::Send 166:_hzGlobal_Debug&HZ_DEBUG_MAILER 167:hzLogger::Out 168:hzTcpClient::Recv 169:nRecv>0 170:rbuf 171:rbuf 172:_hzGlobal_Debug&HZ_DEBUG_MAILER 173:hzLogger::Out 174:_hzGlobal_Debug&HZ_DEBUG_MAILER 175:hzChain::Size hzLogger::Out 176:ci rc 177:rc==E_OK; 178:!ci.eof()&&nSend 179:* 180:nSend==0 181:nTotal hzTcpClient::Send rc 182:_hzGlobal_Debug&HZ_DEBUG_MAILER 183:hzChain::Size hzLogger::Out 184:strcpy strlen hzTcpClient::Send 185:_hzGlobal_Debug&HZ_DEBUG_MAILER 186:hzLogger::Out 187:rc!=E_OK 188:hzLogger::Out 189:Goto Quit 190:hzTcpClient::Recv 191:nRecv>0 192:rbuf 193:rbuf 194:_hzGlobal_Debug&HZ_DEBUG_MAILER 195:hzLogger::Out 196:Quit 197:sprintf strlen hzTcpClient::Send 198:_hzGlobal_Debug&HZ_DEBUG_MAILER 199:hzLogger::Out 200:hzTcpClient::Recv 201:nRecv>0 202:rbuf 203:rbuf 204:_hzGlobal_Debug&HZ_DEBUG_MAILER 205:hzLogger::Out 206:hzTcpClient::Close 207:Return rc

Function body:

hzEcode hzEmail::SendSmtp (const char* server, const char* uname, const char* passwd)
{
   _hzfunc("hzEmail::SendSmtp") ;
   hzList<hzEmaddr>::Iter  rx ;
   hzTcpClient C ;
   hzChain     inp ;
   hzChain     oup ;
   chIter      ci ;
   hzLogger*   plog ;
   char*       i ;
   hzString    S ;
   hzEmaddr    e ;
   uint32_t    nRecv ;
   uint32_t    nSend ;
   uint32_t    nTotal = 0;
   char        sbuf[HZ_MAXPACKET+4];
   char        rbuf[HZ_MAXPACKET+4];
   SMTPCode    smtpCode ;
   hzEcode     rc = E_OK ;
   plog = GetThreadLogger() ;
   if (!plog)
       Fatal("No thread logger\n") ;
   if (!server || !server[0])  { rc = E_ARGUMENT ; plog->Out("No SMTP server supplied\n") ; }
   if (!uname || !uname[0]){ rc = E_ARGUMENT ; plog->Out("No SMTP username supplied\n") ; }
   if (!passwd || !passwd[0])  { rc = E_ARGUMENT ; plog->Out("No SMTP password supplied\n") ; }
   if (!m_Recipients.Count())  { rc = E_ARGUMENT ; plog->Out("No recipients specified\n") ; }
   if (!m_AddrFrom)            { rc = E_ARGUMENT ; plog->Out("No sender address specified\n") ; }
   if (rc != E_OK)
       return rc ;
   if (!m_RealFrom)
       m_RealFrom = *m_AddrFrom ;
   S = server ;
   rc = C.ConnectStd(S, 25);
   if (rc != E_OK)
   {
       hzerr(rc, "Could not conect to SMTP server [%s]", server) ;
       return rc ;
   }
   C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
   if (nRecv >&eq; 0)
       rbuf[nRecv] = 0;
   else
       rbuf[0]= 0;
   smtpCode = _getSmtpCode(rbuf) ;
   if (smtpCode != SMTP_READY)
   {
       plog->Out("%d Server not ready so quiting\n", smtpCode) ;
       rc = E_HOSTRETRY ;
       goto Quit ;
   }
   sprintf(sbuf, "EHLO %s\r\n", *m_AddrFrom) ;
   if ((rc = C.Send(sbuf, strlen(sbuf))) != E_OK)
   {
       plog->Out("Could not send HELO command\n") ;
       goto Quit ;
   }
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Client -> %s", sbuf) ;
   if ((rc = C.Recv(rbuf, nRecv, HZ_MAXPACKET)) != E_OK)
   {
       plog->Out("Could not get ACK to EHLO msg\n") ;
       goto Quit ;
   }
   if (nRecv >&eq; 0)
       rbuf[nRecv] = 0;
   else
       rbuf[0]= 0;
   smtpCode = _getSmtpCode(rbuf) ;
   if (smtpCode != SMTP_OK)
       { rc = E_PROTOCOL ; plog->Out("Expected ACK so quitting\n") ; goto Quit ; }
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Server -> %s\n", rbuf) ;
   if (uname && passwd)
   {
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Have username of %s and password of %s so will auth\n", uname, passwd) ;
       strcpy(sbuf, "AUTH LOGIN\r\n") ;
       if ((rc = C.Send(sbuf, strlen(sbuf))) != E_OK)
           { plog->Out("Could not send MAIL FROM message\n") ; goto Quit ; }
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Client -> %s", sbuf) ;
       C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
       if (nRecv > 0)
           rbuf[nRecv] = 0;
       else
           rbuf[0]= 0;
       smtpCode = _getSmtpCode(rbuf) ;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Server -> %s", rbuf) ;
       if (smtpCode != SMTP_LOGINFO)
           { rc = E_BADSENDER ; plog->Out("Expected code 334. Got instead code %d\n", smtpCode) ; goto Quit ; }
       inp.Clear() ;
       oup.Clear() ;
       inp = uname ;
       Base64Encode(oup, inp) ;
       oup << "\r\n" ;
       S = oup ;
       if ((rc = C.Send(*S, S.Length())) != E_OK)
           { plog->Out("Could not send username\n") ; goto Quit ; }
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Client -> %s", *S) ;
       C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
       if (nRecv > 0)
           rbuf[nRecv] = 0;
       else
           rbuf[0]= 0;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Server -> %s", rbuf) ;
       smtpCode = _getSmtpCode(rbuf) ;
       if (smtpCode != SMTP_LOGINFO)
       {
           plog->Out("Expected code 334 (request for password). Got %d\n", smtpCode) ;
           rc = E_BADSENDER ;
           goto Quit ;
       }
       inp.Clear() ;
       oup.Clear() ;
       inp = passwd ;
       Base64Encode(oup, inp) ;
       oup << "\r\n" ;
       S = oup ;
       if ((rc = C.Send(*S, S.Length())) != E_OK)
           { plog->Out("Could not send password\n") ; goto Quit ; }
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Client -> %s", *S) ;
       C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
       if (nRecv > 0)
           rbuf[nRecv] = 0;
       else
           rbuf[0]= 0;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Server -> %s", rbuf) ;
       smtpCode = _getSmtpCode(rbuf) ;
       if (smtpCode != SMTP_GO_AHEAD)
       {
           plog->Out("Expected code 235 (Login OK, Go Ahead). Got %d\n", smtpCode) ;
           rc = E_BADSENDER ;
           goto Quit ;
       }
   }
   /*
   **  ** Now send the sender details
   **      */
   sprintf(sbuf, "MAIL FROM: <%s>\r\n", *m_AddrFrom) ;
   if ((rc = C.Send(sbuf, strlen(sbuf))) != E_OK)
       { plog->Out("Could not send MAIL FROM message\n") ; goto Quit ; }
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Client -> %s", sbuf) ;
   C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
   if (nRecv > 0)
       rbuf[nRecv] = 0;
   else
       rbuf[0]= 0;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Server -> %s", rbuf) ;
   smtpCode = _getSmtpCode(rbuf) ;
   if (smtpCode != SMTP_OK)
   {
       plog->Out("Expected a 250 (OK) code. Got %d\n", smtpCode) ;
       rc = E_BADSENDER ;
       goto Quit ;
   }
   /*
   **  ** Now send the reciprient details
   **      */
   for (rx = m_Recipients ; rx.Valid() ; rx++)
   {
       e = rx.Element() ;
       sprintf(sbuf, "RCPT TO: <%s>\r\n", *e) ;
       C.Send(sbuf, strlen(sbuf)) ;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Client -> %s", sbuf) ;
       rc = C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
       if (rc != E_OK)
       {
           plog->Out("Broken pipe while sending recipient details\n") ;
           goto Quit ;
       }
       if (nRecv > 0)
           rbuf[nRecv] = 0;
       else
           rbuf[0]= 0;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Server -> %s", rbuf) ;
       smtpCode = _getSmtpCode(rbuf) ;
       if (smtpCode != SMTP_OK && smtpCode != SMTP_GO_AHEAD)
       {
           plog->Out("Expected a 250 (OK) or 235 (Go Ahead) code. Got %d\n", smtpCode) ;
           rc = E_NOACCOUNT ;
           goto Quit ;
       }
   }
   for (rx = m_CC ; rx.Valid() ; rx++)
   {
       e = rx.Element() ;
       sprintf(sbuf, "RCPT TO: <%s>\r\n", *e) ;
       C.Send(sbuf, strlen(sbuf)) ;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Client -> %s", sbuf) ;
       rc = C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
       if (rc != E_OK)
       {
           plog->Out("Broken pipe while sending recipient details\n") ;
           goto Quit ;
       }
       if (nRecv > 0)
           rbuf[nRecv] = 0;
       else
           rbuf[0]= 0;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Server -> %s", rbuf) ;
       smtpCode = _getSmtpCode(rbuf) ;
       if (smtpCode != SMTP_OK)
       {
           plog->Out("Target user not ok so quiting\n") ;
           rc = E_NOACCOUNT ;
           goto Quit ;
       }
   }
   for (rx = m_BCC ; rx.Valid() ; rx++)
   {
       e = rx.Element() ;
       sprintf(sbuf, "RCPT TO: <%s>\r\n", *e) ;
       C.Send(sbuf, strlen(sbuf)) ;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Client -> %s", sbuf) ;
       rc = C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
       if (rc != E_OK)
       {
           plog->Out("Broken pipe while sending recipient details\n") ;
           goto Quit ;
       }
       if (nRecv > 0)
           rbuf[nRecv] = 0;
       else
           rbuf[0]= 0;
       if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
           plog->Out("Server -> %s", rbuf) ;
       smtpCode = _getSmtpCode(rbuf) ;
       if (smtpCode != SMTP_OK)
       {
           plog->Out("Target user not ok so quiting\n") ;
           rc = E_NOACCOUNT ;
           goto Quit ;
       }
   }
   sprintf(sbuf, "DATA\r\n") ;
   C.Send(sbuf, strlen(sbuf)) ;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Client -> %s", sbuf) ;
   C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
   if (nRecv > 0)
       rbuf[nRecv] = 0;
   else
       rbuf[0]= 0;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Server -> %s", rbuf) ;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Sending %d bytes of data\n", m_Final.Size()) ;
   ci = m_Final ;
   for (rc = E_OK ; rc == E_OK ;)
   {
       for (i = sbuf, nSend = 0; !ci.eof() && nSend < HZ_MAXPACKET ; nSend++, ci++)
           *i++ = *ci ;
       if (nSend == 0)
           break ;
       nTotal += nSend ;
       rc = C.Send(sbuf, nSend) ;
   }
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Sent %d of %d bytes\n", nTotal, m_Final.Size()) ;
   strcpy(sbuf, ".\r\n") ;
   C.Send(sbuf, strlen(sbuf)) ;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Client -> %s", sbuf) ;
   if (rc != E_OK)
   {
       plog->Out("Could not transmit msg body\n") ;
       goto Quit ;
   }
   C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
   if (nRecv > 0)
       rbuf[nRecv] = 0;
   else
       rbuf[0]= 0;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Server -> %s", rbuf) ;
Quit:
   sprintf(sbuf, "QUIT\r\n") ;
   C.Send(sbuf, strlen(sbuf)) ;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Client -> %s", sbuf) ;
   C.Recv(rbuf, nRecv, HZ_MAXPACKET) ;
   if (nRecv > 0)
       rbuf[nRecv] = 0;
   else
       rbuf[0]= 0;
   if (_hzGlobal_Debug & HZ_DEBUG_MAILER)
       plog->Out("Server -> %s", rbuf) ;
   C.Close() ;
   return rc ;
}