OSDN Git Service

Complete Send mail coding and mail send have some problem.
authorFrank Li <lznuaa@gmail.com>
Wed, 15 Apr 2009 14:24:51 +0000 (22:24 +0800)
committerFrank Li <lznuaa@gmail.com>
Wed, 15 Apr 2009 14:24:51 +0000 (22:24 +0800)
src/Resources/TortoiseProcENG.rc
src/TortoiseProc/AppUtils.h
src/TortoiseProc/Commands/SendMailCommand.cpp
src/TortoiseProc/Patch.cpp
src/TortoiseProc/Patch.h
src/TortoiseProc/SVNProgressDlg.cpp
src/TortoiseProc/SVNProgressDlg.h
src/TortoiseProc/SendMailDlg.cpp
src/TortoiseProc/resource.h
src/Utils/CSmtp.cpp
src/Utils/Utils.vcproj

index 234338e..833d395 100644 (file)
Binary files a/src/Resources/TortoiseProcENG.rc and b/src/Resources/TortoiseProcENG.rc differ
index 1c64e2b..9df5e58 100644 (file)
@@ -193,7 +193,7 @@ public:
 \r
        static CString GetClipboardLink();\r
        static CString ChooseRepository(CString *path);\r
-\r
+       \r
 private:\r
        static CString PickDiffTool(const CTGitPath& file1, const CTGitPath& file2);\r
        static bool GetMimeType(const CTGitPath& file, CString& mimetype);\r
index 2ac80c9..baeb3f4 100644 (file)
@@ -1,6 +1,7 @@
 #include "StdAfx.h"\r
 #include "SendMailCommand.h"\r
 #include "SendMailDlg.h"\r
+#include "SVNProgressDlg.h"\r
 \r
 bool SendMailCommand::Execute()\r
 {\r
@@ -10,6 +11,33 @@ bool SendMailCommand::Execute()
        \r
        if(dlg.DoModal()==IDOK)\r
        {\r
+               if(dlg.m_PathList.GetCount() == 0)\r
+                       return FALSE;\r
+       \r
+               CGitProgressDlg progDlg;\r
+               \r
+               theApp.m_pMainWnd = &progDlg;\r
+               progDlg.SetCommand(CGitProgressDlg::GitProgress_SendMail);\r
+                               \r
+               if (parser.HasVal(_T("closeonend")))\r
+                               progDlg.SetAutoClose(parser.GetLongVal(_T("closeonend")));\r
+               \r
+               progDlg.SetPathList(dlg.m_PathList);\r
+                               //ProjectProperties props;\r
+                               //props.ReadPropsPathList(dlg.m_pathList);\r
+                               //progDlg.SetProjectProperties(props);\r
+               progDlg.SetItemCount(dlg.m_PathList.GetCount());\r
+\r
+               DWORD flags =0;\r
+               if(dlg.m_bAttachment)\r
+                       flags |= SENDMAIL_ATTACHMENT;\r
+               if(dlg.m_bCombine)\r
+                       flags |= SENDMAIL_COMBINED;\r
+\r
+               progDlg.SetSendMailOption(dlg.m_To,dlg.m_CC,flags);\r
+               \r
+               progDlg.DoModal();              \r
+\r
                return true;\r
        }\r
        return false;\r
index c5622c4..7ba59eb 100644 (file)
@@ -1,5 +1,8 @@
 #include "StdAfx.h"\r
 #include "Patch.h"\r
+#include "csmtp.h"\r
+#include "registry.h"\r
+#include "unicodeutils.h"\r
 \r
 CPatch::CPatch()\r
 {\r
@@ -12,6 +15,55 @@ CPatch::~CPatch()
 \r
 }\r
 \r
+int CPatch::Send(CString &pathfile,CString &TO,CString &CC,bool bAttachment)\r
+{\r
+       CSmtp mail;\r
+       \r
+       if(mail.GetLastError() != CSMTP_NO_ERROR )\r
+       {\r
+               return -1;\r
+       }\r
+       \r
+       if(this->Parser(pathfile)       )\r
+               return -1;\r
+\r
+\r
+       CRegString server(REG_SMTP_SERVER);\r
+       CRegDWORD  port(REG_SMTP_PORT,25);\r
+       CRegDWORD  bAuth(REG_SMTP_ISAUTH);\r
+       CRegDWORD  user(REG_SMTP_USER);\r
+       CRegDWORD  password(REG_SMTP_PASSWORD);\r
+\r
+       mail.SetSMTPServer(CUnicodeUtils::GetUTF8(server),port);\r
+\r
+       AddRecipient(mail,TO,false);\r
+       AddRecipient(mail,CC,true);\r
+\r
+       if( bAttachment )\r
+               mail.AddAttachment(CUnicodeUtils::GetUTF8(pathfile));\r
+\r
+       CString name,address;\r
+       GetNameAddress(this->m_Author,name,address);\r
+       mail.SetSenderName(CUnicodeUtils::GetUTF8(name));\r
+       mail.SetSenderMail(CUnicodeUtils::GetUTF8(address));\r
+\r
+       mail.SetXPriority(XPRIORITY_NORMAL);\r
+       mail.SetXMailer("The Bat! (v3.02) Professional");\r
+\r
+       mail.SetSubject(CUnicodeUtils::GetUTF8(this->m_Subject));\r
+\r
+       mail.SetMessageBody((char*)&this->m_Body[0]);\r
+\r
+       if(bAuth)\r
+       {\r
+               mail.SetLogin(CUnicodeUtils::GetUTF8((CString&)user));\r
+               mail.SetPassword(CUnicodeUtils::GetUTF8((CString&)password));\r
+       }\r
+\r
+       return !mail.Send();\r
+\r
+}\r
+\r
 int CPatch::Parser(CString &pathfile)\r
 {\r
        CString str;\r
@@ -36,7 +88,57 @@ int CPatch::Parser(CString &pathfile)
                i++;            \r
        }\r
 \r
+       m_Body.resize(PatchFile.GetLength() - PatchFile.GetPosition());\r
+       PatchFile.Read(&m_Body.at(0),PatchFile.GetLength() - PatchFile.GetPosition());\r
 \r
        PatchFile.Close();\r
 \r
+}\r
+\r
+void CPatch::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
+void CPatch::AddRecipient(CSmtp &mail, CString &tolist, bool isCC)\r
+{\r
+       int pos=0;\r
+       while(pos>=0)\r
+       {\r
+               CString one=tolist.Tokenize(_T(";"),pos);\r
+               int start=one.Find(_T('<'));\r
+               int end = one.Find(_T('>'));\r
+               CStringA name;\r
+               CStringA address;\r
+               if( start>=0 && end >=0)\r
+               {\r
+                       name=CUnicodeUtils::GetUTF8(one.Left(start));\r
+                       address=CUnicodeUtils::GetUTF8(one.Mid(start+1,end-start-1));\r
+                       if(address.IsEmpty())\r
+                               continue;\r
+                       if(isCC)\r
+                               mail.AddCCRecipient(address,name);\r
+                       else\r
+                               mail.AddRecipient(address,name);\r
+\r
+               }else\r
+               {\r
+                       if(one.IsEmpty())\r
+                               continue;\r
+                       if(isCC)\r
+                               mail.AddCCRecipient(CUnicodeUtils::GetUTF8(one));\r
+                       else\r
+                               mail.AddRecipient(CUnicodeUtils::GetUTF8(one));\r
+               }\r
+       }\r
 }
\ No newline at end of file
index 49ad7db..46d2480 100644 (file)
@@ -1,17 +1,27 @@
 #pragma once\r
 \r
+#include "csmtp.h"\r
+\r
+#define REG_SMTP_SERVER _T("Software\\TortoiseGit\\EMAIL\\SMTPSERVER")\r
+#define REG_SMTP_PORT _T("Software\\TortoiseGit\\EMAIL\\PORT")\r
+#define REG_SMTP_ISAUTH _T("Software\\TortoiseGit\\EMAIL\\ISAUTH")\r
+#define REG_SMTP_USER _T("Software\\TortoiseGit\\EMAIL\\USER")\r
+#define REG_SMTP_PASSWORD _T("Software\\TortoiseGit\\EMAIL\\PASSWORD")\r
+\r
 class CPatch\r
 {\r
-\r
-       \r
+protected:\r
+       void AddRecipient(CSmtp &mail, CString &tolist, bool isCC= FALSE);\r
+       void GetNameAddress(CString &in, CString &name,CString &address);\r
 public:\r
        CPatch();\r
        ~CPatch(void);\r
        int Parser(CString &pathfile);\r
+       int Send(CString &pathfile,CString &To, CString &CC,bool bAttachment);\r
 \r
        CString m_Author;\r
        CString m_Date;\r
        CString m_Subject;\r
        CString m_PathFile;\r
-       CString m_Body;\r
+       std::vector<BYTE> m_Body;\r
 };\r
index 1db965e..2d5a888 100644 (file)
@@ -40,6 +40,7 @@
 #include "ShellUpdater.h"\r
 #include "IconMenu.h"\r
 #include "BugTraqAssociations.h"\r
+#include "patch.h"\r
 \r
 static UINT WM_GITPROGRESS = RegisterWindowMessage(_T("TORTOISEGIT_GITPROGRESS_MSG"));\r
 \r
@@ -267,6 +268,10 @@ BOOL CGitProgressDlg::Notify(const CTGitPath& path, git_wc_notify_action_t actio
                        data->color = m_Colors.GetColor(CColors::Added);\r
        //      }\r
                break;\r
+       case git_wc_notify_sendmail:\r
+               data->sActionColumnText.LoadString(IDS_SVNACTION_SENDMAIL);\r
+               data->color = m_Colors.GetColor(CColors::Modified);\r
+               break;\r
        \r
        case git_wc_notify_resolved:\r
                data->sActionColumnText.LoadString(IDS_SVNACTION_RESOLVE);\r
@@ -896,6 +901,9 @@ UINT CGitProgressDlg::ProgressThread()
        case GitProgress_Update:\r
                bSuccess = CmdUpdate(sWindowTitle, localoperation);\r
                break;\r
+       case GitProgress_SendMail:\r
+               bSuccess = CmdSendMail(sWindowTitle, localoperation);\r
+               break;\r
        }\r
        if (!bSuccess)\r
                temp.LoadString(IDS_PROGRS_TITLEFAILED);\r
@@ -2671,3 +2679,20 @@ CString CGitProgressDlg::GetPathFromColumnText(const CString& sColumnText)
        }\r
        return sPath;\r
 }\r
+\r
+bool CGitProgressDlg::CmdSendMail(CString& sWindowTitle, bool& /*localoperation*/)\r
+{\r
+       sWindowTitle.LoadString(IDS_PROGRS_TITLE_SENDMAIL);\r
+       SetWindowText(sWindowTitle);\r
+       //SetBackgroundImage(IDI_ADD_BKG);\r
+       ReportCmd(CString(MAKEINTRESOURCE(IDS_PROGRS_CMD_SENDMAIL)));\r
+\r
+       for(int i=0;i<m_targetPathList.GetCount();i++)\r
+       {\r
+               CPatch patch;\r
+               patch.Send((CString&)m_targetPathList[i].GetWinPathString(),this->m_SendMailTO,\r
+                                 this->m_SendMailCC,this->m_SendMailFlags&SENDMAIL_ATTACHMENT);\r
+               Notify(m_targetPathList[i],git_wc_notify_sendmail);\r
+       }\r
+       return true;\r
+}
\ No newline at end of file
index c6a8e65..7d7d102 100644 (file)
@@ -69,9 +69,15 @@ typedef enum
 typedef enum\r
 {\r
        git_wc_notify_add,\r
+       git_wc_notify_sendmail,\r
        git_wc_notify_resolved\r
 \r
 }git_wc_notify_action_t;\r
+typedef enum\r
+{\r
+       SENDMAIL_ATTACHMENT=0x1,\r
+       SENDMAIL_COMBINED =0x2\r
+};\r
 /**\r
  * \ingroup TortoiseProc\r
  * Handles different Subversion commands and shows the notify messages\r
@@ -99,6 +105,7 @@ public:
                GitProgress_Switch,\r
                GitProgress_Unlock,\r
                GitProgress_Update,\r
+               GitProgress_SendMail,\r
        } Command;\r
 \r
 \r
@@ -122,6 +129,7 @@ public:
 //     void SetRevisionEnd(const GitRev& rev) {m_RevisionEnd = rev;}\r
        \r
        void SetDiffOptions(const CString& opts) {m_diffoptions = opts;}\r
+       void SetSendMailOption(CString &TO, CString &CC,DWORD flags){m_SendMailTO=TO; m_SendMailCC=CC;this->m_SendMailFlags = flags;}\r
        void SetDepth(git_depth_t depth = git_depth_unknown) {m_depth = depth;}\r
        void SetPegRevision(GitRev pegrev = GitRev()) {m_pegRev = pegrev;}\r
        void SetProjectProperties(ProjectProperties props) {m_ProjectProperties = props;}\r
@@ -273,6 +281,7 @@ private:
        bool            CmdSwitch(CString& sWindowTitle, bool& localoperation);\r
        bool            CmdUnlock(CString& sWindowTitle, bool& localoperation);\r
        bool            CmdUpdate(CString& sWindowTitle, bool& localoperation);\r
+       bool            CmdSendMail(CString& sWindowTitle, bool& localoperation);\r
 \r
 private:\r
        typedef std::map<CStringA, git_revnum_t> StringRevMap;\r
@@ -334,6 +343,10 @@ private:
 \r
        bool                                    m_AlwaysConflicted;\r
 \r
+       DWORD                                   m_SendMailFlags;\r
+       CString                                 m_SendMailTO;\r
+       CString                                 m_SendMailCC;\r
+       \r
 ///    CComPtr<IBugTraqProvider> m_BugTraqProvider;\r
 \r
        // some strings different methods can use\r
index dee06f9..f1fbe3b 100644 (file)
@@ -7,6 +7,7 @@
 #include "MessageBox.h"\r
 #include "commonresource.h"\r
 #include "AppUtils.h"\r
+\r
 // CSendMailDlg dialog\r
 \r
 IMPLEMENT_DYNAMIC(CSendMailDlg, CResizableStandAloneDialog)\r
index 2b3c928..d474ad0 100644 (file)
Binary files a/src/TortoiseProc/resource.h and b/src/TortoiseProc/resource.h differ
index 2a8b8b1..6ab9111 100644 (file)
@@ -590,8 +590,8 @@ int CSmtp::SmtpXYZdigits()
 bool CSmtp::FormatHeader(char* header)\r
 {\r
        int i,s = 0;\r
-       TCHAR szDate[500];\r
-       TCHAR sztTime[500];\r
+       char szDate[500];\r
+       char sztTime[500];\r
        char *to = NULL;\r
        char *cc = NULL;\r
        char *bcc = NULL;\r
@@ -677,8 +677,8 @@ bool CSmtp::FormatHeader(char* header)
        // Date: <SP> <dd> <SP> <mon> <SP> <yy> <SP> <hh> ":" <mm> ":" <ss> <SP> <zone> <CRLF>\r
        SYSTEMTIME st={0};\r
        ::GetSystemTime(&st);\r
-       ::GetDateFormat(MAKELCID(0x0409,SORT_DEFAULT),0,&st,"ddd\',\' dd MMM yyyy",szDate,sizeof(szDate));\r
-       ::GetTimeFormat(MAKELCID(0x0409,SORT_DEFAULT),TIME_FORCE24HOURFORMAT,&st,"HH\':\'mm\':\'ss",sztTime,sizeof(sztTime));\r
+       ::GetDateFormatA(MAKELCID(0x0409,SORT_DEFAULT),0,&st,"ddd\',\' dd MMM yyyy",szDate,sizeof(szDate));\r
+       ::GetTimeFormatA(MAKELCID(0x0409,SORT_DEFAULT),TIME_FORCE24HOURFORMAT,&st,"HH\':\'mm\':\'ss",sztTime,sizeof(sztTime));\r
        sprintf(header,"Date: %s %s\r\n", szDate, sztTime); \r
        \r
        // From: <SP> <sender>  <SP> "<" <sender-email> ">" <CRLF>\r
index 789e48b..341e021 100644 (file)
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\base64.cpp"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\base64.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath=".\BugTraqAssociations.cpp"\r
                                >\r
                        </File>\r
                                >\r
                        </File>\r
                        <File\r
+                               RelativePath=".\CSmtp.cpp"\r
+                               >\r
+                               <FileConfiguration\r
+                                       Name="Debug|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Debug|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|Win32"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                               <FileConfiguration\r
+                                       Name="Release|x64"\r
+                                       >\r
+                                       <Tool\r
+                                               Name="VCCLCompilerTool"\r
+                                               UsePrecompiledHeader="0"\r
+                                       />\r
+                               </FileConfiguration>\r
+                       </File>\r
+                       <File\r
+                               RelativePath=".\CSmtp.h"\r
+                               >\r
+                       </File>\r
+                       <File\r
                                RelativePath=".\DebugHelpers.cpp"\r
                                >\r
                        </File>\r