计网大作业

  • 格式: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); //结束会话

}