1 //////////////////////////////////////////////////////////////////////
\r
2 // Original class CFastSmtp written by
\r
3 // christopher w. backen <immortal@cox.net>
\r
4 // More details at: http://www.codeproject.com/KB/IP/zsmtp.aspx
\r
7 // 1. name of the class and some functions
\r
8 // 2. new functions added: SendData,ReceiveData and more
\r
9 // 3. authentication added
\r
10 // 4. attachments added
\r
11 // introduced by Jakub Piwowarczyk
\r
12 // More details at: http://www.codeproject.com/KB/mcpp/CSmtp.aspx
\r
13 //////////////////////////////////////////////////////////////////////
\r
17 #pragma warning(push)
\r
18 #pragma warning(disable:4786)
\r
20 //////////////////////////////////////////////////////////////////////
\r
21 // Construction/Destruction
\r
22 //////////////////////////////////////////////////////////////////////
\r
26 // Initialize variables
\r
27 m_oError = CSMTP_NO_ERROR;
\r
28 m_iXPriority = XPRIORITY_NORMAL;
\r
31 m_pcLocalHostName = NULL;
\r
32 m_pcMailFrom = NULL;
\r
33 m_pcNameFrom = NULL;
\r
39 m_pcPassword = NULL;
\r
40 m_pcSMTPSrvName = NULL;
\r
42 if((RecvBuf = new char[BUFFER_SIZE]) == NULL)
\r
44 m_oError = CSMTP_LACK_OF_MEMORY;
\r
48 if((SendBuf = new char[BUFFER_SIZE]) == NULL)
\r
50 m_oError = CSMTP_LACK_OF_MEMORY;
\r
54 // Initialize WinSock
\r
55 WORD wVer = MAKEWORD(2,2);
\r
56 if (WSAStartup(wVer,&wsaData) != NO_ERROR)
\r
58 m_oError = CSMTP_WSA_STARTUP;
\r
61 if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )
\r
63 m_oError = CSMTP_WSA_VER;
\r
73 CCRecipients.clear();
\r
74 BCCRecipients.clear();
\r
75 Attachments.clear();
\r
78 if (m_pcLocalHostName)
\r
79 delete[] m_pcLocalHostName;
\r
81 delete[] m_pcMailFrom;
\r
83 delete[] m_pcNameFrom;
\r
85 delete[] m_pcSubject;
\r
87 delete[] m_pcMsgBody;
\r
89 delete[] m_pcXMailer;
\r
91 delete[] m_pcReplyTo;
\r
95 delete[] m_pcPassword;
\r
105 //////////////////////////////////////////////////////////////////////
\r
107 //////////////////////////////////////////////////////////////////////
\r
109 bool CSmtp::AddAttachment(const char *path)
\r
111 std::string str(path);
\r
112 Attachments.insert(Attachments.end(),str);
\r
116 bool CSmtp::AddRecipient(const char *email, const char *name)
\r
122 m_oError = CSMTP_UNDEF_RECIPENT_MAIL;
\r
127 recipent.Mail.insert(0,email);
\r
128 name!=NULL ? recipent.Name.insert(0,name) : recipent.Name.insert(0,"");
\r
130 Recipients.insert(Recipients.end(), recipent);
\r
135 bool CSmtp::AddCCRecipient(const char *email, const char *name)
\r
141 m_oError = CSMTP_UNDEF_RECIPENT_MAIL;
\r
146 recipent.Mail.insert(0,email);
\r
147 name!=NULL ? recipent.Name.insert(0,name) : recipent.Name.insert(0,"");
\r
149 CCRecipients.insert(CCRecipients.end(), recipent);
\r
154 bool CSmtp::AddBCCRecipient(const char *email, const char *name)
\r
160 m_oError = CSMTP_UNDEF_RECIPENT_MAIL;
\r
165 recipent.Mail.insert(0,email);
\r
166 name!=NULL ? recipent.Name.insert(0,name) : recipent.Name.insert(0,"");
\r
168 BCCRecipients.insert(BCCRecipients.end(), recipent);
\r
175 unsigned int i,rcpt_count,res,FileId;
\r
176 char *FileBuf = NULL, *FileName = NULL;
\r
177 FILE* hFile = NULL;
\r
178 unsigned long int FileSize,TotalSize,MsgPart;
\r
180 // ***** CONNECTING TO SMTP SERVER *****
\r
182 assert(m_pcSMTPSrvName);
\r
184 // connecting to remote host:
\r
185 if( (hSocket = ConnectRemoteServer(m_pcSMTPSrvName, m_iSMTPSrvPort)) == INVALID_SOCKET )
\r
187 m_oError = CSMTP_WSA_INVALID_SOCKET;
\r
190 Sleep(DELAY_IN_MS);
\r
194 switch(SmtpXYZdigits())
\r
199 m_oError = CSMTP_SERVER_NOT_READY;
\r
203 // EHLO <SP> <domain> <CRLF>
\r
204 sprintf(SendBuf,"EHLO %s\r\n",GetLocalHostName()!=NULL ? m_pcLocalHostName : "domain");
\r
207 Sleep(DELAY_IN_MS);
\r
211 switch(SmtpXYZdigits())
\r
216 m_oError = CSMTP_COMMAND_EHLO;
\r
220 // AUTH <SP> LOGIN <CRLF>
\r
221 strcpy(SendBuf,"AUTH LOGIN\r\n");
\r
224 Sleep(DELAY_IN_MS);
\r
228 switch(SmtpXYZdigits())
\r
233 m_oError = CSMTP_COMMAND_AUTH_LOGIN;
\r
240 m_oError = CSMTP_UNDEF_LOGIN;
\r
243 std::string encoded_login = base64_encode(reinterpret_cast<const unsigned char*>(m_pcLogin),strlen(m_pcLogin));
\r
244 sprintf(SendBuf,"%s\r\n",encoded_login.c_str());
\r
247 Sleep(DELAY_IN_MS);
\r
251 switch(SmtpXYZdigits())
\r
256 m_oError = CSMTP_UNDEF_XYZ_RESPOMSE;
\r
263 m_oError = CSMTP_UNDEF_PASSWORD;
\r
266 std::string encoded_password = base64_encode(reinterpret_cast<const unsigned char*>(m_pcPassword),strlen(m_pcPassword));
\r
267 sprintf(SendBuf,"%s\r\n",encoded_password.c_str());
\r
270 Sleep(DELAY_IN_MS);
\r
274 switch(SmtpXYZdigits())
\r
279 m_oError = CSMTP_BAD_LOGIN_PASS;
\r
282 m_oError = CSMTP_UNDEF_XYZ_RESPOMSE;
\r
286 // ***** SENDING E-MAIL *****
\r
288 // MAIL <SP> FROM:<reverse-path> <CRLF>
\r
289 if(m_pcMailFrom == NULL)
\r
291 m_oError = CSMTP_UNDEF_MAILFROM;
\r
294 sprintf(SendBuf,"MAIL FROM:<%s>\r\n",m_pcMailFrom);
\r
297 Sleep(DELAY_IN_MS);
\r
301 switch(SmtpXYZdigits())
\r
306 m_oError = CSMTP_COMMAND_MAIL_FROM;
\r
310 // RCPT <SP> TO:<forward-path> <CRLF>
\r
311 rcpt_count = Recipients.size();
\r
312 for(i=0;i<Recipients.size();i++)
\r
314 sprintf(SendBuf,"RCPT TO:<%s>\r\n",(Recipients.at(i).Mail).c_str());
\r
317 Sleep(DELAY_IN_MS);
\r
321 switch(SmtpXYZdigits())
\r
326 m_oError = CSMTP_COMMAND_RCPT_TO;
\r
332 for(i=0;i<CCRecipients.size();i++)
\r
334 sprintf(SendBuf,"RCPT TO:<%s>\r\n",(CCRecipients.at(i).Mail).c_str());
\r
337 Sleep(DELAY_IN_MS);
\r
341 for(i=0;i<BCCRecipients.size();i++)
\r
343 sprintf(SendBuf,"RCPT TO:<%s>\r\n",(BCCRecipients.at(i).Mail).c_str());
\r
346 Sleep(DELAY_IN_MS);
\r
352 strcpy(SendBuf,"DATA\r\n");
\r
355 Sleep(DELAY_IN_MS);
\r
359 switch(SmtpXYZdigits())
\r
364 m_oError = CSMTP_COMMAND_DATA;
\r
369 if(!FormatHeader(SendBuf))
\r
371 m_oError = CSMTP_UNDEF_MSG_HEADER;
\r
377 // send text message
\r
378 sprintf(SendBuf,"%s\r\n",m_pcMsgBody); // NOTICE: each line ends with <CRLF>
\r
382 // next goes attachments (if they are)
\r
383 if((FileBuf = new char[55]) == NULL)
\r
385 m_oError = CSMTP_LACK_OF_MEMORY;
\r
388 if((FileName = new char[255]) == NULL)
\r
390 m_oError = CSMTP_LACK_OF_MEMORY;
\r
394 for(FileId=0;FileId<Attachments.size();FileId++)
\r
396 strcpy(FileName,Attachments[FileId].c_str());
\r
398 sprintf(SendBuf,"--%s\r\n",BOUNDARY_TEXT);
\r
399 strcat(SendBuf,"Content-Type: application/x-msdownload; name=\"");
\r
400 strcat(SendBuf,&FileName[Attachments[FileId].find_last_of("\\") + 1]);
\r
401 strcat(SendBuf,"\"\r\n");
\r
402 strcat(SendBuf,"Content-Transfer-Encoding: base64\r\n");
\r
403 strcat(SendBuf,"Content-Disposition: attachment; filename=\"");
\r
404 strcat(SendBuf,&FileName[Attachments[FileId].find_last_of("\\") + 1]);
\r
405 strcat(SendBuf,"\"\r\n");
\r
406 strcat(SendBuf,"\r\n");
\r
411 // opening the file:
\r
412 hFile = fopen(FileName,"rb");
\r
415 m_oError = CSMTP_FILE_NOT_EXIST;
\r
419 // checking file size:
\r
421 while(!feof(hFile))
\r
422 FileSize += fread(FileBuf,sizeof(char),54,hFile);
\r
423 TotalSize += FileSize;
\r
425 // sending the file:
\r
426 if(TotalSize/1024 > MSG_SIZE_IN_MB*1024)
\r
427 m_oError = CSMTP_MSG_TOO_BIG;
\r
430 fseek (hFile,0,SEEK_SET);
\r
433 for(i=0;i<FileSize/54+1;i++)
\r
435 res = fread(FileBuf,sizeof(char),54,hFile);
\r
436 MsgPart ? strcat(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str())
\r
437 : strcpy(SendBuf,base64_encode(reinterpret_cast<const unsigned char*>(FileBuf),res).c_str());
\r
438 strcat(SendBuf,"\r\n");
\r
439 MsgPart += res + 2;
\r
440 if(MsgPart >= BUFFER_SIZE/2)
\r
441 { // sending part of the message
\r
468 // sending last message block (if there is one or more attachments)
\r
469 if(Attachments.size())
\r
471 sprintf(SendBuf,"\r\n--%s--\r\n",BOUNDARY_TEXT);
\r
477 strcpy(SendBuf,"\r\n.\r\n");
\r
480 Sleep(DELAY_IN_MS);
\r
484 switch(SmtpXYZdigits())
\r
489 m_oError = CSMTP_MSG_BODY_ERROR;
\r
493 // ***** CLOSING CONNECTION *****
\r
496 strcpy(SendBuf,"QUIT\r\n");
\r
499 Sleep(DELAY_IN_MS);
\r
503 switch(SmtpXYZdigits())
\r
508 m_oError = CSMTP_COMMAND_QUIT;
\r
513 closesocket(hSocket);
\r
518 SOCKET CSmtp::ConnectRemoteServer(const char *server,const unsigned short port)
\r
520 short nProtocolPort;
\r
521 LPHOSTENT lpHostEnt;
\r
522 LPSERVENT lpServEnt;
\r
523 SOCKADDR_IN sockAddr;
\r
524 SOCKET hServerSocket = INVALID_SOCKET;
\r
525 struct in_addr addr;
\r
527 // If the user input is an alpha name for the host, use gethostbyname()
\r
528 // If not, get host by addr (assume IPv4)
\r
529 if(isalpha(server[0]))
\r
530 lpHostEnt = gethostbyname(server);
\r
533 addr.s_addr = inet_addr(server);
\r
534 if(addr.s_addr == INADDR_NONE)
\r
536 m_oError = CSMTP_BAD_IPV4_ADDR;
\r
537 return INVALID_SOCKET;
\r
540 lpHostEnt = gethostbyaddr((char *) &addr, 4, AF_INET);
\r
543 if(lpHostEnt != NULL)
\r
545 if((hServerSocket = socket(PF_INET, SOCK_STREAM,0)) != INVALID_SOCKET)
\r
548 nProtocolPort = htons(port);
\r
551 lpServEnt = getservbyname("mail", 0);
\r
552 if (lpServEnt == NULL)
\r
553 nProtocolPort = htons(25);
\r
555 nProtocolPort = lpServEnt->s_port;
\r
558 sockAddr.sin_family = AF_INET;
\r
559 sockAddr.sin_port = nProtocolPort;
\r
560 sockAddr.sin_addr = *((LPIN_ADDR)*lpHostEnt->h_addr_list);
\r
561 if(connect(hServerSocket,(PSOCKADDR)&sockAddr,sizeof(sockAddr)) == SOCKET_ERROR)
\r
563 m_oError = CSMTP_WSA_CONNECT;
\r
564 hServerSocket = INVALID_SOCKET;
\r
569 m_oError = CSMTP_WSA_INVALID_SOCKET;
\r
570 return INVALID_SOCKET;
\r
575 m_oError = CSMTP_WSA_GETHOSTBY_NAME_ADDR;
\r
576 return INVALID_SOCKET;
\r
579 return hServerSocket;
\r
582 int CSmtp::SmtpXYZdigits()
\r
585 if(RecvBuf == NULL)
\r
587 return (RecvBuf[0]-'0')*100 + (RecvBuf[1]-'0')*10 + RecvBuf[2]-'0';
\r
590 bool CSmtp::FormatHeader(char* header)
\r
599 // check for at least one recipient
\r
600 if(Recipients.size())
\r
602 for (unsigned int i=s=0;i<Recipients.size();i++)
\r
603 s += Recipients[i].Mail.size() + Recipients[i].Name.size() + 3;
\r
606 if((to = new char[s]) == NULL)
\r
608 m_oError = CSMTP_LACK_OF_MEMORY;
\r
613 for (i=0;i<Recipients.size();i++)
\r
615 i > 0 ? strcat(to,","):strcpy(to,"");
\r
616 strcat(to,Recipients[i].Name.c_str());
\r
618 strcat(to,Recipients[i].Mail.c_str());
\r
624 m_oError = CSMTP_UNDEF_RECIPENTS;
\r
628 if(CCRecipients.size())
\r
630 for (i=s=0;i<CCRecipients.size();i++)
\r
631 s += CCRecipients[i].Mail.size() + CCRecipients[i].Name.size() + 3;
\r
634 if((cc = new char[s]) == NULL)
\r
636 m_oError = CSMTP_LACK_OF_MEMORY;
\r
642 for (i=0;i<CCRecipients.size();i++)
\r
644 i > 0 ? strcat(cc,","):strcpy(cc,"");
\r
645 strcat(cc,CCRecipients[i].Name.c_str());
\r
647 strcat(cc,CCRecipients[i].Mail.c_str());
\r
652 if(BCCRecipients.size())
\r
654 for (i=s=0;i<BCCRecipients.size();i++)
\r
655 s += BCCRecipients[i].Mail.size() + BCCRecipients[i].Name.size() + 3;
\r
658 if((bcc = new char[s]) == NULL)
\r
660 m_oError = CSMTP_LACK_OF_MEMORY;
\r
667 for (i=0;i<BCCRecipients.size();i++)
\r
669 i > 0 ? strcat(bcc,","):strcpy(bcc,"");
\r
670 strcat(bcc,BCCRecipients[i].Name.c_str());
\r
672 strcat(bcc,BCCRecipients[i].Mail.c_str());
\r
677 // Date: <SP> <dd> <SP> <mon> <SP> <yy> <SP> <hh> ":" <mm> ":" <ss> <SP> <zone> <CRLF>
\r
679 ::GetSystemTime(&st);
\r
680 ::GetDateFormatA(MAKELCID(0x0409,SORT_DEFAULT),0,&st,"ddd\',\' dd MMM yyyy",szDate,sizeof(szDate));
\r
681 ::GetTimeFormatA(MAKELCID(0x0409,SORT_DEFAULT),TIME_FORCE24HOURFORMAT,&st,"HH\':\'mm\':\'ss",sztTime,sizeof(sztTime));
\r
682 sprintf(header,"Date: %s %s\r\n", szDate, sztTime);
\r
684 // From: <SP> <sender> <SP> "<" <sender-email> ">" <CRLF>
\r
685 if(m_pcMailFrom == NULL)
\r
687 m_oError = CSMTP_UNDEF_MAILFROM;
\r
693 strcat(header,"From: ");
\r
695 strcat(header, m_pcNameFrom);
\r
696 strcat(header," <");
\r
697 strcat(header,m_pcMailFrom);
\r
698 strcat(header, ">\r\n");
\r
700 // X-Mailer: <SP> <xmailer-app> <CRLF>
\r
701 if (m_pcXMailer != NULL)
\r
703 strcat(header,"X-Mailer: ");
\r
704 strcat(header, m_pcXMailer);
\r
705 strcat(header, "\r\n");
\r
708 // Reply-To: <SP> <reverse-path> <CRLF>
\r
709 if(m_pcReplyTo != NULL)
\r
711 strcat(header, "Reply-To: ");
\r
712 strcat(header, m_pcReplyTo);
\r
713 strcat(header, "\r\n");
\r
716 // X-Priority: <SP> <number> <CRLF>
\r
717 switch(m_iXPriority)
\r
719 case XPRIORITY_HIGH:
\r
720 strcat(header,"X-Priority: 2 (High)\r\n");
\r
722 case XPRIORITY_NORMAL:
\r
723 strcat(header,"X-Priority: 3 (Normal)\r\n");
\r
725 case XPRIORITY_LOW:
\r
726 strcat(header,"X-Priority: 4 (Low)\r\n");
\r
729 strcat(header,"X-Priority: 3 (Normal)\r\n");
\r
732 // To: <SP> <remote-user-mail> <CRLF>
\r
733 strcat(header,"To: ");
\r
734 strcat(header, to);
\r
735 strcat(header, "\r\n");
\r
737 // Cc: <SP> <remote-user-mail> <CRLF>
\r
738 if(CCRecipients.size())
\r
740 strcat(header,"Cc: ");
\r
741 strcat(header, cc);
\r
742 strcat(header, "\r\n");
\r
745 if(BCCRecipients.size())
\r
747 strcat(header,"Bcc: ");
\r
748 strcat(header, bcc);
\r
749 strcat(header, "\r\n");
\r
752 // Subject: <SP> <subject-text> <CRLF>
\r
753 if(m_pcSubject == NULL)
\r
755 m_oError = CSMTP_UNDEF_SUBJECT;
\r
756 strcat(header, "Subject: ");
\r
760 strcat(header, "Subject: ");
\r
761 strcat(header, m_pcSubject);
\r
763 strcat(header, "\r\n");
\r
765 // MIME-Version: <SP> 1.0 <CRLF>
\r
766 strcat(header,"MIME-Version: 1.0\r\n");
\r
767 if(!Attachments.size())
\r
768 { // no attachments
\r
769 strcat(header,"Content-type: text/plain; charset=US-ASCII\r\n");
\r
770 strcat(header,"Content-Transfer-Encoding: 7bit\r\n");
\r
771 strcat(SendBuf,"\r\n");
\r
774 { // there is one or more attachments
\r
775 strcat(header,"Content-Type: multipart/mixed; boundary=\"");
\r
776 strcat(header,BOUNDARY_TEXT);
\r
777 strcat(header,"\"\r\n");
\r
778 strcat(header,"\r\n");
\r
779 // first goes text message
\r
780 strcat(SendBuf,"--");
\r
781 strcat(SendBuf,BOUNDARY_TEXT);
\r
782 strcat(SendBuf,"\r\n");
\r
783 strcat(SendBuf,"Content-type: text/plain; charset=US-ASCII\r\n");
\r
784 strcat(SendBuf,"Content-Transfer-Encoding: 7bit\r\n");
\r
785 strcat(SendBuf,"\r\n");
\r
797 bool CSmtp::ReceiveData()
\r
803 if(RecvBuf == NULL)
\r
806 if( (res = recv(hSocket,RecvBuf,BUFFER_SIZE,0)) == SOCKET_ERROR )
\r
808 m_oError = CSMTP_WSA_RECV;
\r
813 m_oError = CSMTP_CONNECTION_CLOSED;
\r
816 RecvBuf[res] = '\0';
\r
821 bool CSmtp::SendData()
\r
825 int idx = 0,res,nLeft = strlen(SendBuf);
\r
828 if( res = send(hSocket,&SendBuf[idx],nLeft,0) == SOCKET_ERROR)
\r
830 m_oError = CSMTP_WSA_SEND;
\r
841 CSmtpError CSmtp::GetLastError()
\r
847 const char* const CSmtp::GetLocalHostIP()
\r
849 in_addr *iaHost = NULL;
\r
850 HOSTENT *pHe = NULL;
\r
853 delete[] m_pcIPAddr;
\r
855 if(gethostname(m_pcHostName,255) != SOCKET_ERROR)
\r
857 pHe = gethostbyname(m_pcHostName);
\r
860 for (int i=0;pHe->h_addr_list[i] != 0;i++)
\r
862 iaHost = (LPIN_ADDR)pHe->h_addr_list[i];
\r
863 m_pcIPAddr = inet_ntoa(*iaHost);
\r
869 m_oError = CSMTP_WSA_GETHOSTBY_NAME_ADDR;
\r
877 const char* const CSmtp::GetLocalHostName()
\r
879 if(m_pcLocalHostName)
\r
880 delete[] m_pcLocalHostName;
\r
881 if((m_pcLocalHostName = new char[255]) == NULL)
\r
883 m_oError = CSMTP_LACK_OF_MEMORY;
\r
886 if(gethostname((char FAR*)m_pcLocalHostName,255) == SOCKET_ERROR)
\r
887 m_oError = CSMTP_WSA_HOSTNAME;
\r
888 return m_pcLocalHostName;
\r
891 unsigned const int CSmtp::GetBCCRecipientCount()
\r
893 return BCCRecipients.size();
\r
896 unsigned const int CSmtp::GetCCRecipientCount()
\r
898 return CCRecipients.size();
\r
901 const char* const CSmtp::GetMessageBody()
\r
903 return m_pcMsgBody;
\r
906 unsigned const int CSmtp::GetRecipientCount()
\r
908 return Recipients.size();
\r
911 const char* const CSmtp::GetReplyTo()
\r
913 return m_pcReplyTo;
\r
916 const char* const CSmtp::GetMailFrom()
\r
918 return m_pcMailFrom;
\r
921 const char* const CSmtp::GetSenderName()
\r
923 return m_pcNameFrom;
\r
926 const char* const CSmtp::GetSubject()
\r
928 return m_pcSubject;
\r
931 const char* const CSmtp::GetXMailer()
\r
933 return m_pcXMailer;
\r
936 CSmptXPriority CSmtp::GetXPriority()
\r
938 return m_iXPriority;
\r
941 void CSmtp::SetXPriority(CSmptXPriority priority)
\r
943 m_iXPriority = priority;
\r
946 void CSmtp::SetMessageBody(const char *body)
\r
949 int s = strlen(body);
\r
951 delete[] m_pcMsgBody;
\r
952 if((m_pcMsgBody = new char[s+1]) == NULL)
\r
954 m_oError = CSMTP_LACK_OF_MEMORY;
\r
957 strcpy(m_pcMsgBody, body);
\r
960 void CSmtp::SetReplyTo(const char *replyto)
\r
963 int s = strlen(replyto);
\r
965 delete[] m_pcReplyTo;
\r
966 if((m_pcReplyTo = new char[s+1]) == NULL)
\r
968 m_oError = CSMTP_LACK_OF_MEMORY;
\r
971 strcpy(m_pcReplyTo, replyto);
\r
974 void CSmtp::SetSenderMail(const char *email)
\r
977 int s = strlen(email);
\r
979 delete[] m_pcMailFrom;
\r
980 if((m_pcMailFrom = new char[s+1]) == NULL)
\r
982 m_oError = CSMTP_LACK_OF_MEMORY;
\r
985 strcpy(m_pcMailFrom, email);
\r
988 void CSmtp::SetSenderName(const char *name)
\r
991 int s = strlen(name);
\r
993 delete[] m_pcNameFrom;
\r
994 if((m_pcNameFrom = new char[s+1]) == NULL)
\r
996 m_oError = CSMTP_LACK_OF_MEMORY;
\r
999 strcpy(m_pcNameFrom, name);
\r
1002 void CSmtp::SetSubject(const char *subject)
\r
1005 int s = strlen(subject);
\r
1007 delete[] m_pcSubject;
\r
1008 m_pcSubject = new char[s+1];
\r
1009 strcpy(m_pcSubject, subject);
\r
1012 void CSmtp::SetXMailer(const char *xmailer)
\r
1015 int s = strlen(xmailer);
\r
1017 delete[] m_pcXMailer;
\r
1018 if((m_pcXMailer = new char[s+1]) == NULL)
\r
1020 m_oError = CSMTP_LACK_OF_MEMORY;
\r
1023 strcpy(m_pcXMailer, xmailer);
\r
1026 void CSmtp::SetLogin(const char *login)
\r
1029 int s = strlen(login);
\r
1031 delete[] m_pcLogin;
\r
1032 if((m_pcLogin = new char[s+1]) == NULL)
\r
1034 m_oError = CSMTP_LACK_OF_MEMORY;
\r
1037 strcpy(m_pcLogin, login);
\r
1040 void CSmtp::SetPassword(const char *password)
\r
1043 int s = strlen(password);
\r
1045 delete[] m_pcPassword;
\r
1046 if((m_pcPassword = new char[s+1]) == NULL)
\r
1048 m_oError = CSMTP_LACK_OF_MEMORY;
\r
1051 strcpy(m_pcPassword, password);
\r
1054 void CSmtp::SetSMTPServer(const char* SrvName,const unsigned short SrvPort)
\r
1057 m_iSMTPSrvPort = SrvPort;
\r
1058 int s = strlen(SrvName);
\r
1059 if(m_pcSMTPSrvName)
\r
1060 delete[] m_pcSMTPSrvName;
\r
1061 if((m_pcSMTPSrvName = new char[s+1]) == NULL)
\r
1063 m_oError = CSMTP_LACK_OF_MEMORY;
\r
1066 strcpy(m_pcSMTPSrvName, SrvName);
\r
1069 //////////////////////////////////////////////////////////////////////
\r
1071 //////////////////////////////////////////////////////////////////////
\r
1073 char* GetErrorText(CSmtpError ErrorId)
\r
1077 case CSMTP_NO_ERROR:
\r
1079 case CSMTP_WSA_STARTUP:
\r
1080 return "Unable to initialise winsock2.";
\r
1081 case CSMTP_WSA_VER:
\r
1082 return "Wrong version of the winsock2.";
\r
1083 case CSMTP_WSA_SEND:
\r
1084 return "Function send() failed.";
\r
1085 case CSMTP_WSA_RECV:
\r
1086 return "Function recv() failed.";
\r
1087 case CSMTP_WSA_CONNECT:
\r
1088 return "Function connect failed.";
\r
1089 case CSMTP_WSA_GETHOSTBY_NAME_ADDR:
\r
1090 return "Functions gethostbyname() or gethostbyaddr() failed.";
\r
1091 case CSMTP_WSA_INVALID_SOCKET:
\r
1092 return "Invalid winsock2 socket.";
\r
1093 case CSMTP_WSA_HOSTNAME:
\r
1094 return "Function hostname() failed.";
\r
1095 case CSMTP_BAD_IPV4_ADDR:
\r
1096 return "Improper IPv4 address.";
\r
1097 case CSMTP_UNDEF_MSG_HEADER:
\r
1098 return "Undefined message header.";
\r
1099 case CSMTP_UNDEF_MAILFROM:
\r
1100 return "Undefined from is the mail.";
\r
1101 case CSMTP_UNDEF_SUBJECT:
\r
1102 return "Undefined message subject.";
\r
1103 case CSMTP_UNDEF_RECIPENTS:
\r
1104 return "Undefined at least one reciepent.";
\r
1105 case CSMTP_UNDEF_RECIPENT_MAIL:
\r
1106 return "Undefined recipent mail.";
\r
1107 case CSMTP_UNDEF_LOGIN:
\r
1108 return "Undefined user login.";
\r
1109 case CSMTP_UNDEF_PASSWORD:
\r
1110 return "Undefined user password.";
\r
1111 case CSMTP_COMMAND_MAIL_FROM:
\r
1112 return "Server returned error after sending MAIL FROM.";
\r
1113 case CSMTP_COMMAND_EHLO:
\r
1114 return "Server returned error after sending EHLO.";
\r
1115 case CSMTP_COMMAND_AUTH_LOGIN:
\r
1116 return "Server returned error after sending AUTH LOGIN.";
\r
1117 case CSMTP_COMMAND_DATA:
\r
1118 return "Server returned error after sending DATA.";
\r
1119 case CSMTP_COMMAND_QUIT:
\r
1120 return "Server returned error after sending QUIT.";
\r
1121 case CSMTP_COMMAND_RCPT_TO:
\r
1122 return "Server returned error after sending RCPT TO.";
\r
1123 case CSMTP_MSG_BODY_ERROR:
\r
1124 return "Error in message body";
\r
1125 case CSMTP_CONNECTION_CLOSED:
\r
1126 return "Server has closed the connection.";
\r
1127 case CSMTP_SERVER_NOT_READY:
\r
1128 return "Server is not ready.";
\r
1129 case CSMTP_FILE_NOT_EXIST:
\r
1130 return "File not exist.";
\r
1131 case CSMTP_MSG_TOO_BIG:
\r
1132 return "Message is too big.";
\r
1133 case CSMTP_BAD_LOGIN_PASS:
\r
1134 return "Bad login or password.";
\r
1135 case CSMTP_UNDEF_XYZ_RESPOMSE:
\r
1136 return "Undefined xyz SMTP response.";
\r
1137 case CSMTP_LACK_OF_MEMORY:
\r
1138 return "Lack of memory.";
\r
1140 return "Undefined error id.";
\r
1144 #pragma warning(pop)
\r