#include "HwSMTP.h"\r
#include "CBase64.h"\r
#include "SpeedPostEmail.h"\r
-\r
+#include "Windns.h"\r
#include <Afxmt.h>\r
\r
#ifdef _DEBUG\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
+ LPCTSTR lpszFromName,\r
LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet,\r
CStringArray *pStrAryAttach,\r
- CStringArray *pStrAryCC,\r
- UINT nSmtpSrvPort\r
+ LPCTSTR pStrAryCC,\r
+ UINT nSmtpSrvPort,\r
+ LPCTSTR pSender,\r
+ LPCTSTR pToList\r
)\r
{\r
m_csSmtpSrvHost = GET_SAFE_STRING(lpszSmtpSrvHost);\r
m_bMustAuth = bMustAuth;\r
m_csAddrFrom = GET_SAFE_STRING(lpszAddrFrom);\r
m_csAddrTo = GET_SAFE_STRING(lpszAddrTo);\r
- m_csSenderName = GET_SAFE_STRING(lpszSenderName);\r
+ m_csFromName = GET_SAFE_STRING(lpszFromName);\r
m_csReceiverName = GET_SAFE_STRING(lpszReceiverName);\r
m_csSubject = GET_SAFE_STRING(lpszSubject);\r
m_csBody = GET_SAFE_STRING(lpszBody);\r
m_csCharSet = GET_SAFE_STRING(lpszCharSet);\r
+ m_StrCC = GET_SAFE_STRING(pStrAryCC);\r
+ m_csSender = GET_SAFE_STRING(pSender);\r
+ m_csToList = GET_SAFE_STRING(pToList);\r
+\r
if ( pStrAryAttach )\r
m_StrAryAttach.Append ( *pStrAryAttach );\r
- if ( pStrAryCC )\r
- m_StrAryCC.Append ( *pStrAryCC );\r
+ \r
m_nSmtpSrvPort = nSmtpSrvPort;\r
m_hThread = NULL;\r
}\r
BOOL m_bMustAuth;\r
CString m_csAddrFrom;\r
CString m_csAddrTo;\r
- CString m_csSenderName;\r
+ CString m_csFromName;\r
CString m_csReceiverName;\r
CString m_csSubject;\r
CString m_csBody;\r
CString m_csCharSet;\r
CStringArray m_StrAryAttach;\r
- CStringArray m_StrAryCC;\r
+ CString m_StrCC;\r
UINT m_nSmtpSrvPort;\r
+ CString m_csSender;\r
+ CString m_csToList;\r
\r
HANDLE m_hThread;\r
};\r
m_csMIMEContentType = _T( "multipart/mixed");\r
m_csPartBoundary = _T( "WC_MAIL_PaRt_BoUnDaRy_05151998" );\r
m_csNoMIMEText = _T( "This is a multi-part message in MIME format." );\r
-// m_csCharSet = _T("\r\n\tcharset=\"iso-8859-1\"\r\n");\r
+ //m_csCharSet = _T("\r\n\tcharset=\"iso-8859-1\"\r\n");\r
+\r
+ AfxSocketInit();\r
}\r
\r
CHwSMTP::~CHwSMTP()\r
{\r
}\r
\r
+void CHwSMTP::GetNameAddress(CString &in, CString &name,CString &address)\r
+{\r
+ int start,end;\r
+ start=in.Find(_T('<'));\r
+ end=in.Find(_T('>'));\r
+\r
+ if(start >=0 && end >=0)\r
+ {\r
+ name=in.Left(start);\r
+ address=in.Mid(start+1,end-start-1);\r
+ }\r
+ else\r
+ address=in;\r
+}\r
+\r
+CString CHwSMTP::GetServerAddress(CString &email)\r
+{\r
+ CString str;\r
+ int start,end;\r
+ \r
+ start = email.Find(_T("<"));\r
+ end = email.Find(_T(">"));\r
+\r
+ if(start>=0 && end >=0)\r
+ {\r
+ str=email.Mid(start+1,end-start-1);\r
+ }\r
+ else\r
+ {\r
+ str=email;\r
+ }\r
+\r
+ start = str.Find(_T('@'));\r
+ return str.Mid(start+1);\r
+\r
+}\r
+\r
+BOOL CHwSMTP::SendSpeedEmail\r
+ (\r
+ LPCTSTR lpszAddrFrom,\r
+ LPCTSTR lpszAddrTo,\r
+ LPCTSTR lpszSubject,\r
+ LPCTSTR lpszBody,\r
+ LPCTSTR lpszCharSet, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
+ CStringArray *pStrAryAttach,\r
+ LPCTSTR pStrAryCC,\r
+ UINT nSmtpSrvPort,\r
+ LPCTSTR pSend \r
+ )\r
+{\r
+\r
+ BOOL ret=true;\r
+ CString To;\r
+ To += GET_SAFE_STRING(lpszAddrTo);\r
+ To += _T(";");\r
+ To += GET_SAFE_STRING(pStrAryCC);\r
+\r
+ std::map<CString,std::vector<CString>> Address;\r
+\r
+ int start = 0;\r
+ while( start >= 0 )\r
+ {\r
+ CString one= To.Tokenize(_T(";"),start);\r
+ one=one.Trim();\r
+ if(one.IsEmpty())\r
+ continue;\r
+ \r
+ CString addr;\r
+ addr = GetServerAddress(one);\r
+ if(addr.IsEmpty())\r
+ continue;\r
+ \r
+ \r
+ Address[addr].push_back(one); \r
+\r
+ }\r
+\r
+ std::map<CString,std::vector<CString>>::iterator itr1 = Address.begin();\r
+ for( ; itr1 != Address.end(); ++itr1 )\r
+ {\r
+ PDNS_RECORD pDnsRecord;\r
+ PDNS_RECORD pNext;\r
+ \r
+ DnsQuery(itr1->first ,\r
+ DNS_TYPE_MX,DNS_QUERY_STANDARD,\r
+ NULL, //Contains DNS server IP address.\r
+ &pDnsRecord, //Resource record that contains the response.\r
+ NULL\r
+ ); \r
+ \r
+ CString to;\r
+ to.Empty();\r
+ for(int i=0;i<itr1->second.size();i++)\r
+ {\r
+ to+=itr1->second[i];\r
+ to+=_T(";");\r
+ }\r
+ if(to.IsEmpty())\r
+ continue;\r
+\r
+ pNext=pDnsRecord;\r
+ while(pNext)\r
+ {\r
+ \r
+ if(SendEmail(pNext->Data.MX.pNameExchange,NULL,NULL,false,\r
+ lpszAddrFrom,to,lpszSubject,lpszBody,lpszCharSet,pStrAryAttach,pStrAryCC,\r
+ 25,pSend,lpszAddrTo))\r
+ break;\r
+ pNext=pNext->pNext;\r
+ }\r
+ if(pNext == NULL)\r
+ ret = false;\r
+\r
+ //SendEmail(itr1.first,NULL,NULL,false,lpszAddrFrom,,lpszFromname);\r
+ DnsRecordListFree(pDnsRecord,DnsFreeRecordList);\r
+ } \r
+\r
+ return ret;\r
+}\r
BOOL CHwSMTP::SendEmail (\r
LPCTSTR lpszSmtpSrvHost,\r
LPCTSTR lpszUserName,\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
- LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet, // ×Ö·û¼¯ÀàÐÍ£¬ÀýÈ磺·±ÌåÖÐÎÄÕâÀïÓ¦ÊäÈë"big5"£¬¼òÌåÖÐÎÄʱÊäÈë"gb2312"\r
CStringArray *pStrAryAttach/*=NULL*/,\r
- CStringArray *pStrAryCC/*=NULL*/,\r
- UINT nSmtpSrvPort/*=25*/\r
+ LPCTSTR pStrAryCC/*=NULL*/,\r
+ UINT nSmtpSrvPort,/*=25*/\r
+ LPCTSTR pSender,\r
+ LPCTSTR pToList\r
)\r
{\r
- TRACE ( _T("·¢ËÍÓʼþ£º%s, %s, %s\n"), lpszAddrTo, lpszReceiverName, lpszBody );\r
+ TRACE ( _T("·¢ËÍÓʼþ£º%s, %s\n"), lpszAddrTo, lpszBody );\r
m_StrAryAttach.RemoveAll();\r
- m_StrAryCC.RemoveAll();\r
+\r
+ m_StrCC += GET_SAFE_STRING(pStrAryCC);\r
+\r
m_csSmtpSrvHost = GET_SAFE_STRING ( lpszSmtpSrvHost );\r
if ( m_csSmtpSrvHost.GetLength() <= 0 )\r
{\r
\r
m_csAddrFrom = GET_SAFE_STRING ( lpszAddrFrom );\r
m_csAddrTo = GET_SAFE_STRING ( lpszAddrTo );\r
- m_csSenderName = GET_SAFE_STRING ( lpszSenderName );\r
- m_csReceiverName = GET_SAFE_STRING ( lpszReceiverName );\r
+// m_csFromName = GET_SAFE_STRING ( lpszFromName );\r
+// m_csReceiverName = GET_SAFE_STRING ( lpszReceiverName );\r
m_csSubject = GET_SAFE_STRING ( lpszSubject );\r
m_csBody = GET_SAFE_STRING ( lpszBody );\r
+ \r
+ this->m_csSender = GET_SAFE_STRING(pSender);\r
+ this->m_csToList = GET_SAFE_STRING(pToList);\r
+\r
m_nSmtpSrvPort = nSmtpSrvPort;\r
+\r
if ( lpszCharSet && lstrlen(lpszCharSet) > 0 )\r
m_csCharSet.Format ( _T("\r\n\tcharset=\"%s\"\r\n"), lpszCharSet );\r
\r
if (\r
- m_csAddrFrom.GetLength() <= 0 || m_csAddrTo.GetLength() <= 0 ||\r
- m_csSenderName.GetLength() <= 0 || m_csReceiverName.GetLength() <= 0 ||\r
- m_csSubject.GetLength() <= 0 || m_csBody.GetLength() <= 0\r
+ m_csAddrFrom.GetLength() <= 0 || m_csAddrTo.GetLength() <= 0 \r
)\r
{\r
m_csLastError.Format ( _T("Parameter Error!") );\r
if ( m_StrAryAttach.GetSize() < 1 )\r
m_csMIMEContentType = _T( "text/plain");\r
\r
- if ( pStrAryCC )\r
- {\r
- m_StrAryCC.Append ( *pStrAryCC );\r
- } \r
-\r
// ´´½¨Socket\r
+ m_SendSock.Close();\r
if ( !m_SendSock.Create () )\r
{\r
+ int nResult = GetLastError();\r
m_csLastError.Format ( _T("Create socket failed!") );\r
return FALSE;\r
}\r
if ( !GetResponse( _T("220") ) ) return FALSE;\r
\r
m_bConnected = TRUE;\r
- return SendEmail();\r
+ BOOL ret= SendEmail();\r
+\r
+ m_SendSock.Close();\r
\r
+ return ret;\r
}\r
\r
\r
\r
return TRUE;\r
}\r
-\r
-// ÀûÓÃsocket·¢ËÍÊý¾Ý£¬Êý¾Ý³¤¶È²»Äܳ¬¹ý10M\r
-BOOL CHwSMTP::Send(LPCTSTR lpszData, ... )\r
+BOOL CHwSMTP::SendBuffer(char *buff,int size)\r
{\r
+ if(size<0)\r
+ size=strlen(buff);\r
if ( !m_bConnected )\r
{\r
m_csLastError.Format ( _T("Didn't connect") );\r
return FALSE;\r
}\r
\r
- TCHAR *buf = NULL;\r
- // Ñ»·¸ñʽ»¯×Ö·û´®£¬Èç¹û»º³å²»¹»Ôò½«»º³å¼Ó´óÈ»ºóÖØÊÔÒÔ±£Ö¤»º³å¹»ÓÃͬʱÓÖ²»ÀË·Ñ\r
- for ( int nBufCount = 1024; nBufCount<10*1024*1024; nBufCount += 1024 )\r
+ if ( m_SendSock.Send ( buff, size ) != size )\r
{\r
- buf = new TCHAR[nBufCount];\r
- if ( !buf )\r
- {\r
- ::AfxThrowMemoryException ();\r
- return FALSE;\r
- }\r
- memset ( buf, 0, nBufCount*sizeof(TCHAR) );\r
-\r
- va_list va;\r
- va_start (va, lpszData);\r
- int nLen = _vsnprintf_hw ((TCHAR*)buf, nBufCount-sizeof(TCHAR), lpszData, va);\r
- va_end(va);\r
- if ( nLen <= (int)(nBufCount-sizeof(TCHAR)) )\r
- break;\r
- delete[] buf; buf = NULL;\r
+ m_csLastError.Format ( _T("Socket send data failed") );\r
+ return FALSE;\r
}\r
- if ( !buf )\r
+ \r
+ return TRUE;\r
+}\r
+// ÀûÓÃsocket·¢ËÍÊý¾Ý£¬Êý¾Ý³¤¶È²»Äܳ¬¹ý10M\r
+BOOL CHwSMTP::Send(CString &str )\r
+{\r
+ if ( !m_bConnected )\r
{\r
- m_csLastError.Format ( _T("Memory too small or data too big.") );\r
+ m_csLastError.Format ( _T("Didn't connect") );\r
return FALSE;\r
}\r
\r
- CMultiByteString cbsData ( buf );\r
- delete[] buf; buf = NULL;\r
+ CMultiByteString cbsData ( str );\r
+ \r
TRACE ( _T("Send : %s\r\n"), cbsData.GetBuffer() );\r
if ( m_SendSock.Send ( cbsData.GetBuffer(), cbsData.GetLength() ) != cbsData.GetLength() )\r
{\r
gethostname ( (char*)szLocalHostName, sizeof(szLocalHostName) );\r
\r
// hello£¬ÎÕÊÖ\r
- if ( !Send ( _T("HELO %s\r\n"), GetCompatibleString(szLocalHostName,FALSE) ) )\r
+ CString str;\r
+ str.Format(_T("HELO %s\r\n"), GetCompatibleString(szLocalHostName,FALSE));\r
+ if ( !Send ( str ))\r
{\r
return FALSE;\r
}\r
return FALSE;\r
}\r
// ½áÊøÓʼþÕýÎÄ\r
- if ( !Send ( _T(".\r\n") ) ) return FALSE;\r
+ if ( !Send ( CString(_T(".\r\n") ) ) ) return FALSE;\r
if ( !GetResponse ( _T("250") ) )\r
return FALSE;\r
\r
// Í˳ö·¢ËÍ\r
if ( HANDLE_IS_VALID(m_SendSock.m_hSocket) )\r
- Send ( _T("QUIT\r\n") );\r
+ Send ( CString(_T("QUIT\r\n")) );\r
m_bConnected = FALSE;\r
\r
return bRet;\r
BOOL CHwSMTP::auth()\r
{\r
int nResponseCode = 0;\r
- if ( !Send ( _T("auth login\r\n") ) ) return FALSE;\r
+ if ( !Send ( CString(_T("auth login\r\n")) ) ) return FALSE;\r
if ( !GetResponse ( _T("334"), &nResponseCode ) ) return FALSE;\r
if ( nResponseCode != 334 ) // ²»ÐèÒªÑéÖ¤Óû§ÃûºÍÃÜÂë\r
return TRUE;\r
CString csBase64_UserName = GetCompatibleString ( Base64Encode.Encode ( cbsUserName.GetBuffer(), cbsUserName.GetLength() ).GetBuffer(0), FALSE );\r
CString csBase64_Passwd = GetCompatibleString ( Base64Encode.Encode ( cbsPasswd.GetBuffer(), cbsPasswd.GetLength() ).GetBuffer(0), FALSE );\r
\r
- if ( !Send ( _T("%s\r\n"), csBase64_UserName ) ) return FALSE;\r
+ CString str;\r
+ str.Format( _T("%s\r\n"), csBase64_UserName );\r
+ if ( !Send ( str ) ) \r
+ return FALSE;\r
+\r
if ( !GetResponse ( _T("334") ) )\r
{\r
m_csLastError.Format ( _T("Authentication UserName failed") );\r
return FALSE;\r
}\r
+ \r
+ str.Format(_T("%s\r\n"), csBase64_Passwd );\r
+ if ( !Send ( str ) ) \r
+ return FALSE;\r
\r
- if ( !Send ( _T("%s\r\n"), csBase64_Passwd ) ) return FALSE;\r
if ( !GetResponse ( _T("235") ) )\r
{\r
m_csLastError.Format ( _T("Authentication Password failed") );\r
\r
BOOL CHwSMTP::SendHead()\r
{\r
- if ( !Send ( _T("MAIL From: <%s>\r\n"), m_csAddrFrom ) ) return FALSE;\r
- if ( !GetResponse ( _T("250") ) ) return FALSE;\r
- if ( !Send ( _T("RCPT TO: <%s>\r\n"), m_csAddrTo ) ) return FALSE;\r
+ CString str;\r
+ CString name,addr;\r
+ GetNameAddress(m_csAddrFrom,name,addr);\r
+\r
+ str.Format( _T("MAIL From: <%s>\r\n"), addr );\r
+ if ( !Send ( str ) ) return FALSE;\r
+\r
if ( !GetResponse ( _T("250") ) ) return FALSE;\r
+ \r
+ int start=0;\r
+ while(start>=0)\r
+ {\r
+ CString one=m_csAddrTo.Tokenize(_T(";"),start);\r
+ one=one.Trim();\r
+ if(one.IsEmpty())\r
+ continue;\r
\r
+ \r
+ GetNameAddress(one,name,addr);\r
+ \r
+ str.Format(_T("RCPT TO: <%s>\r\n"), addr );\r
+ if ( !Send ( str ) ) return FALSE;\r
+ if ( !GetResponse ( _T("250") ) ) return FALSE;\r
+ }\r
+\r
+#if 0\r
for ( int i=0; i<m_StrAryCC.GetSize(); i++ )\r
{\r
- if ( !Send ( _T("RCPT TO: <%s>\r\n"), m_StrAryCC.GetAt(i) ) ) return FALSE;\r
+ str.Format(_T("RCPT TO: <%s>\r\n"), m_StrAryCC.GetAt(i) );\r
+ if ( !Send ( str ) ) return FALSE;\r
if ( !GetResponse ( _T("250") ) ) return FALSE;\r
}\r
- if ( !Send ( _T("DATA\r\n") ) ) return FALSE;\r
- if ( !GetResponse ( _T("354") ) ) return FALSE; \r
+#endif\r
+\r
+ if ( !Send ( CString(_T("DATA\r\n") ) ) ) return FALSE;\r
+ if ( !GetResponse ( CString(_T("354") )) ) return FALSE; \r
\r
return TRUE;\r
}\r
csSubject += GetCompatibleString(FormatDateTime (tNow, _T("%a, %d %b %y %H:%M:%S %Z")).GetBuffer(0),FALSE);\r
}\r
csSubject += _T("\r\n");\r
- csSubject += FormatString ( _T("From: %s\r\nTo: %s\r\n"), m_csSenderName, m_csReceiverName );\r
+ csSubject += FormatString ( _T("From: %s\r\n"), this->m_csAddrFrom);\r
+ \r
+ csSubject += FormatString ( _T("CC: %s\r\n"), this->m_StrCC);\r
+ \r
+ if(m_csSender.IsEmpty())\r
+ m_csSender = this->m_csAddrFrom;\r
+ \r
+ csSubject += FormatString ( _T("Sender: %s\r\n"), this->m_csSender);\r
+ \r
+ if(this->m_csToList.IsEmpty())\r
+ m_csToList = m_csReceiverName;\r
+ \r
+ csSubject += FormatString ( _T("To: %s\r\n"), this->m_csToList);\r
+\r
+ CString m_csToList;\r
+\r
csSubject += FormatString ( _T("Subject: %s\r\n"), m_csSubject );\r
- csSubject += FormatString ( _T("X-Mailer: chrys\r\nMIME-Version: 1.0\r\nContent-Type: %s; %s boundary=%s\r\n\r\n") , \r
+ csSubject += FormatString ( _T("X-Mailer: TortoiseGit\r\nMIME-Version: 1.0\r\nContent-Type: %s; %s boundary=%s\r\n\r\n") , \r
m_csMIMEContentType, m_csCharSet, m_csPartBoundary );\r
\r
return Send ( csSubject );\r
csBody += csTemp;\r
}\r
\r
- csTemp.Format ( _T("%s\r\n"), m_csBody );\r
- csBody += csTemp;\r
-\r
- if ( m_StrAryAttach.GetSize() > 0 )\r
- {\r
- csTemp.Format ( _T("--%s\r\n"), m_csPartBoundary );\r
- csBody += csTemp;\r
- }\r
+ //csTemp.Format ( _T("%s\r\n"), m_csBody );\r
+ csBody += m_csBody;\r
+ csBody += _T("\r\n");\r
\r
return Send ( csBody );\r
}\r
CString csShortFileName = csTemp.GetBuffer(0) + csTemp.ReverseFind ( '\\' );\r
csShortFileName.TrimLeft ( _T("\\") );\r
\r
+ csTemp.Format ( _T("--%s\r\n"), m_csPartBoundary );\r
+ csAttach += csTemp;\r
+\r
csTemp.Format ( _T("Content-Type: application/octet-stream; file=%s\r\n"), csShortFileName );\r
csAttach += csTemp;\r
\r
return FALSE;\r
}\r
\r
+ if(!Send ( csAttach ))\r
+ return FALSE;\r
+\r
CFile file;\r
+ CStringA filedata;\r
try\r
{\r
if ( !file.Open ( lpszFileName, CFile::modeRead ) )\r
}\r
UINT nFileLen = file.Read ( pBuf, dwFileSize );\r
CBase64 Base64Encode;\r
- csTemp = Base64Encode.Encode ( pBuf, nFileLen );\r
- csAttach += csTemp;\r
- csAttach += _T("\r\n\r\n");\r
+ filedata = Base64Encode.Encode ( pBuf, nFileLen );\r
+ filedata += _T("\r\n\r\n");\r
}\r
catch ( CFileException e )\r
{\r
return FALSE;\r
}\r
\r
- csTemp.Format ( _T("--%s\r\n"), m_csPartBoundary );\r
- csAttach += csTemp;\r
+ if(!SendBuffer( filedata.GetBuffer() ))\r
+ return FALSE;\r
+\r
\r
delete[] pBuf;\r
\r
- return Send ( csAttach );\r
+ return TRUE;\r
+ //return Send ( csAttach );\r
}\r
\r
CString CHwSMTP::GetLastErrorText()\r
pEMailObject->m_bMustAuth,\r
pEMailObject->m_csAddrFrom,\r
pEMailObject->m_csAddrTo,\r
- pEMailObject->m_csSenderName,\r
- pEMailObject->m_csReceiverName,\r
pEMailObject->m_csSubject,\r
pEMailObject->m_csBody,\r
pEMailObject->m_csCharSet,\r
&pEMailObject->m_StrAryAttach,\r
- &pEMailObject->m_StrAryCC,\r
- pEMailObject->m_nSmtpSrvPort\r
+ pEMailObject->m_StrCC,\r
+ pEMailObject->m_nSmtpSrvPort,\r
+ pEMailObject->m_csSender\r
);\r
if ( !bRet)\r
{\r
BOOL bMustAuth,\r
LPCTSTR lpszAddrFrom,\r
LPCTSTR lpszAddrTo,\r
- LPCTSTR lpszSenderName,\r
+ LPCTSTR lpszFromName,\r
LPCTSTR lpszReceiverName,\r
LPCTSTR lpszSubject,\r
LPCTSTR lpszBody,\r
LPCTSTR lpszCharSet/*=NULL*/,\r
CStringArray *pStrAryAttach/*=NULL*/,\r
- CStringArray *pStrAryCC/*=NULL*/,\r
- UINT nSmtpSrvPort/*=25*/\r
+ LPCTSTR pStrAryCC/*=NULL*/,\r
+ UINT nSmtpSrvPort/*=25*/,\r
+ LPCTSTR lpszSender,\r
+ LPCTSTR lpszToList\r
)\r
{\r
if ( !lpszSmtpSrvHost || lstrlen(lpszSmtpSrvHost) < 1 ||\r
bMustAuth,\r
lpszAddrFrom,\r
lpszAddrTo,\r
- lpszSenderName,\r
+ lpszFromName,\r
lpszReceiverName,\r
lpszSubject,\r
lpszBody,\r
lpszCharSet,\r
pStrAryAttach,\r
pStrAryCC,\r
- nSmtpSrvPort\r
+ nSmtpSrvPort,\r
+ lpszSender,\r
+ lpszToList\r
);\r
if ( !pEMailObject ) return FALSE;\r
\r