OSDN Git Service

Send Attachment successfully
[tortoisegit/TortoiseGitJp.git] / src / Utils / HwSMTP.cpp
index 84d0b20..c628191 100644 (file)
@@ -89,7 +89,7 @@ CHwSMTP::CHwSMTP () :
        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
 \r
 CHwSMTP::~CHwSMTP()\r
@@ -213,44 +213,35 @@ BOOL CHwSMTP::GetResponse ( LPCTSTR lpszVerifyCode, int *pnCode/*=NULL*/)
 \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
@@ -268,7 +259,9 @@ BOOL CHwSMTP::SendEmail()
        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
@@ -302,13 +295,13 @@ BOOL CHwSMTP::SendEmail()
                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
@@ -317,7 +310,7 @@ BOOL CHwSMTP::SendEmail()
 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
@@ -327,14 +320,21 @@ BOOL CHwSMTP::auth()
        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
@@ -346,18 +346,24 @@ BOOL CHwSMTP::auth()
 \r
 BOOL CHwSMTP::SendHead()\r
 {\r
-       if ( !Send ( _T("MAIL From: <%s>\r\n"), m_csAddrFrom ) ) return FALSE;\r
+       CString str;\r
+       str.Format( _T("MAIL From: <%s>\r\n"), m_csAddrFrom );\r
+       if ( !Send ( str  ) ) return FALSE;\r
+\r
        if ( !GetResponse ( _T("250") ) ) return FALSE;\r
-       if ( !Send ( _T("RCPT TO: <%s>\r\n"), m_csAddrTo ) ) return FALSE;\r
+       \r
+       str.Format(_T("RCPT TO: <%s>\r\n"), m_csAddrTo );\r
+       if ( !Send ( str ) ) return FALSE;\r
        if ( !GetResponse ( _T("250") ) ) return FALSE;\r
 \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
+       if ( !Send ( CString(_T("DATA\r\n") ) ) ) return FALSE;\r
+       if ( !GetResponse ( CString(_T("354") )) ) return FALSE;        \r
 \r
        return TRUE;\r
 }\r
@@ -374,7 +380,7 @@ BOOL CHwSMTP::SendSubject()
        csSubject += _T("\r\n");\r
        csSubject += FormatString ( _T("From: %s\r\nTo: %s\r\n"), m_csSenderName, m_csReceiverName );\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
@@ -397,14 +403,9 @@ BOOL CHwSMTP::SendBody()
                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
@@ -432,6 +433,9 @@ BOOL CHwSMTP::SendOnAttach(LPCTSTR lpszFileName)
        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
@@ -454,7 +458,11 @@ BOOL CHwSMTP::SendOnAttach(LPCTSTR lpszFileName)
                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
@@ -464,9 +472,8 @@ BOOL CHwSMTP::SendOnAttach(LPCTSTR lpszFileName)
                }\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
@@ -476,12 +483,14 @@ BOOL CHwSMTP::SendOnAttach(LPCTSTR lpszFileName)
                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