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;
}