




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC+编写电子邮件程序 时间:2008-08-27作者:佚名 编辑:本站 点击:635 评论VC+编写电子邮件程序 一、概述- 本文主要讲述如何使用Visual C+用MAPI编写E-mail程序。MAPI是包含在Windows之中的,因此不需要安装其他额外的部件。MAPI有以下三种形式:SMAPI,Simple MAPI,简单的MAPICMC,Common Messaging Calls,一般通讯调用完整的MAPI- SMAPI和CMC都包含在完整的MAPI中,当用户想执行一些高级操作,比如编写自己的E-mail服务器的时候,必须使用完整的MAPI。本文主要阐述如何编写能够收发电子邮件的程序,因此使用SMAPI就足够了。二、编写电子邮件程序3-1 初始化MAPI- 要使用MAPI,必须首先对它进行初始化。初始化包括以下三个步骤:装载MAPI32.DLL动态链接库找到想要调用的MAPI函数地址登录到电子邮件对象3-1-1 装载MAPI32.DLL- 要装载MAPI,用户必须程序运行时动态的装载一个动态链接库。LoadLibrary函数提供了此功能,它定位一个动态链接库,并返回HINSTANCE局柄(需要保存该句柄)。LoadLibrary的语法如下:LoadLibrary ( lpLibFileName );其中lpLibFileName为LPCTSTR结构变量,是所要调用的库的路径和名称。程序示例:/ 调用MAPI32.DLL并计算函数地址HINSTANCE hInstMail;hInstMail = :LoadLibrary ( “MAPI32.DLL” );if ( hInstMail = NULL )/ 错误处理/ 受篇幅限制,下面的错误处理部分省略3-1-2 确定函数地址- 由于MAPI32.DLL是被动态装载的,因此不知道所要调用的函数地址,也就不能一开始就调用它们,而要通过函数名获得函数的地址,并在动态链接库中查找每一个函数并核实。因此首先必须为这些函数声明指针程序示例:/ 为MAPI32.DLL中的函数声明函数指针ULONG (PASCAL *lpfnMAPISendMail) (LHANDLE lhSession,ULONG ulUIParam, lpMapiMessage lpMessage,FLAGS flFlags, ULONG ulReserved);ULONG (PASCAL *lpfnMAPIResolveName) (LHANDLE lhSession,ULONG ulUIParam, LPTSTR lpszName,FLAGS ulFlags, ULONG ulReserved,lpMapiRecipDesc FAR *lppRecip);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);ULONG (FAR PASCAL *lpfnMAPIAddress)(LHANDLE lhSession,ULONG ulUIParam, LPSTR lpszCaption,ULONG nEditFields, LPSTR lpszLabels,ULONG nRecips, lpMapiRecipDesc lpRecips,FLAGS flFlags, ULONG ulReserved,LPULONG lpnNewRecips,lpMapiRecipDesc FAR *lppNewRecips);ULONG (FAR PASCAL *lpfnMAPIFindNext)(LHANDLE lhSession,ULONG ulUIParam, LPSTR lpszMessageType,LPSTR lpszSeedMessageID, FLAGS flFlags,ULONG ulReserved, LPSTR lpszMessageID);ULONG (FAR PASCAL *lpfnMAPIReadMail)(LHANDLE lhSession,ULONG ulUIParam, LPSTR lpszMessageID,FLAGS flFlags, ULONG ulReserved,lpMapiMessage FAR *lppMessage);- 为了决定每一个函数的地址,必须为每一个函数调用GetProcAddress。GetProcAddress的语法为:GetProcAddress (hModule, lpProcName);其中,hModule为HMODULE结构,是所调用DLL模块的句柄;lpProcName为LPCSTR结构,是函数名称。程序示例:/ 找到MAPI32.DLL函数的地址,并将它们保存在函数指针变量里(FARPROC&) lpfnMAPISendMail = GetProcAddress(hInstMail,“MAPISendMail”);(FARPROC&) lpfnMAPIResolveName = GetProcAddress(hInstMail, “MAPIResolveName”);(FARPROC&) lpfnMAPILogon = GetProcAddress(hInstMail,“MAPILogon”);(FARPROC&) lpfnMAPILogoff = GetProcAddress(hInstMail,“MAPILogoff”);(FARPROC&) lpfnMAPIFreeBuffer = GetProcAddress(hInstMail, “MAPIFreeBuffer”);(FARPROC&) lpfnMAPIAddress = GetProcAddress(hInstMail,“MAPIAddress”);(FARPROC&) lpfnMAPIFindNext = GetProcAddress(hInstMail,“MAPIFindNext”);(FARPROC&) lpfnMAPIReadMail = GetProcAddress(hInstMail,“MAPIReadMail”);3-1-3 登录到电子邮件对象- 用户必须在电子邮件系统中登录,才能实现MAPI的各种功能。MAPI提供了登录的三种选择:登录到一个已经存在的对象。登录到一个新对象,用编程的方法确定解释新信息。使用对话框提示用户登录。- 我们通常选择登录到一个已经存在的电子邮件对象,因为网络合作用户通常会保持自己的电子邮件程序处于激活状态。登录通常使用MAPI提供的函数lpfnMAPILogon。lpfnMAPILogon的语法为:lpfnMAPILogon (lpszProfileName, lpszPassword, flFlags,ulReserved, lplhSession );- 其中,lpszProfileName指向一个256字符以内的登录名称,lpszPassword指向密码,它们均为LPTSTR结构。flFlags为FLAGS结构,其值详见表1。ulReserved必须为0。lplhSession为输出SMAPI的句柄。表1:lpfnMAPILogon函数中flFlags的值值 意义MAPI_FORCE_DOWNLOAD在函数调用返回之前下载用户的所有邮件。如果MAPI_FORCE_DOWNLOAD没有被设置,那么信件能够在函数调用返回后在后台被下载。MAPI_NEW_SESSION 建立一个新会话,而不是获得环境的共享会话。如果MAPI_NEW_SESSION没有被设置,MAPILogon使用现有的共享会话。MAPI_LOGON_UI 显示一个登录对话框来提示用户输入登录信息。例如Outlook检查用户电子邮件时便是如此。MAPI_PASSWORD_UI MAPILogon只允许用户输入电子邮件的密码,而不许改动账号。程序示例:LHANDLE lhSession;ULONG lResult = lpfnMAPILogon(0, NULL, NULL, 0, 0,&lhSession);if (lResult != SUCCESS_SUCCESS)/SUCCESS_SUCCESS在MAPI.H中被定义/ 错误处理3-2 阅读电子邮件- MAPIFindNext和MAPIReadMail使用与阅读E-mail的两个基本函数。MAPIFindNext用于定位第一封或下一封电子邮件并返回标识号,MAPIReadMail返回以该标识号为基础的电子邮件的内容。另外,一个常用的函数是MAPIFreeBuffer,用于释放内存。3-2-1 定位到第一封信- 要找到第一封信,需要使用MAPIFindNext函数,其函数声明如下:ULONG FAR PASCAL MAPIFindNext(LHANDLE lhSession,ULONG ulUIParam, LPTSTR lpszMessageType,LPTSTR lpszSeedMessageID, FLAGS flFlags,ULONG ulReserved, LPTSTR lpszMessageID )- 其中,lhSession为提交SMAPI的会话句柄 ;ulUIParam为父窗体的句柄;lpszMessageType指向一个字符串,用来鉴别邮件类型,并加以查找;lpszSeedMessageID为指向起始信息ID的指针,其值为0时,MAPIFindNext获得第一封电子邮件;flFlags的值见表2;ulReserved必须为0;lpszMessageID为输出值,它是指向信息ID地址的指针。- 表2:MAPIFindNext函数中flFlags的值值 意义MAPI_GUARANTEE_FIFO 按邮件发送的时间顺序接受电子邮件。MAPI_LONG_MSGID 返回信件标识符可达512字符。MAPI_UNREAD_ONLY 只列举没有阅读过的电子邮件。程序示例:/ 找到第一条没有阅读的电子邮件char pMessageID 513;ULONG lResult = lpfnMAPIFindNext(lhSession, NULL, NULL,NULL, MAPI_LONG_MSGID | MAPI_UNREAD_ONLY,0, pMessageID);3-2-2 阅读信息当信件ID被获取后,就可以调用MAPIReadMail阅读实际的E-mail信息了。MAPIReadMail的函数声明如下:ULONG FAR PASCAL MAPIReadMail(LHANDLE lhSession,ULONG ulUIParam, LPTSTR lpszMessageID,FLAGS flFlags, ULONG ulReserved,lpMapiMessage FAR * lppMessage);其中,lppMessage为指向MapiMessage的指针;除flFlags外的其他参数与lpfnFindNext函数的同名参数意义相同,flFlags参数的值见表3:表3:MAPIReadMail函数中flFlags的值:值 意义MAPI_BODY_AS_FILE 将邮件信息写到一个临时文件中,并且将它作为第一个附件添加到附件列表中。MAPI_ENVELOPE_ONLY 只读取邮件标题。MAPI_PEEK 读完邮件之后不把它标记为“已读”。MAPI_SUPPRESS_ATTACH MAPIReadMail函数不拷贝附件,但是将邮件文本写入MapiMessage结构中。程序示例:/ 读取电子邮件long nFlags = MAPI_SUPPRESS_ATTACH;if (!bMarkAsRead)nFlags = nFlags | MAPI_PEEK;lResult = lpfnMAPIReadMail(lhSession, NULL, pMessageID,nFlags, 0, &pMessage);if (lResult != SUCCESS_SUCCESS);return false;如果调用成功,就可以访问MapiMessage结构了(使用pMessage):pMessage- ulReserved:0pMessage- lpszSubject:邮件标题pMessage- lpszNoteText:邮件信息pMessage- lpszMessageType:邮件类型pMessage- DateReceived:接收时间pMessage- lpszConversationID:邮件所属的会话线程IDpMessage- flFlags:其值见表4表4:MapiMessage结构中的flFlags值 意义MAPI_RECEIPT_REQUESTED 接收通知被申请。客户端应用程序在发送消息时设置该项。MAPI_SENT 邮件已被发送。MAPI_UNREAD 邮件是“未读”状态。pMessage- lpOriginator:指向MapiRecipDesc结构,包含发件人信息。pMessage- nRecipCount:信件者数目。pMessage- lpRecips:指向MapiRecipDesc结构数组,包含接收者信息。pMessage- nFileCount:附件数量。pMessage- lpFiles:指向MapiFileDesc结构数组,每一个结构包含一个文件附件。3-2-3 释放内存- 在访问另一条信件以前应当释放内存,否则会出现内存泄漏。程序示例:/ 释放内存lpfnMAPIFreeBuffer(pMessage);3-2-4 定位到下一条信件定位到下一条信件依然使用MAPIFindNext函数,该函数声明及参数意义详见3-2-1节。下面示范如何定位到下一条信件。 程序示例:/ 定位到下一条没有阅读的信件ULONG lResult = lpfnMAPIFindNext(lhSession, NULL, NULL,pMessageID, MAPI_LONG_MSGID|MAPI_UNREAD_ONLY,0, pMessageID);3-3 发送电子邮件- 发送电子邮件的一般步骤:- 1 建立MapiMessage结构对象- 2 调用MAPIResolveName使发送者名称合法- 3 添加附件- 4 调用MAPISendMail发送电子邮件- 5 调用MAPIFreeBuffer释放内存- 下面详细分别详细阐述。3-3-1 建立MapiMessage结构对象- 对于MapiMessage结构,3-2-2节已经做过介绍,下面一步步介绍如何设置其中的值:- 1 为MapiMessage对象分配内存:MapiMessage message;Memset(&message, 0, sizeof(message);- 2 将ulReserved设置为0:message.ulReserved = 0;- 3 设置信息类型指针lpszMessageType,可以为NULL:message.lpszMessageType = NULL;- 4 设置信件标题(lpszSubject):char subject512;strcpy(subject, sSubject);message.lpszSubject = subject;- 5 设置信件内容:char text5000;strcpy(text, sMessage);message.lpszNoteText = text;- 6 设置flFlags标识,详见3-2-2节中表4:message.flFlags = MAPI_SENT;- 7 用一个指向MapiRecipDesc结构的指针设置发送者信息(lpOriginator),或将其设置为NULL:message.lpOriginator = N文章出处:DIY部落(/course/3_program/vc/vc_js/2008827/137716.html)+ SMTP协议电子邮件传送剖析2002-11-19 18:05作者:信息产业部电子第二十二研究所青出处:yesky责任编辑:方舟摘要:本文介绍了一种采用SMTP协议规范并通过直接使用SMTP协议命令而在程序中实现电子邮件传送的方法。并在VC+开发环境下给出了部分关键的实现代码。前言电子邮件服务作为Internet上应用最多和最广的服务项目得到了非常广泛的应用,在网络应用中也起到非常重要的作用。如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、POP(Post Office Protocol,邮局协议)和IMAP(Internet Message Access Protocal,消息访问协议)等,这些协议应用于电子邮件的发送和接收。一些邮件处理软件如OutLook Express和FoxMail等就是按照SMTP和POP3 协议结合Windows Sockets套接字进行设计来收发邮件的。本文以SMTP协议为研究对象,在Visual C+ 6.0编程环境下按照SMTP协议通过套接字发送SMTP命令,接收并处理邮件服务器的反馈信息,从而实现对电子邮件的发送。SMTP协议的通讯模型和会话流程SMTP协议通讯模型SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。可大致用下面的通讯模型示意图来表示:SMTP协议的命令和应答从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的 SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:SMTP命令命令说明HELLO domain CRLF识别发送方到接收SMTP的一个HELLO命令MAIL FROM:reverse-pathCRLF reverse-path为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。RCPT TO:forward-pathCRLF forward-path标识各个邮件接收者的地址DATA CRLF 接收SMTP将把其后的行为看作邮件数据去处理,以CRLF.CRLF标识数据的结尾。REST CRLF退出/复位当前的邮件传输NOOP CRLF要求接收SMTP仅做OK应答。(用于测试)QUIT CRLF要求接收SMTP返回一个OK应答并关闭传输。VRFY string CRLF 验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。EXPN string CRLF 验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。HELP CRLF查询服务器支持什么命令注:CRLF为回车、换行,ASCII码分别为13、10(十进制)。SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下:应答码说明501 参数格式错误502 命令不可实现503 错误的命令序列504 命令参数不可实现211 系统状态或系统帮助响应214 帮助信息220domain服务就绪221 domain服务关闭421 domain服务未就绪,关闭传输信道250要求的邮件操作完成251 用户非本地,将转发向forward-path450 要求的邮件操作未完成,邮箱不可用550 要求的邮件操作未完成,邮箱不可用451 放弃要求的操作;处理过程中出错551 用户非本地,请尝试forward-path 452 系统存储不足,要求的操作未执行552 过量的存储分配,要求的操作未执行553 邮箱名不可用,要求的操作未执行354 开始邮件输入,以.结束554 操作失败VC+ SMTP协议电子邮件传送剖析2002-11-19 18:05作者:信息产业部电子第二十二研究所青出处:yesky责任编辑:方舟在应用程序中使用SMTP协议SMTP协议的会话流程在进行程序设计之前有必要弄清SMTP协议的会话流程,其实前面介绍的内容已经可以大致勾勒出用SMTP发送邮件的框架了,对于一次普通的邮件发送,其过程大致为:先建立TCP连接,随后客户端发出HELLO命令以标识发件人自己的身份,并继续由客户端发送MAIL命令,如服务器应答为OK,可继续发送RCPT命令来标识电子邮件的收件人,在这里可以有多个RCPT行,而服务器端则表示是否愿意为收件人接受该邮件。在双方协商结束后,用命令DATA将邮件发送出去,其中对表示结束的.也一并发送出去。随后结束本次发送过程,以QUIT命令退出。下面通过一个实例,从发送邮件到来更详细直观地描述此会话流程:R:220 Simple Mail Transfer Service ReadyS:HELLO R:250 S:MAIL FROM:R:250 OKS:RCPT TO:R:250 OKS:DATAR:354 Start mail input;end with CRLF.CRLFS:R:250 OKS:QUITR:221 Service closing transmission channel邮件的格式化由于电子邮件结构上的特殊性,在传输时是不能当作简单的文本来直接处理的,而必须按照一定的格式对邮件头和邮件体进行格式化处理之后才可以被发送。需要进行格式化的部分主要有:发件人地址、收件人地址、主题和发送日期等。在RFC文档的RFC 822里对邮件的格式化有详尽的说明,有关详情请参阅该文档。下面通过VC+6.0按照RFC 822文档规定将格式化邮件的部分编写如下(部分代码):/邮件头准备strTemp = _T( From: ) + m_strFrom; file:/发件人地址add_header_line( (LPCTSTR)strTemp );strTemp = _T( To: ) + m_strTo; file:/收件人地址add_header_line( (LPCTSTR)strTemp );m_tDateTime = m_tDateTime.GetCurrentTime();/发送时间strTemp = _T( Data: );strTemp += m_tDateTime.Format( %a, %d %b %y %H:%M:%S %Z );add_header_line( (LPCTSTR)strTemp );strTemp = _T( Subject: ) + m_strSubject; file:/主题add_header_line( (LPCTSTR)strTemp );file:/邮件头结束m_strHeader += _T( rn );file:/邮件体准备if( m_strBody.Right( 2 ) != _T( rn ) ) file:/确认最后以回车换行结束m_strBody += _T( rn ); 其中add_header_line(LPCTSTR szHeaderLine)函数用于把szHeaderLine指向的字串追加到m_strHeader后面。其中,格式化后的邮件头保存在m_strHeader里,格式化后的邮件体保存在m_strBody中。由Socket套接字为SMTP提供网络通讯基础许多网络程序都是采用Socket套接字实现的,对于一些标准的网络协议如HTTP、FTP和SMTP等协议的编程也是基于套接字程序的,只是端口号不再是随意设定而要由协议来指定,比如HTTP端口在80、FTP是21,而SMTP则是25。Socket只是提供在指定的端口上同指定的服务器从事网络上的通讯能力,至于客户和服务器之间是如何通讯的则由网络协议来规定,这对于套接字是完全透明的。因此可以使用Socket套接字为程序提供网络通讯的能力,而对于网络通讯连路建立好之后采取什么样的通讯应答则要按SMTP协议的规定去执行了。Socket套接字网络编程方面的文章资料非常丰富,限于本文篇幅,在此不再赘述,有关详情请参阅相关文档。为简便起见,没有采用编写较复杂的Windows Sockets API进行编程,而是使用经过较好封装的MFC 的CSocket类。在正式使用套接字之前,也要先用AfxSocketInit()函数对套接字进行初始化,然后用Create()创建套接字对象,并由该套接字通过Connect()建立同邮件服务器的连接。如果一切正常,再后续的工作中就是遵循SMTP协议的约定来使用Send()、Receive()函数来发送SMTP命令和接收邮件服务器发来的应答码以完成对邮件的传送。SMTP会话应答的实现在同邮件服务器建立好链路连接后就可以按前面介绍过的会话流程进行程序设计了,对于SMTP命令的发送,可按命令格式将其组帧完毕后用CSocket类的Send()函数将其发送到服务器,并通过CSocket类的Receive()函数接收从邮件服务器发来的应答码,并根据SMTP协议的应答码表对其做出响应的处理。下面是用于接收应答码的函数get_response()的部分实现代码:BOOL CSMTP:get_response( UINT response_expected )/输入参数为希望的应答码/ m_wsSMTPServer为CSocket的类对象,调用Receive()将应答码接收到缓存/ response_buf中m_wsSMTPServer.Receive( response_buf, RESPONSE_BUFFER_SIZE )sResponse = response_buf;sscanf( (LPCTSTR)sResponse.Left( 3 ), _T( %d ), &response );pResp = &response_table response_expected ;file:/检验收到的应答码是否是所希望得到的if( response != pResp-nResponse )/不相等的话进行错误处理return FALSE;return TRUE;会话的各个部分比较类似,都是命令-应答方式,而且均成对出现,下面是本文的重点也是实现的关键部分-在程序控制下完成对SMTP命令的格式化以及对命令的发送和对邮件服务器应答码的检验处理:/格式化并发送HELLO命令,并接收、验证服务器应答码gethostname( local_host, 80 );sHello.Format( _T( HELO %srn ), local_host );m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() );if( !get_response( GENERIC_SUCCESS ) ) file:/检验应答码是否为250return FALSE;file:/格式化并发送MAIL命令,并接收、验证服务器应答码sFrom.Format( _T( MAIL From: %srn ), (LPCTSTR)msg-m_strFrom );m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );if( !get_response( GENERIC_SUCCESS ) ) file:/检验应答码是否为250return FALSE;file:/格式化并发送RCPT命令,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 对悲剧的深沉纪念课件
- 2025年宝马技工试题及答案
- led屏考试题及答案
- 工程照明配送运营方案(3篇)
- 工业通风 试题及答案
- 2025年自然地理学试卷及答案
- 工程清退班组方案(3篇)
- 广东采购管理试卷及答案
- 英语b级翻译真题及答案
- 2025年铝材厂考试题目及答案
- 2025年公证处聘用制书记员招聘考试要点及面试模拟题解析
- 2025江西吉安庐陵新区招聘社区工作者(专职网格员)招聘22人考试参考试题及答案解析
- 2025-2026学年广美版(2024)小学美术二年级上册教学计划及进度表
- 2025年手电筒行业研究报告及未来行业发展趋势预测
- 设备使用与保养培训课件
- 酒店客户服务质量提升培训课件
- GB/T 9258.2-2025涂附磨具用磨料粒度组成的检测和标记第2部分:粗磨粒P12~P220
- 2025山西太原西山生态文旅投资建设有限公司及子公司招聘13人笔试参考题库附带答案详解
- 2025 年小升初吕梁市初一新生分班考试语文试卷(带答案解析)-(部编版)
- 2025秋全体教师大会上,德育副校长讲话:德为根,安为本,心为灯,家为桥-这场开学讲话,句句都是育人的方向
- 2025年政工师考试试题及参考答案
评论
0/150
提交评论