VC:實現郵件的收發功能


1、下載JMail4.3安裝

2、添加對話框應用程序:

 

一、發信模塊:

2、點擊寫信按鈕:

void CJMailDlg::OnSend()

{

       // TODO: Add your control notification handler code here

       GetDlgItem(IDOK)->EnableWindow(TRUE);

       GetDlgItem(IDC_NAME)->EnableWindow(TRUE);

       GetDlgItem(IDC_SENDAD)->EnableWindow(TRUE);

       GetDlgItem(IDC_PASSWORD)->EnableWindow(TRUE);

       GetDlgItem(IDC_SMTP)->EnableWindow(TRUE);

       GetDlgItem(IDC_POP)->EnableWindow(FALSE);

       GetDlgItem(IDC_REVAD)->EnableWindow(TRUE);

       GetDlgItem(IDC_SUBJECT)->EnableWindow(TRUE);

       GetDlgItem(IDC_BODY)->EnableWindow(TRUE);

       GetDlgItem(IDC_ADD)->EnableWindow(TRUE);

       GetDlgItem(IDC_LIST)->EnableWindow(FALSE);

       //清空所有控件內容

       m_list.DeleteAllItems();//清空附件列表

       m_body ="";

       m_name ="";

       m_password ="";

       m_pop3 ="";

       m_revad ="";

       m_sendad ="";

       m_smtp = "";

       m_subject ="";

       UpdateData(false);

       flag=true;//記錄是發信狀態

}

 

3、添加附件:

void CJMailDlg::OnAdd()

{

       // TODO: Add your control notification handler code here

       GetDlgItem(IDC_LIST)->EnableWindow(TRUE);

       CFileDialog dlg(true,NULL,NULL,OFN_ALLOWMULTISELECT);

       if(dlg.DoModal() == IDOK)

       {

              POSITION pos = dlg.GetStartPosition();

              while(pos != NULL)

              {

                     long i=m_list.GetItemCount();

                    

                     m_list.InsertItem(m_list.GetItemCount()+1,dlg.GetNextPathName(pos));//AddString(dlg.GetNextPathName(pos));

                     CString  str;

                     str=m_list.GetItemText(i,0);

              }

       }

}

4、刪除附件:

void CJMailDlg::OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult)

{

       // TODO: Add your control notification handler code here

      

       if(flag==true)

              if(IDOK==MessageBox("確定刪除此項嗎?","刪除提示",MB_OKCANCEL|MB_ICONQUESTION))

              {

                     int nItem=m_list.GetNextItem  (-1,LVNI_SELECTED);

                     m_list.DeleteItem(nItem);

                     UpdateData(FALSE);

              }

       *pResult = 0;

}

5、確定發信操作:

void CJMailDlg::OnOK()

{

       // TODO: Add extra validation here

       if(flag==true)

       {

              //參數的獲取與判斷

              UpdateData(true);

              m_sendad.TrimRight();//去掉后面多於空格

              m_password.TrimRight();

              m_smtp.TrimRight();

              m_revad.TrimRight();

              m_subject.TrimRight();

              m_body.TrimRight();

              m_name.TrimRight();

              //判斷參數是否合法

              if(m_revad.GetLength()<3)

              {

                     AfxMessageBox("請填寫正確的收件人郵箱");

                     return;

              }

              if(m_sendad.GetLength()<3)

              {

                     AfxMessageBox("請填寫正確的發信人郵箱");

                     return;

              }

              if(m_body=="")

              {

                     AfxMessageBox("請填寫正文");

                     return;

              }

              if(m_subject=="")

              {

                     if(IDCANCEL==MessageBox("確定不填寫標題嗎?","提示",MB_OKCANCEL|MB_ICONQUESTION))

                            return;

              }

              if(m_name=="")

              {

                     if(IDCANCEL==MessageBox("確定不填寫昵稱嗎?","提示",MB_OKCANCEL|MB_ICONQUESTION))

                            return;

              }

              //進行發信

              try

              {

                     CoInitialize(NULL);     // COM的初始化

                     jmail::IMessagePtr pMessage("JMail.Message"); 

                     pMessage->From = (LPCTSTR)m_sendad;// 發件人郵箱               

                     pMessage->FromName =_bstr_t(m_name);// 發件人姓名        

                     pMessage->AddRecipient((LPCTSTR)m_revad, "", "");// 添加收件人

                     pMessage->Priority = 3;// 優先級設置,1-5逐次降低, 3為中級

                     pMessage->Charset = "GB2312";// 編碼方式設置, 默認是iso-8859-1   

                     pMessage->Subject = (LPCTSTR)m_subject;// 主題

                     pMessage->Body = (LPCTSTR)m_body;// 正文

                     pMessage->MailServerUserName=(LPCTSTR)m_sendad;// 開始發送

                     pMessage->MailServerPassWord=(LPCTSTR)m_password;

                     if(m_list.GetItemCount()!=0)

                            for(int i=0;i<=m_list.GetItemCount()-1;i++)

                            {

                                   CString  str;

                                   str=m_list.GetItemText(i,0);

                                   pMessage->AddAttachment(_bstr_t(str), VARIANT_FALSE, "application/octet-stream");

                                   char *p=_bstr_t(str);

                            }

                            pMessage->Send((LPCTSTR)m_smtp, VARIANT_FALSE);

                            pMessage.Release();

                            AfxMessageBox("發送成功!");

                            CoUninitialize();

              }

              catch (_com_error e)

              {

                     CString strErr;

                     strErr.Format("程序運行錯誤\r\n錯誤描述:%s",(LPCTSTR)e.Description());

                     AfxMessageBox(strErr);

              }

       }

       //進行收信工作

       else

       {

              //參數的獲取與判斷

              UpdateData(true);

              m_password.TrimRight();

              m_sendad.TrimRight();

              m_pop3.TrimRight();

              //判斷參數是否合法

              if(m_sendad.GetLength()<3)

              {

                     AfxMessageBox("請填寫正確的收件人郵箱");

                     return;

              }

              if(m_password=="")

              {

                     AfxMessageBox("請填寫密碼");

                     return;

              }

              if(m_pop3=="")

              {

                     AfxMessageBox("請填寫POP服務器");

                     return;

              }

              //開始信件獲取

              CRec dlg;

              dlg.DoModal();

       }

       //CDialog::OnOK();

}

二、收信模塊:

1、點擊收信按鈕:

void CJMailDlg::OnRev()

{

       // TODO: Add your control notification handler code here

       GetDlgItem(IDOK)->EnableWindow(TRUE);

       GetDlgItem(IDC_NAME)->EnableWindow(FALSE);

       GetDlgItem(IDC_SENDAD)->EnableWindow(TRUE);

       GetDlgItem(IDC_PASSWORD)->EnableWindow(TRUE);

       GetDlgItem(IDC_SMTP)->EnableWindow(FALSE);

       GetDlgItem(IDC_POP)->EnableWindow(TRUE);

       GetDlgItem(IDC_REVAD)->EnableWindow(FALSE);

       GetDlgItem(IDC_SUBJECT)->EnableWindow(FALSE);

       GetDlgItem(IDC_BODY)->EnableWindow(FALSE);

       GetDlgItem(IDC_ADD)->EnableWindow(FALSE);

       GetDlgItem(IDC_LIST)->EnableWindow(FALSE);

       //清空所有控件內容

       m_list.DeleteAllItems();//清空附件列表

       m_body ="";

       m_name ="";

       m_password ="";

       m_pop3 ="";

       m_revad ="";

       m_sendad ="";

       m_smtp = "";

       m_subject ="";

       UpdateData(false);

       flag=false;//記錄是收信狀態

}

2、添加新的對話框,及變量CString m_body、CListCtrl m_llis、CListCtrl m_llist,和類CRecDlg;

      

       CString m_pop;

       CString m_add;

       CString m_password;

       jmail::IMessagesPtr pMessages;

       jmail::IMessagePtr pMessage;

       jmail::IAttachmentsPtr pAttachments;

       jmail::IAttachmentPtr pAttachment;

       CStringArray m_bodyArray;

初始化:

BOOL CRec::OnInitDialog()

{

       CDialog::OnInitDialog();

      

       // TODO: Add extra initialization here

       m_letter.InsertColumn(0, "發件人");

       m_letter.InsertColumn(1, "主題");

       m_letter.InsertColumn(2, "日期");

       //獲取列表的寬度

       RECT rect;

       m_letter.GetWindowRect(&rect);

       int wid=rect.right-rect.left;

       //為你的每列分寬度

       m_letter.SetColumnWidth(0,wid/3);

       m_letter.SetColumnWidth(1,wid/3);

       m_letter.SetColumnWidth(2,wid/3);

 

       m_att.InsertColumn(0, "附件名");

       m_att.InsertColumn(1, "大小");

       //獲取列表的寬度

       m_att.GetWindowRect(&rect);

       wid=rect.right-rect.left;

       //為你的每列分寬度

       m_att.SetColumnWidth(0,wid/2);

       m_att.SetColumnWidth(1,wid/2);

      

       return TRUE;  // return TRUE unless you set the focus to a control

                     // EXCEPTION: OCX Property Pages should return FALSE

}

3、單擊OK按鈕,提交信息:

void CJMailDlg::OnOK()

{

       // TODO: Add extra validation here

       if(flag==true)

       {

              //參數的獲取與判斷

              UpdateData(true);

              m_sendad.TrimRight();//去掉后面多於空格

              m_password.TrimRight();

              m_smtp.TrimRight();

              m_revad.TrimRight();

              m_subject.TrimRight();

              m_body.TrimRight();

              m_name.TrimRight();

              //判斷參數是否合法

              if(m_revad.GetLength()<3)

              {

                     AfxMessageBox("請填寫正確的收件人郵箱");

                     return;

              }

              if(m_sendad.GetLength()<3)

              {

                     AfxMessageBox("請填寫正確的發信人郵箱");

                     return;

              }

              if(m_body=="")

              {

                     AfxMessageBox("請填寫正文");

                     return;

              }

              if(m_subject=="")

              {

                     if(IDCANCEL==MessageBox("確定不填寫標題嗎?","提示",MB_OKCANCEL|MB_ICONQUESTION))

                            return;

              }

              if(m_name=="")

              {

                     if(IDCANCEL==MessageBox("確定不填寫昵稱嗎?","提示",MB_OKCANCEL|MB_ICONQUESTION))

                            return;

              }

              //進行發信

              try

              {

                     CoInitialize(NULL);     // COM的初始化

                     jmail::IMessagePtr pMessage("JMail.Message"); 

                     pMessage->From = (LPCTSTR)m_sendad;// 發件人郵箱               

                     pMessage->FromName =_bstr_t(m_name);// 發件人姓名        

                     pMessage->AddRecipient((LPCTSTR)m_revad, "", "");// 添加收件人

                     pMessage->Priority = 3;// 優先級設置,1-5逐次降低, 3為中級

                     pMessage->Charset = "GB2312";// 編碼方式設置, 默認是iso-8859-1   

                     pMessage->Subject = (LPCTSTR)m_subject;// 主題

                     pMessage->Body = (LPCTSTR)m_body;// 正文

                     pMessage->MailServerUserName=(LPCTSTR)m_sendad;// 開始發送

                     pMessage->MailServerPassWord=(LPCTSTR)m_password;

                     if(m_list.GetItemCount()!=0)

                            for(int i=0;i<=m_list.GetItemCount()-1;i++)

                            {

                                   CString  str;

                                   str=m_list.GetItemText(i,0);

                                   pMessage->AddAttachment(_bstr_t(str), VARIANT_FALSE, "application/octet-stream");

                                   char *p=_bstr_t(str);

                            }

                            pMessage->Send((LPCTSTR)m_smtp, VARIANT_FALSE);

                            pMessage.Release();

                            AfxMessageBox("發送成功!");

                            CoUninitialize();

              }

              catch (_com_error e)

              {

                     CString strErr;

                     strErr.Format("程序運行錯誤\r\n錯誤描述:%s",(LPCTSTR)e.Description());

                     AfxMessageBox(strErr);

              }

       }

       //進行收信工作

       else

       {

              //參數的獲取與判斷

              UpdateData(true);

              m_password.TrimRight();

              m_sendad.TrimRight();

              m_pop3.TrimRight();

              //判斷參數是否合法

              if(m_sendad.GetLength()<3)

              {

                     AfxMessageBox("請填寫正確的收件人郵箱");

                     return;

              }

              if(m_password=="")

              {

                     AfxMessageBox("請填寫密碼");

                     return;

              }

              if(m_pop3=="")

              {

                     AfxMessageBox("請填寫POP服務器");

                     return;

              }

              //開始信件獲取

              CRec dlg;

              dlg.DoModal();

       }

       //CDialog::OnOK();

}

5、開始接收郵件:

void CRec::OnStart()

{

       // TODO: Add your control notification handler code here

       CJMailApp*pApp=(CJMailApp*)AfxGetApp();

       CJMailDlg*pDlg=(CJMailDlg*)pApp->m_pMainWnd;

       m_add=pDlg->m_sendad;

       m_password=pDlg->m_password;

       m_pop=pDlg->m_pop3;

       try

       {    

              CoInitialize(NULL);     

             

             jmail::IPOP3Ptr pPOP3("JMail.POP3");

              // 超時 60S

              //Connect=true;

              pPOP3->Timeout =60;

             

              // 連接郵件服務器

 

              pPOP3->Connect((LPCTSTR)m_add,(LPCTSTR)m_password,(LPCTSTR)m_pop,110);

              pMessages = pPOP3->Messages;

              long lCount = pMessages->Count - 1;

              if(lCount == 0)

                     AfxMessageBox("信箱為空");

              else

              {

                     for(long i= 1; i <= lCount; i++)

                     {

                            pMessage=pMessages->Item[i];

                            //pMessage->Encoding= "quoted-printable ";

                            pMessage->ContentType= "text/html ";

                            pMessage->ContentTransferEncoding="Quoted-Printable ";

                            pMessage->Encoding="uuencode";

                            pMessage->Charset="gb2312";

                     /*    pMessage->Charset = "GB2312"; //郵件的文字編碼為國標

                            pMessage->ContentTransferEncoding = "base64";  

                            pMessage->Encoding = "uuencode";//"base64";

                            pMessage->ISOEncodeHeaders = false;

                            pMessage->ContentType = "text/html";*/

 

 

                            _bstr_t bstrFrom = pMessage->From;

                            _bstr_t bstrSubject = pMessage->Subject;

                            _bstr_t bstrBody = pMessage->Body;

                            COleDateTime oleDate = pMessage->Date;

                            int nListItem = m_letter.InsertItem(i, (const char*)bstrFrom);

                            m_letter.SetItem(nListItem, 1, LVIF_TEXT, (const char*)bstrSubject, 0, 0, 0, NULL);

                            m_letter.SetItem(nListItem, 2, LVIF_TEXT, (const char*)oleDate.Format("%Y-%m-%d"), 0, 0, 0, NULL);

                            m_bodyArray.Add((const char*)bstrBody);

                            pMessage.Release();

                     }

              }

       }

       catch(_com_error e)

       {

              CString strErr;

              strErr.Format("程序運行錯誤\r\n錯誤描述:%s",(LPCTSTR)e.Description());

              AfxMessageBox(strErr);             

       }

}

6、添加控件:IDC_LETTER的LVN_ITEMCHANGED事件的消息映射,實現打開郵件的功能:

void CRec::OnItemchangedLetter(NMHDR* pNMHDR, LRESULT* pResult)

{

       NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;

       // TODO: Add your control notification handler code here

       POSITION pos = m_letter.GetFirstSelectedItemPosition();

       if(pos)

       {

              m_att.DeleteAllItems( );

              int nItem = m_letter.GetNextSelectedItem(pos);

              m_body = m_bodyArray.GetAt(nItem);

              jmail::IPOP3Ptr pPOP3("JMail.POP3");

              pMessage=pMessages->Item[nItem+1];

              for(int i=0;i<=pMessage->Attachments->Count-1;i++)

              {

                     pAttachment=pMessage->Attachments->Item[i];

                     _bstr_t bstrname=pAttachment->Name;      

                     _bstr_t bstrsize=pAttachment->Size;    

                     int nListItem = m_att.InsertItem(m_att.GetItemCount()+1,(const char*)bstrname);

                     m_att.SetItem(nListItem, 1, LVIF_TEXT, (const char*)bstrsize, 0, 0, 0, NULL);

              }

              UpdateData(FALSE);

              pMessage.Release();

       }

       *pResult = 0;

}

7、IDC_ATT的NM_DBLCLK事件的消息映射,實現下載附件的功能:

void CRec::OnDblclkAtt(NMHDR* pNMHDR, LRESULT* pResult)

{

       // TODO: Add your control notification handler code here

       int i=m_letter.GetNextItem  (-1,  LVNI_SELECTED);

       int  nItem  =m_att.GetNextItem  (-1,  LVNI_SELECTED);

       jmail::IPOP3Ptr pPOP3("JMail.POP3");

       CString  str;

       str=m_att.GetItemText(nItem,0);

       CFileDialog dlg(false,NULL,str,OFN_ALLOWMULTISELECT);

       if(dlg.DoModal()==IDOK)

       {

              POSITION pos=dlg.GetStartPosition();

              while(pos!=NULL)

              {

                     pMessage=pMessages->Item[i+1];

                     pAttachment=pMessage->Attachments->Item[nItem];

                     pAttachment->SaveToFile(_bstr_t(dlg.GetNextPathName(pos)));

                     MessageBox("下載完成!",NULL,MB_OK);

                     pMessage.Release();

              }

       }

       *pResult = 0;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM