收发无附件的邮件
一、设计要求及设计内容
1.1课设概述
2.2设计思路
2.2.1熟悉SMTP和POP3协议:
三、具体程序及主要代码
邮件发送核心代码:
void CSample37View::OnSendMail()
{// 找到要调用的MAPI函数地址
(FARPROC&) lpfnMAPISendMail = GetProcAddress(m
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hMAPI
(FARPROC&) lpfnMAPILogoff =GetProcAddress(m_hMAP
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_
// 生成信报结构指针
m_pMessage = new(MapiMessage);
memset(m_pMessage, 0, sizeof(MapiMessage)); // 下
UpdateData(TRUE); // 把
m_pMessage->ulReserved = 0; // 设
char subject[512];
::strcpy(subject, m_strSubject);
m_pMessage->lpszSubject = subject; //
char text[20000];
::strcpy(text, m_strContent);
m_pMessage->lpszNoteText = text; // 设置
m_pMessage->lpszMessageType = NULL; // 指向接收这个消息
CTime time = CTime::GetCurrentTime();
CString str = time.Format("%Y//%m//%d//%H");
char t[50];
::strcpy(t, str);
m_pMessage->lpszDateReceived = t;// 指向标识消息所属会话线
m_pMessage->lpszConversationID = NULL;// 设置flFla
m_pMessage->flFlags = MAPI_SENT;
// 用一个指向MapiRecipDesc结构的指针设置发送者信息
m_pMessage->lpOriginator = NULL;// 设置接收者数目
m_pMessage->nRecipCount = 1;// 接收者信息
str = m_strAddress.Left(m_strAddress.Find('@'));
char address1[100];
char address2[100];
::strcpy(address1, str);
str = "SMTP:"+m_strAddress;
::strcpy(address2, str);
MapiRecipDesc recipient = {0, MAPI_TO, address1,
m_pMessage->lpRecips = &recipient;// 设置附件数量
m_pMessage->nFileCount = 0;// 设置附件信息
m_pMessage->lpFiles = NULL;// 建立会话
LHANDLE lhSession;
ULONG lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("发送失败");
return;
}// 进行信报的发送
lResult = lpfnMAPISendMail(0, 0, m_pMessage, 0, 0
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("发送失败");
return;
}// 释放信报结构的内存空间
lpfnMAPIFreeBuffer(m_pMessage);// 结束会话
lResult=lpfnMAPILogoff(lhSession, 0, 0, 0);
m_strSubject = "邮件已成功发送给" + m_strAddress;
m_strAddress = "cpf84802@163.com";
m_strContent = "";
UpdateData(FALSE);
}
邮件接收核心代码:
void CRecvView::OnRecvMail()
{
(FARPROC&) lpfnMAPILogon = GetProcAddress(m_hMAPI
(FARPROC&) lpfnMAPILogoff = GetProcAddress(m_hMAP
(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(m_
(FARPROC&) lpfnMAPIFindNext = GetProcAddress(m_hM
(FARPROC&) lpfnMAPIReadMail = GetProcAddress(m_hM
count++;// 建立会话
ULONGlResult = lpfnMAPILogon(0, NULL, NULL, MAPI
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("建立会话失败");
return;
}// 定位到第一个邮件
char pMessageID[513];
lResult = lpfnMAPIFindNext(m_lhSession, NULL, NUL
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("错误:请确认收件箱不为空!");
return;
}// 分配信报结构的内存空间
m_pMessage = new(MapiMessage);
memset(m_pMessage, 0, sizeof(MapiMessage));// 读取第
lResult = lpfnMAPIReadMail(m_lhSession, NULL, pMe
if (lResult != SUCCESS_SUCCESS)
{
AfxMessageBox("错误:读取信报出错!");
return;
}// 处理读取结果,在窗口中显示得到的信报
m_strSubject = (CString)m_pMessage->lpszSubject;
m_strAddress = (CString)m_pMessage->lpOriginator-
m_strTime = (CString)m_pMessage->lpszDateReceived
m_strContent = (CString)m_pMessage->lpszNoteText;
UpdateData(FALSE);// 在访问另一条信件以前释放内存
lpfnMAPIFreeBuffer(m_pMessage);// 结束会话
lResult=lpfnMAPILogoff(m_lhSession, 0, 0, 0);
return;
}
四、调试及运行结果
4.1调试工具