Sender邮件发送器_第1页
Sender邮件发送器_第2页
Sender邮件发送器_第3页
Sender邮件发送器_第4页
Sender邮件发送器_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Mail Sender邮件发送器班 级:电气14指导教师:罗建军目录需求分析 2(A)开发背景 2(B)应用对象 2(C)项目目标 2(D)运行环境 2技术路线 2 (A)开发环境2(B)总体设计2(C)详细设计 3总效果图30个人小结 33一、需求分析(A)开发背景:现代社会是互联网大发展的时代,网络邮件发展更是迅猛,我们编写一个邮件发送程序,对于以后方便的发送电子邮件有很大的好处,从编写这个程序了解电子邮件的工作原理,有很大的帮助。这里我运用smtp协议来发送电子邮件。SMTP(简单邮件传输协议)协议是一种邮件发送协议,目前全世界几乎所有的邮件服务器都支持SMTP协议,可以说没有SMTP协

2、议电子邮件寸步难行。(B)应用对象: 这个软件对于那些经常发送电子邮件的朋友,有很大的方便,可以大大的提高他们的工作效率。(C)项目目标:实现带有附件的邮件发送功能,并有地址薄的功能。(D) 运行环境:此软件可在Windows 2000/XP下正常运行,现行的一般微机都可满足其要求。二、技术路线(A)开发环境: 操作系统:Windows XP 开发软件:Visual C+,Microsoft Access(B)总体设计:SMTP(简单邮件传输协议)协议是一种邮件发送协议,他的目标是可靠、高效的传送邮件,他独立于传送子系统,而且仅要求一条可以保证传送数据单元顺序的通道。SMTP协议的一个重要特点

3、是它能够在传送中接力传送邮件。也就是说,如果该邮件服务器知道目的地址的邮件服务器则直接发送;如果不知道目的邮件服务器,则将这封信件按照某种策略转发给就近的一个邮件服务器。通过这种接力式的传送方式,完成邮件的发送。SMTP的通信过程:针对用户的邮件请求,在发送SMTP和接收SMTP之间建立一个双向通道。接收SMTP可以使最终的接收者也可以是中间的传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方向传送。过程如下:文 件 系 统用户发 送SMTP接 收SMTP文件系统因为支持邮件附件,所以整个程序显得有点凌乱,程序中共有12个类。分别对SMTP,MIME,邮件以及编码技术进行

4、封装:l CSMTPEMailAPP类l CSMTPEMailDlg类l CAboutDlg类l CAttachmentsDl类l CSMTP类l CMailMessage类l CMIMEMessage类l CMIMEContentAgent类l CTextPlain类l CAppOctetStrea类l CMIMECode类l CBase64类下面从整体上来讲程序结构理清楚:CSMTPEMailAPP,CSMTPEMailDlg,CAboutDlg这几个类就不用说了。他们是由Visual C+ 6.0的应用程序向导自动生成的框架代码,分别是应用程序类、主对话框类和“关于”对话框类。CAtta

5、chmentsDlg类也是一个对话框类,他封装了添加/移除邮件附件的对话框。CSMTP类则是程序中的一个关键类,他对SMTP协议进行了包装。也就是说,它实现了SMTP协议的客户端功能。使用该类的成员函数可以登陆到指定的SMTP服务器,设置特定的用户帐号并最后发送撰写好的邮件。CMailMessage类和CMIMEMessage类对待发送的邮件进行了包装,其中CMailMessage类是CMIMEMessage类的父类,他封装了格式与RFC822定义的格式兼容的电子邮件。而CMIMEMessage类则对MIME扩展各式的邮件进行了包装。CMIMEContentAgent类,CTextPlain类

6、,CAppOctetStrea类这三个类对MIME邮件格式进行了必要的包装。其中CMIMEContentAgent类是父类,CTextPlain类和CAppOctetStrea类都是从它派生而来的。CTextPlain类封装的是文本格式,CAppOctetStrea类封装的是应用程序文档格式。CMIMECode类和CBase64类对MIME的编码/解码技术进行了包装。其中CMIMECode是父类,CBase64是子类。(C)详细设计:(1).CSMTP类这个类实现同服务器的交互。利用SMTP协议发送邮件的过程为:首先建立TCP连接,然后使用命令HELO打开通信通道。如:键入:user:j101

7、0$telnet 202.117.35.170 25接收:220 X1 NT-ESMTP Server 发送:HELO student接收:250 hello 关闭连接使用命令QUIT,如下:发送:QUIT接受:221 Goodbye打开连接通道后,需要进行邮件信息的通信交互,命令介绍如下:MAIL 初始化邮件传输 mail from: RCPT 标识单个的邮件接收人;常在MAIL命令后面 可有多个rcpt to: DATA 在单个或多个RCPT命令后,表示所有的邮件接收人已标识,并初始化 数据传输,以.结束。 VRFY 用于验证指定的用户/邮箱是否存在;由于安全方面的原因,服务器常禁止此命令

8、 EXPN 验证给定的邮箱列表是否存在,扩充邮箱列表,也常被禁用 HELP 查询服务器支持什么命令 NOOP 无操作,服务器应响应OK RSET 重置会话,当前传输被取消。下面是一个例子演示在主机202.117.35.170的student给主机上的BOB和JANE发送邮件的过程。发送:MAIL FROM:student接收:250 OK发送:RCPT TO:BOB接收: 250 OK发送:RCPT TO: YONG接收:550 No such user here发送:RCPT TO:JANE接收:250 OK发送:DATA接收:354 ok, send it; end with <CR

9、LF>.<CRLF>发送:Hi, I am in XJTU now,Where are you? /注:这里为邮件征文发送:How are you?发送:<CRLF>.<CRLF>/邮件结束标志接收:250 OK下面是程序的具体实现过程:应答代码数组定义如下:CSMTP:response_code CSMTP:response_table = 250, _T( "SMTP server error" ) , 220, _T( "SMTP server not available" ) , 354, _T( &qu

10、ot;SMTP server not ready for data" ) , 221, _T( "SMTP server didn't terminate session" ) ;建立同SMTP服务器连接的函数CCMTP:Connect,并发送HELO命令登陆服务器。为了接受服务器的响应,预先分配缓冲区response_buf;调用CSockt类的Creat()函数创建套接字;调用CSockt类的Connect()函数试图连接到SMTP服务器;调用get_response()函数测试是否成功连接到CSMTP服务器;如果连接成功则给服务器发送HELO命令;如

11、果接受到服务器对此指令的回应则表示已经建立起与SMTP服务器的连接,可以进行后续操作了。具体代码如下:/连接SMTP服务器BOOL CSMTP:Connect()CString sHello;/本地计算机名称TCHAR local_host 80 ;if( m_bConnected )return TRUE;try/接收缓冲区response_buf = new TCHAR RESPONSE_BUFFER_SIZE ;if( response_buf = NULL )m_sError = _T( "Not enough memory" );return FALSE;/捕获内

12、存异常catch( CException *e )response_buf = NULL;m_sError = _T( "Not enough memory" );delete e;return FALSE;/创建Socketif( !m_wsSMTPServer.Create() )m_sError = _T( "Unable to create the socket." );delete response_buf;response_buf = NULL;return FALSE;/连接服务器if( !m_wsSMTPServer.Connect( G

13、etServerHostName(), GetPort() ) )m_sError = _T( "Unable to connect to server" );m_wsSMTPServer.Close();delete response_buf;response_buf = NULL;return FALSE;/获取服务器响应if( !get_response( CONNECT_SUCCESS ) )m_sError = _T( "Server didn't respond." );m_wsSMTPServer.Close();delete re

14、sponse_buf;response_buf = NULL;return FALSE;gethostname( local_host, 80 );/发送HELO 命令sHello.Format( _T( "HELO %srn" ), local_host );m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() );/接收服务器响应if( !get_response( GENERIC_SUCCESS ) )m_wsSMTPServer.Close();delete response_buf;response_bu

15、f = NULL;return FALSE;m_bConnected = TRUE;return TRUE;使用成员函数Connect()连接到SMTP服务器之后,就可以调用SendMessage()韩书法送邮件了;SendMessage()函数分三步完成邮件的发送任务。(1)检查到SMTP服务器的连接是否已经建立。如果还没有,则返回FALSE表示发送失败。(2)调用FormatMailMessage()函数对待发送的邮件进行格式化。(3)调transmit_message()函数将邮件安装一定的规则发送个服务器。BOOL CSMTP:SendMessage(CMailMessage * ms

16、g)ASSERT( msg != NULL );if( !m_bConnected )m_sError = _T( "Must be connected" );return FALSE;if( FormatMailMessage( msg ) = FALSE )return FALSE;if( transmit_message( msg ) = FALSE )return FALSE;return TRUE;前面提到的FormatMailMessage()函数定义如下,它主要调用了CMailMessage类的FormatMessage()函数,对于这个函数间后面关于CMai

17、lMessage类的具体介绍.BOOL CSMTP:FormatMailMessage( CMailMessage* msg )ASSERT( msg != NULL ); if( msg->GetNumRecipients() = 0 )m_sError = _T( "No Recipients" );return FALSE;msg->FormatMessage();return TRUE;邮件的发送是通过CSMTP:transmit_message函数完成的,该函数按照前面介绍的发送过程,依次发送MAIL FROM,RCPT TO, DATA命令完成信件的

18、发送。它发送邮件的次序是这样的:格式化发件人E-Mail地址;格式化收件人E-Mail地址;发送DATA指令;格式化邮件头部;格式化邮件正文;发送作为邮件结束标志的符号。/发送邮件BOOL CSMTP:transmit_message(CMailMessage * msg)CString sFrom;CString sTo;CString sTemp;CString sEmail;ASSERT( msg != NULL );if( !m_bConnected )m_sError = _T( "Must be connected" );return FALSE;/发送 MAI

19、L FROM:命令sFrom.Format( _T( "MAIL From: <%s>rn" ), (LPCTSTR)msg->m_sFrom );m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );if( !get_response( GENERIC_SUCCESS ) )return FALSE;/发送RCPT TO:命令/可以连续发送多次,这样可以给多个人发送邮件for( int i = 0; i < msg->GetNumRecipients(); i+ )msg->G

20、etRecipient( sEmail, sTemp, i );sTo.Format( _T( "RCPT TO: <%s>rn" ), (LPCTSTR)sEmail );m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );get_response( GENERIC_SUCCESS );/发送DATA命令sTemp = _T( "DATArn" );m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );if( !get_resp

21、onse( DATA_SUCCESS ) )return FALSE;/发送信件头m_wsSMTPServer.Send( (LPCTSTR)msg->m_sHeader, msg->m_sHeader.GetLength() );/处理邮件正文sTemp = cook_body( msg );/发送邮件正文m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );/发送邮件数据结束标志 回车.回车sTemp = _T( "rn.rn" );m_wsSMTPServer.Send( (LPCTSTR)sTe

22、mp, sTemp.GetLength() );if( !get_response( GENERIC_SUCCESS ) )return FALSE;return TRUE;接受并验证服务器的响应函数get_response完成。该函数通过Socket读取返回的信息,分离出相应代码(250等),判断是否发送成功。BOOL CSMTP:get_response( UINT response_expected )/输入的响应代码是否合理ASSERT( response_expected >= GENERIC_SUCCESS );ASSERT( response_expected < L

23、AST_RESPONSE );CString sResponse;UINT response;response_code* pResp;/接受响应if( m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE ) = SOCKET_ERROR )m_sError = _T( "Socket Error" );return FALSE;sResponse = response_buf;/获取前三个字符(250等)sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( "%d&q

24、uot; ), &response );/获取响应的代码项pResp = &response_table response_expected ;/检验是否发送成功if( response != pResp->nResponse )m_sError.Format( _T( "%d:%s" ), response, (LPCTSTR)pResp->sMessage );return FALSE;return TRUE;CSMTP:cook_body函数的功能是将邮件正文中的CRLF.CRLF替换为CRLF.CRLF,具体代码如下:CString CS

25、MTP:cook_body(CMailMessage * msg)ASSERT( msg != NULL );CString sTemp;CString sCooked = _T( "" );/需要删除的字符串标志LPTSTR szBad = _T( "rn.rn" );LPTSTR szGood = _T( "rn.rn" );int nPos;int nStart = 0;int nBadLength = strlen( szBad );sTemp = msg->m_sBody;/文件首部发现 该字符串标志if( sTemp

26、.Left( 3 ) = _T( ".rn" ) )sTemp = _T( "." ) + sTemp;/将 szBad替换为szGoodwhile( (nPos = sTemp.Find( szBad ) > -1 )sCooked = sTemp.Mid( nStart, nPos );sCooked += szGood;sTemp = sCooked + sTemp.Right( sTemp.GetLength() - (nPos + nBadLength) );return sTemp;CSMTP:Disconnect函数的功能是推出并断开

27、同SMTP服务器的连接。该函数首先向服务器发送QUIT命令,然后关闭Socket。具体代码如下:BOOL CSMTP:Disconnect()BOOL ret;if( !m_bConnected )return TRUE;/发送QUIT命令CString sQuit = _T( "QUITrn" );m_wsSMTPServer.Send( (LPCTSTR)sQuit, sQuit.GetLength() );/关闭Socketret = get_response( QUIT_SUCCESS );m_wsSMTPServer.Close();if( response_bu

28、f != NULL )delete response_buf;response_buf = NULL;m_bConnected = FALSE;return ret;(2).CMailMessage类CMIMEMessage类在电子邮件的发送和接收中,邮件本身就是一个较为复杂的实体。因此,为了结构化的需要,我们有CMailMessage类CMIMEMessage类对待发送的邮件进行了包装,其中CMailMessage类是CMIMEMessage类的父类,他封装了格式与RFC822定义的格式兼容的电子邮件。而CMIMEMessage类则对MIME扩展各式的邮件进行了包装。下面是对CMailMes

29、sage类的定义,其中virtual类型的函数将会被CMIMEMessage类重载。定义如下:class CMailMessage public:CMailMessage();virtual CMailMessage();/接收人的类型,枚举结构enum RECIPIENTS_TYPE TO, CC, BCC ; / <JFO>/格式化信息,调用了附件编码程序void FormatMessage();/获取接收人的数量int GetNumRecipients(RECIPIENTS_TYPE type = TO /* <JFO> */);/获取接收人信息BOOL GetR

30、ecipient( CString& sEmailAddress, CString& sFriendlyName, int nIndex = 0, RECIPIENTS_TYPE type = TO /* <JFO> */ );/添加接收人BOOL AddRecipient( LPCTSTR szEmailAddress, LPCTSTR szFriendlyName = "", RECIPIENTS_TYPE type = TO /* <JFO> */ );/添加多个接收人BOOL AddMultipleRecipients( LP

31、CTSTR szRecipients = NULL, RECIPIENTS_TYPE type = TO /* <JFO> */ );/获取每行的字符数UINT GetCharsPerLine();/设定每行的字符数void SetCharsPerLine( UINT nCharsPerLine );/发信人CString m_sFrom;/主题CString m_sSubject;CString m_sEnvelope;/发信程序名称CString m_sMailerName;/信件头CString m_sHeader;/时间戳CTime m_tDateTime;/邮件正文CSt

32、ring m_sBody;private:UINT m_nCharsPerLine;/接收人结构class CRecipientpublic:/接收人地址CString m_sEmailAddress;/接收人名称CString m_sFriendlyName;/TO 链表CArray <CRecipient, CRecipient&> m_Recipients;/CC链表CArray <CRecipient, CRecipient&> m_CCRecipients; /BCC链表CArray <CRecipient, CRecipient&

33、;> m_BCCRecipients; protected:/准备邮件头格式virtual void prepare_header();/准备邮件正文格式virtual void prepare_body();/结束邮件头virtual void end_header();/结束正文virtual void start_header();virtual void add_header_line( LPCTSTR szHeaderLine );在这个类的声明中,CMailMessage类提供了几个成员变量以保存成员变量以保存有件的主要参数,其中重要的包括如下:l m_sForm 保存发件人

34、的E-mail地址l m_sMailerName保存发件人的名称l m_Recipients保存收件人列表l m_sSubject:保存待发送邮件的主题l m_tDateTime保存发信日期时间l m_sHeader保存邮件头部l m_sBody保存邮件正文在成员函数中,GetNumRecipients(), GetRecipient(), AddRecipient() 以及AddMultipleRecipient()都和收件人列表有关,他们分别用来获取列表中的人数、收件人列表以及向列表中添加收件人。int CMailMessage:GetNumRecipients(RECIPIENTS_TY

35、PE type /* <JFO> */) /* old line ->return m_Recipients.GetSize(); int number = 0; switch(type) case TO: number = m_Recipients.GetSize(); break; case CC: number = m_CCRecipients.GetSize(); break; case BCC: number = m_BCCRecipients.GetSize(); break; return number; BOOL CMailMessage:GetRecipie

36、nt(CString & sEmailAddress, CString & sFriendlyName, int nIndex, RECIPIENTS_TYPE type /* <JFO> */)CRecipient to;if( nIndex < 0 | nIndex > m_Recipients.GetUpperBound() )return FALSE;/* Begin <JFO> /* old line -> to = m_Recipients nIndex ; switch(type) case TO: to = m_Reci

37、pients nIndex ; break; case CC: to = m_CCRecipients nIndex ; break; case BCC: to = m_BCCRecipients nIndex ; break; /* EndsEmailAddress = to.m_sEmailAddress;sFriendlyName = to.m_sFriendlyName;return TRUE;BOOL CMailMessage:AddRecipient( LPCTSTR szEmailAddress, LPCTSTR szFriendlyName)ASSERT( szEmailAdd

38、ress != NULL );ASSERT( szFriendlyName != NULL );CRecipient to;to.m_sEmailAddress = szEmailAddress;to.m_sFriendlyName = szFriendlyName;m_Recipients.Add( to );return TRUE;/添加多个接收人,szRecepients为接收人字符串,格式为:/名称1<接收人1地址>名称2<接收人2地址>.BOOL CMailMessage:AddMultipleRecipients(LPCTSTR szRecipients,

39、RECIPIENTS_TYPE type )TCHAR* buf;UINT pos;UINT start;CString sTemp;CString sEmail;CString sFriendly;UINT length;int nMark;int nMark2;ASSERT( szRecipients != NULL );length = strlen( szRecipients );buf = new TCHAR length + 1 ;strcpy( buf, szRecipients );/剥离出接收人for( pos = 0, start = 0; pos <= length

40、; pos+ )if( buf pos = '' |buf pos = 0 )buf pos = 0;sTemp = &buf start ;nMark = sTemp.Find( '<' );if( nMark >= 0 )/分离出名称sFriendly = sTemp.Left( nMark );nMark2 = sTemp.Find( '>' );if( nMark2 < nMark )delete buf;return FALSE;nMark2 > -1 ? nMark2 = nMark2 : nMa

41、rk2 = sTemp.GetLength() - 1;/分离出接收地址sEmail = sTemp.Mid( nMark + 1, nMark2 - (nMark + 1) );elsesEmail = sTemp;sFriendly = _T( "" );/添加接收人AddRecipient( sEmail, sFriendly, type );start = pos + 1;delete buf;return TRUE;上文提到的关于FormatMessage()函数,这里来做一介绍,这个函数用来对邮件进行格式化处理,他的定义如下:void CMailMessage:

42、FormatMessage()start_header();prepare_header();end_header();prepare_body();FormatMessage()函数调用了几个可被其子类重载的虚拟函数,在CmailMessage类中,这几个虚拟函数的定义非常简单,而在其子类CMIMEMessage中,正是由于这几个虚拟函数的重载才使得CMIMEMessage对原来的邮件格式进行了扩展。在CmailMessag中,这几个函数及其相关函数是这样定义的:void CMailMessage:start_header()m_sHeader = _T( "" );vo

43、id CMailMessage:end_header()m_sHeader += _T( "rn" );函数prepare_header()的功能是格式化邮件头信息。该函数为邮件添加FROM, TO, CC等邮件头信息。void CMailMessage:prepare_header()CString sTemp;sTemp = _T( "" );/ From:sTemp = _T( "From: " ) + m_sFrom;add_header_line( (LPCTSTR)sTemp );/ To:sTemp = _T( &quo

44、t;To: " );CString sEmail = _T( "" );CString sFriendly = _T( "" );for( int i = 0; i < GetNumRecipients(); i+ )GetRecipient( sEmail, sFriendly, i );sTemp += ( i > 0 ? _T( "," ) : _T( "" ) );sTemp += sFriendly;sTemp += _T( "<" );sTemp += s

45、Email;sTemp += _T( ">" );add_header_line( (LPCTSTR)sTemp );/ Date:m_tDateTime = m_tDateTime.GetCurrentTime();sTemp = _T( "Date: " );sTemp += m_tDateTime.Format( "%a, %d %b %y %H:%M:%S %Z" );add_header_line( (LPCTSTR)sTemp );/ Subject:sTemp = _T( "Subject: "

46、 ) + m_sSubject;add_header_line( (LPCTSTR)sTemp );/ X-MailersTemp = _T( "X-Mailer: " ) + m_sMailerName;add_header_line( (LPCTSTR)sTemp );void CMailMessage:prepare_body()/ Append a CR/LF to body if necessary.if( m_sBody.Right( 2 ) != _T( "rn" ) )m_sBody += _T( "rn" );E-M

47、ail传送过程中都要对附件文件进行编码,因为E-Mail只能传送ASCII码格式的文字信息,ASCII码为7位码。非ASCII码格式的文件在传送中必须经过编码编成相应的ASCII码后进行传输,在接受到后,接受后要进行编码。若不这样,就会在传输过程总出现编码截位的问题,导致接受方出现“乱码”问题。MIME(Multipurpose Internet Mail Extention)是常用的编码标准,MIME定义的是一种编码规格,也可以说是一类编码的统称,能过符合MIME标准的编码方式有多种,而只要符合MIME规格便可以顺利传送,在MIME定义下有两种编码方式Base64和QP(Quote-Prin

48、table),QP的规则是对资料中的7位无重复编码,仅将8位数据转成7位,QP编码适用传送非ASCII码的文字内容,例如中文文件。而Base64的规则是将整个文件重新编码成7位,通常用于传送二进制文件。后文详细介绍Base64算法。类CMIMEMessage继承与CMailMessage,该类主要完成将附件文件添加到邮件信息中的功能,定义如下:/ 继承于CMailMessageclass CMIMEMessage : public CMailMessage public:CMIMEMessage();virtual CMIMEMessage();/ MIME Type Codesenum eM

49、IMETypeCode/文本类型TEXT_PLAIN = 0,/二进制数据流APPLICATION_OCTETSTREAM,NEXT_FREE_MIME_CODE;/编码方式enum eMIMEEncodingCode_7BIT = 0,_8BIT,BINARY,QUOTED_PRINTABLE,BASE64,NEXT_FREE_ENCODING_CODE;/添加多媒体信息BOOL AddMIMEPart( LPCTSTR szContent,int nContentType = APPLICATION_OCTETSTREAM,LPCTSTR szParameters = _T( "

50、" ), int nEncoding = BASE64, BOOL bPath = TRUE );protected: void insert_message_end( CString& sText );void register_mime_type( CMIMEContentAgent* pMIMEType );void insert_boundary( CString& sText );virtual void append_mime_parts();virtual void prepare_header();virtual void prepare_body()

51、;CString m_sNoMIMEText;/信息边界标志CString m_sPartBoundary;/MIME typeCString m_sMIMEContentType;private:/多媒体信息管理class CMIMEPartpublic:/编码类型int m_nEncoding;/媒体类型int m_nContentType;CString m_sParameters;BOOL m_bPath;CString m_sContent;/媒体链表CList <CMIMEPart, CMIMEPart&> m_MIMEPartList;class CMIMET

52、ypeManagerpublic:CMIMEContentAgent* GetHandler( int nContentType );void RegisterMIMEType( CMIMEContentAgent* pMIMEType);virtual CMIMETypeManager();CMIMETypeManager();private:CCriticalSection m_csAccess;CList < CMIMEContentAgent*, CMIMEContentAgent* > m_MIMETypeList;static CMIMETypeManager m_MI

53、METypeManager;该类中绝大多数函数的功能都是进行数据链表的操作,并没有实质性的算法操作。AddMIMEPart函数的功能是添加附件信息,该函数将需要发送的附件信息(文件路径等)添加到附件链表中,但是不进行编码。具体代码如下:BOOL CMIMEMessage:AddMIMEPart(LPCTSTR szContent, int nContentType, LPCTSTR szParameters, int nEncoding, BOOL bPath )CMIMEPart part;part.m_nContentType = nContentType;part.m_sParameters = szParameters;part.m_nEncoding = nEncoding;part.m_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论