计网大作业
- 格式:doc
- 大小:67.50 KB
- 文档页数:4
计算机网络大作业
学院:计算机学院
班级:计科0903
姓名:贾文庆
学号:0908030314
使用MAPI群发邮件
设计思路:
要实现使用MAPI群发邮件,MAPI函数封装在mapi32.dll中,在使用前,需要将相关函数导入到程序中。使用4个MAPI函数,分别是MAPILogon、MAPISendMail、MAPIFreeBuffer、和MAPILogoff。首先使用MAPILogon函数建立一个会话,然后使用MAPISendMail函数发送电子邮件,使用MAPIFreeBuffer函数释放邮件缓冲区,最后使用MAPILogoff函数结束会话。
主要程序代码:
申明MAPI函数原型的代码如下:
//定义mapi32.dll动态库中的函数原型
ULONG (PASCAL *lpfnMAPISendMail) (LHANDLE lhSession,
ULONG ulUIParam, lpMapiMessage lpMessage,
FLAGS flFlags, ULONG ulReserved); //用于发送邮件
ULONG (FAR PASCAL *lpfnMAPILogon)(ULONG ulUIParam,
LPSTR lpszProfileName, LPSTR lpszPassword,
FLAGS flFlags, ULONG ulReserved,
LPLHANDLE lplhSession);//用于建立对话
ULONG (FAR PASCAL *lpfnMAPILogoff)(LHANDLE lhSession,
ULONG ulUIParam, FLAGS flFlags,
ULONG ulReserved);//用于结束会话
ULONG (FAR PASCAL *lpfnMAPIFreeBuffer)(LPVOID lpBuffer);//用于是否缓冲区
处理“插入”按钮的单击事件,在该事件的处理函数中将收件人编辑框中的数据插入到列表中,代码如下:
void CMapiSendDlg::OnButadd()
{
// TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_Name.IsEmpty())
{
MessageBox("请编辑收件人");
return;
}
m_List.InsertString(m_List.GetCount(),m_Name);
m_Name = "";
UpdateData(FALSE);
}
处理“发送”按钮的单击事件,再带时间的处理函数中调用MAPI函数进行群发邮件,代码如下:
void CMapiSendDlg::OnButsend()
{ // TODO: Add your control notification handler code here
UpdateData(TRUE);
if(m_Subject.IsEmpty() || m_NoteText.IsEmpty())
{
MessageBox("主题或内容不能为空!");
return;
}
HMODULE result = LoadLibrary("mapi32.dll"); //加载动态库
//获取函数指针
(FARPROC&)lpfnMAPILogon = GetProcAddress(result,"MAPILogon");
(FARPROC&)lpfnMAPISendMail = GetProcAddress(result,"MAPISendMail");
(FARPROC&)lpfnMAPIFreeBuffer= GetProcAddress(result,"MAPIFreeBuffer");
(FARPROC&)lpfnMAPILogoff= GetProcAddress(result,"MAPILogoff");
unsigned long a;
lpfnMAPILogon(0,NULL,NULL,0,0,&a); //开始一个会话
ULONG lresult ;
CTime time = CTime::GetCurrentTime(); //获取当前时间
CString ctime = time.Format("%Y//%m//%d %H:%M"); //格式化时间YYYY/MM/DD HH:MM
char date[50];
strcpy(date,ctime); //拷贝字符串
int receivenum = m_List.GetCount(); //获得群发人数
CString* addr1 = new CString[receivenum]; //记录用户账户
CString* addr2 = new CString[receivenum]; //记录SMTP服务器
MapiRecipDesc* m_receiver = new MapiRecipDesc[receivenum];
for(int n=0;n
{
CString receiver,man;
m_List.GetText(n,man); //获得收件人
receiver = man.Left(man.Find('@')); //获取用户账户
addr1[n] = receiver; //保存用户账户
receiver = "SMTP:"+man; //设置SMPT
addr2[n] = receiver;
m_receiver[n].ulReserved = 0; //保留变量,必须为0
m_receiver[n].ulRecipClass = MAPI_TO; //设置接收类型
m_receiver[n].lpszName = addr1[n].GetBuffer(0); //设置接收者
m_receiver[n].lpszAddress = addr2[n].GetBuffer(0); //设置接收者地址
m_receiver[n].ulEIDSize = 0; //设置ulEIDSize参数大小
m_receiver[n].lpEntryID = NULL; //定义接收者信息
}
MapiMessage* m_messageInfo; //定义一个信息结构指针
m_messageInfo = new MapiMessage;
memset(m_messageInfo,0,sizeof(MapiMessage));//初始化m_messageInfo
m_messageInfo->lpszNoteText= m_NoteText.GetBuffer(0); //设置邮件正文
m_messageInfo->ulReserved = 0; //保留,必须为0 m_messageInfo->lpszSubject = m_Subject.GetBuffer(0); //设置主题
m_messageInfo->lpszDateReceived = date; //设置邮件发送时间
m_messageInfo->lpszConversationID = NULL; //邮件所属线程一个字符串指针
m_messageInfo->flFlags = MAPI_SENT; //邮件状态标记
m_messageInfo->lpOriginator = NULL; //发送者信息
m_messageInfo->nRecipCount = receivenum; //接收者人数
m_messageInfo->lpRecips = m_receiver;//设置接收者信息
m_messageInfo->lpszMessageType = NULL; //邮件类型
m_messageInfo->nFileCount = 0; //附件数
lresult = lpfnMAPISendMail(a,0,m_messageInfo,0 ,0); //发送邮件
if(lresult != SUCCESS_SUCCESS) //如果发送不成功
{
AfxMessageBox("操作失败.",64);//提示操作失败
}
Else //否则,发送成功
{
AfxMessageBox("邮件发送成功.",64); //提示发送成功
}
delete []addr1;
delete []addr2;
delete []m_receiver;
delete []m_messageInfo;
lpfnMAPIFreeBuffer(m_messageInfo); //释放邮件内存空间
lpfnMAPILogoff(a,0,0,0); //结束会话
}