PageMailSmtp.cpp
上传用户:geanq888
上传日期:2007-01-03
资源大小:316k
文件大小:11k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // PageMailSmtp.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "netmanager.h"
  5. #include "PageMailSmtp.h"
  6. #include "GlobalsExtern.h"
  7. #include "SMTP.h"
  8. #include "PageMailConfig.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CPageMailSmtp property page
  16. IMPLEMENT_DYNCREATE(CPageMailSmtp, CPropertyPage)
  17. CPageMailSmtp::CPageMailSmtp() : CPropertyPage(CPageMailSmtp::IDD)
  18. {
  19. //{{AFX_DATA_INIT(CPageMailSmtp)
  20. m_sFrom = _T("");
  21. m_sSubject = _T("");
  22. m_sText = _T("");
  23. m_sTo = _T("");
  24. m_bClear = FALSE;
  25. m_bWithDate = FALSE;
  26. m_bWithMailer = FALSE;
  27. m_bWithSignature = FALSE;
  28. //}}AFX_DATA_INIT
  29. }
  30. CPageMailSmtp::~CPageMailSmtp()
  31. {
  32. }
  33. void CPageMailSmtp::DoDataExchange(CDataExchange* pDX)
  34. {
  35. CPropertyPage::DoDataExchange(pDX);
  36. //{{AFX_DATA_MAP(CPageMailSmtp)
  37. DDX_Control(pDX, IDC_ATTACHMENTS, m_Attachments);
  38. DDX_Control(pDX, IDC_NUMBER_OF_CHARS, m_NumberOfChars);
  39. DDX_Control(pDX, IDC_TEXT, m_Text);
  40. DDX_CBString(pDX, IDC_FROM, m_sFrom);
  41. DDV_MaxChars(pDX, m_sFrom, 256);
  42. DDX_CBString(pDX, IDC_SUBJECT, m_sSubject);
  43. DDV_MaxChars(pDX, m_sSubject, 256);
  44. DDX_Text(pDX, IDC_TEXT, m_sText);
  45. DDV_MaxChars(pDX, m_sText, 64000);
  46. DDX_CBString(pDX, IDC_TO, m_sTo);
  47. DDV_MaxChars(pDX, m_sTo, 256);
  48. DDX_Check(pDX, IDC_CLEAR, m_bClear);
  49. DDX_Check(pDX, IDC_WITHDATE, m_bWithDate);
  50. DDX_Check(pDX, IDC_WITHMAILER, m_bWithMailer);
  51. DDX_Check(pDX, IDC_WITHSIGNATURE, m_bWithSignature);
  52. //}}AFX_DATA_MAP
  53. }
  54. BEGIN_MESSAGE_MAP(CPageMailSmtp, CPropertyPage)
  55. //{{AFX_MSG_MAP(CPageMailSmtp)
  56. ON_BN_CLICKED(IDB_SEND, OnSend)
  57. ON_BN_CLICKED(IDB_SETTINGS, OnSettings)
  58. ON_EN_CHANGE(IDC_TEXT, OnChangeText)
  59. ON_BN_CLICKED(IDC_WITHSIGNATURE, OnWithSignature)
  60. ON_BN_CLICKED(IDB_ATTACHMENTS, OnAttachments)
  61. ON_CBN_SETFOCUS(IDC_ATTACHMENTS, OnSetfocusAttachments)
  62. ON_CBN_EDITUPDATE(IDC_ATTACHMENTS, OnEditupdateAttachments)
  63. ON_CBN_SELCHANGE(IDC_ATTACHMENTS, OnSelchangeAttachments)
  64. //}}AFX_MSG_MAP
  65. END_MESSAGE_MAP()
  66. /////////////////////////////////////////////////////////////////////////////
  67. // CPageMailSmtp message handlers
  68. BOOL CPageMailSmtp::OnInitDialog() 
  69. {
  70. CPropertyPage::OnInitDialog();
  71.   m_ToolTip.Create(this);
  72.   m_ToolTip.Activate(TRUE);
  73.   CWnd* pWnd = GetWindow(GW_CHILD);
  74.   while(pWnd)
  75.   {
  76.     int nID = pWnd->GetDlgCtrlID();
  77.     if (nID != -1)
  78.       m_ToolTip.AddTool(pWnd, pWnd->GetDlgCtrlID());
  79.     pWnd = pWnd->GetWindow(GW_HWNDNEXT);
  80.   }
  81.   m_Subject.SubclassDlgItem(IDC_SUBJECT, this);
  82.   m_From.SubclassDlgItem(IDC_FROM, this);
  83.   m_To.SubclassDlgItem(IDC_TO, this);
  84.   m_DelCurrent.SubclassDlgItem(IDB_DELCURRENT, this);
  85.   OnChangeText();
  86. return TRUE;  // return TRUE unless you set the focus to a control
  87.               // EXCEPTION: OCX Property Pages should return FALSE
  88. }
  89. /////////////////////////////////////////////////////////////////////////////
  90. void CPageMailSmtp::OnSend() 
  91. {
  92.   UpdateData();
  93.   g_AnimateWait->Play(0, -1, -1);
  94.   CString sFromName;
  95.   CString sFromEmail;
  96.   CString sToName;
  97.   CString sToEmail;
  98.   int nFrom = m_sFrom.Find(_T('<'));
  99.   if(nFrom != -1)
  100.   {
  101.     sFromName = m_sFrom.Left(nFrom);
  102.     sFromEmail = m_sFrom.Right(m_sFrom.GetLength() - nFrom);
  103.     sFromEmail = sFromEmail.Mid(1, sFromEmail.GetLength() - 2);
  104.   }
  105.   else
  106.   {
  107.     sFromEmail = m_sFrom;
  108.   }
  109.   int nTo = m_sTo.Find(_T('<'));
  110.   if(nTo != -1)
  111.   {
  112.     sToName = m_sTo.Left(nTo);
  113.     sToEmail = m_sTo.Right(m_sTo.GetLength() - nTo);
  114.     sToEmail = sToEmail.Mid(1, sToEmail.GetLength() - 2);
  115.   }
  116.   else
  117.   {
  118.     sToEmail = m_sTo;
  119.   }
  120.   CSMTPConnection Smtp;
  121.   if(!Smtp.Connect(m_sServer))
  122.   {
  123.     DWORD dwError = ::GetLastError();
  124.     CString sResponse = Smtp.GetLastCommandResponse();
  125.     g_WriteToOutput(TRUE, "[Mail] Failed to connect to SMTP server" + sResponse);
  126.     return;
  127.   }
  128.   CSMTPMessage Message(m_sXMailer, m_bWithDate, m_bWithMailer);
  129.   CSMTPAddress From(sFromName, sFromEmail);
  130.   Message.m_From = From;
  131.   CSMTPAddress To(sToName, sToEmail);
  132.   Message.AddRecipient(To);
  133.   Message.m_sSubject = m_sSubject;
  134.   Message.AddBody(m_sText);
  135. //  Message.m_ReplyTo = CSMTPAddress(_T(""), _T("aa@aaa.com"));
  136.   CArray<CSMTPAttachment*, CSMTPAttachment*&> apAttachments;
  137.   CString sAttachment;
  138.   CSMTPAttachment* pAttachment;
  139.   int nAttachments = m_Attachments.GetCount();
  140.   if(nAttachments != CB_ERR && nAttachments != 0)
  141.   {
  142.     for(int i = 0; i < nAttachments; i++)
  143.     {
  144.       pAttachment = new CSMTPAttachment;
  145.       apAttachments.Add(pAttachment);
  146.       m_Attachments.GetLBText(i, sAttachment);
  147.       pAttachment->Attach(sAttachment);
  148.       Message.AddAttachment(pAttachment);
  149.     }
  150.   }
  151.   if(!Smtp.SendMessage(Message))
  152.   {
  153.     DWORD dwError = ::GetLastError();
  154.     CString sResponse = Smtp.GetLastCommandResponse();
  155.     g_WriteToOutput(TRUE, "[Mail] Failed to send the SMTP message" + sResponse);
  156.     return;
  157.   }
  158.   else
  159.   {
  160.     g_WriteToHistory(TRUE, "[Mail] Sent mail to " + m_sTo);
  161.     if(m_bClear)
  162.     {
  163.       m_Text.SetSel(0, -1);
  164.       m_Text.Clear();
  165.       m_To.SetEditSel(0, -1);
  166.       m_To.Clear();
  167.       m_Subject.SetEditSel(0, -1);
  168.       m_Subject.Clear();
  169.       m_Attachments.ResetContent();
  170.     }
  171.   }
  172.   Smtp.Disconnect();
  173.   nAttachments = apAttachments.GetSize();
  174.   for(int i = 0; i < nAttachments; i++)
  175.     delete apAttachments.GetAt(i);
  176.   apAttachments.RemoveAll();
  177. }
  178. /////////////////////////////////////////////////////////////////////////////
  179. void CPageMailSmtp::OnAttachments() 
  180. {
  181.   CFileDialog BrowseDialog(TRUE);
  182.   if(BrowseDialog.DoModal() == IDOK)
  183.   {
  184.     CString sPath = BrowseDialog.GetPathName();
  185.     if(!sPath.IsEmpty())
  186.     {
  187.       m_Attachments.EnableWindow(TRUE);
  188.       m_Attachments.SetWindowText(sPath);
  189.       m_Attachments.AddString(sPath);
  190.     }
  191.   }
  192. }
  193. /////////////////////////////////////////////////////////////////////////////
  194. void CPageMailSmtp::OnSettings()
  195. {
  196.   CPageMailConfig MailConfig;
  197.   MailConfig.m_sSignature = m_sSignature;
  198.   MailConfig.m_sServer = m_sServer;
  199.   MailConfig.m_sXMailer = m_sXMailer;
  200.   if(MailConfig.DoModal() == IDOK)
  201.   {
  202.     m_sSignature = MailConfig.m_sSignature;
  203.     m_sServer = MailConfig.m_sServer;
  204.     m_sXMailer = MailConfig.m_sXMailer;
  205.     OnChangeText();
  206.   }
  207. }
  208. /////////////////////////////////////////////////////////////////////////////
  209. void CPageMailSmtp::OnChangeText() 
  210. {
  211. // TODO: If this is a RICHEDIT control, the control will not
  212. // send this notification unless you override the CPropertyPage::OnInitDialog()
  213. // function to send the EM_SETEVENTMASK message to the control
  214. // with the ENM_CHANGE flag ORed into the lParam mask.
  215. // TODO: Add your control notification handler code here
  216.   UpdateData();
  217.   int nLength = m_sText.GetLength();
  218.   if(m_bWithSignature)
  219.     nLength += m_sSignature.GetLength();
  220.   CString sLength;
  221.   sLength.Format("%d", nLength);
  222.   m_NumberOfChars.SetWindowText(sLength);
  223. }
  224. /////////////////////////////////////////////////////////////////////////////
  225. void CPageMailSmtp::OnWithSignature() 
  226. {
  227.   OnChangeText();
  228. }
  229. /////////////////////////////////////////////////////////////////////////////
  230. BOOL CPageMailSmtp::PreTranslateMessage(MSG* pMsg) 
  231. {
  232.   // transate the message based on TTM_WINDOWFROMPOINT
  233.   MSG msg = *pMsg;
  234.   msg.hwnd = (HWND)m_ToolTip.SendMessage(TTM_WINDOWFROMPOINT, 0, (LPARAM)&msg.pt);
  235.   CPoint pt = pMsg->pt;
  236.   if (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST)
  237.           ::ScreenToClient(msg.hwnd, &pt);
  238.   msg.lParam = MAKELONG(pt.x, pt.y);
  239.   // Let the ToolTip process this message.
  240.   m_ToolTip.RelayEvent(&msg);
  241.   if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
  242.   {
  243.     CWnd* pCurrent = GetFocus()->GetOwner();
  244.     int nCurrent = pCurrent->GetDlgCtrlID();
  245.     if(nCurrent == IDC_FROM
  246.       || nCurrent == IDC_TO
  247.       //|| nCurrent == IDC_SERVER
  248.       || nCurrent == IDC_SUBJECT
  249.       //|| nCurrent == IDC_XMAILER
  250.       )
  251.     {
  252.       CString sCurrent;
  253.       pCurrent->GetWindowText(sCurrent);
  254.       if(sCurrent != "")
  255.       {
  256.         ((CComboBox*)pCurrent)->InsertString(-1, sCurrent);
  257.         g_WriteToHistory(TRUE, "[Mail] Added " + sCurrent);
  258.         ((CEdit*)GetFocus())->SetSel(0, -1);
  259.       }
  260.     }
  261.     if(GetKeyState(VK_CONTROL) & 0x8000)
  262.     {
  263.       pMsg->message ^= WM_KEYDOWN;
  264.       int nResult = MessageBox("Send mail?", NULL, MB_ICONQUESTION | MB_YESNO);
  265.       if(nResult != IDNO)
  266.         OnSend();
  267.     }
  268.   }
  269. return CPropertyPage::PreTranslateMessage(pMsg);
  270. }
  271. /////////////////////////////////////////////////////////////////////////////
  272. void CPageMailSmtp::OnSetfocusAttachments() 
  273. {
  274.   CString sText;
  275.   m_Attachments.GetWindowText(sText);
  276.   if(sText.IsEmpty() && m_Attachments.GetCount() == 0)
  277.     m_Attachments.EnableWindow(FALSE);
  278. }
  279. /////////////////////////////////////////////////////////////////////////////
  280. void CPageMailSmtp::OnEditupdateAttachments() 
  281. {
  282.   OnSetfocusAttachments();
  283. }
  284. /////////////////////////////////////////////////////////////////////////////
  285. void CPageMailSmtp::OnSelchangeAttachments() 
  286. {
  287.   OnSetfocusAttachments();
  288. }
  289. /////////////////////////////////////////////////////////////////////////////
  290. void CPageMailSmtp::Serialize(CArchive& ar) 
  291. {
  292. if (ar.IsStoring())
  293. { // storing code
  294.     UpdateData();
  295.     ar << m_sSignature;
  296.     ar << m_sServer;
  297.     ar << m_sXMailer;
  298.     ar << m_bClear;
  299.     ar << m_bWithDate;
  300.     ar << m_bWithSignature;
  301.     ar << m_bWithMailer;
  302.     ar << m_sFrom;
  303.     int i, j;
  304.     CString sText;
  305.     j = m_From.GetCount();
  306.     ar << j;
  307.     for(i = 0; i < j; i++)
  308.     {
  309.       m_From.GetLBText(i, sText);
  310.       ar << sText;
  311.     }
  312.     j = m_To.GetCount();
  313.     ar << j;
  314.     for(i = 0; i < j; i++)
  315.     {
  316.       m_To.GetLBText(i, sText);
  317.       ar << sText;
  318.     }
  319.     j = m_Subject.GetCount();
  320.     ar << j;
  321.     for(i = 0; i < j; i++)
  322.     {
  323.       m_Subject.GetLBText(i, sText);
  324.       ar << sText;
  325.     }
  326. }
  327. else
  328. { // loading code
  329.     ar >> m_sSignature;
  330.     ar >> m_sServer;
  331.     ar >> m_sXMailer;
  332.     ar >> m_bClear;
  333.     ar >> m_bWithDate;
  334.     ar >> m_bWithSignature;
  335.     ar >> m_bWithMailer;
  336.     ar >> m_sFrom;
  337.     int i, j;
  338.     CString sText;
  339.     ar >> j;
  340.     for(i = 0; i < j; i++)
  341.     {
  342.       ar >> sText;
  343.       m_From.AddString(sText);
  344.     }
  345.     ar >> j;
  346.     for(i = 0; i < j; i++)
  347.     {
  348.       ar >> sText;
  349.       m_To.AddString(sText);
  350.   }
  351.     ar >> j;
  352.     for(i = 0; i < j; i++)
  353.     {
  354.       ar >> sText;
  355.       m_Subject.AddString(sText);
  356.   }
  357.   }
  358. }
  359. /////////////////////////////////////////////////////////////////////////////