SMTP协议发送电子邮件 源代码
- 格式:doc
- 大小:33.50 KB
- 文档页数:4
RFC821简单邮件传输协议(SMTP)(RFC821 SIMPLE MAIL TRANSF ER PROTOC OL)目录1. 介绍 22. SMTP模型 33. SMTP过程 43.1. MAIL 43.2. 转发 53.3. 确认和扩展 63.4. 发送信件(mailin g)和获得信件(sendin g) 7 3.5. 打开和关闭73.6. 转发 83.7. 域93.8. 改变角色94. SMTP说明94.1. SMTP命令94.1.1. 命令语法94.1.2. COMMAN D语法格式134.2. SMTP响应154.3. 命令和应答序列164.4. 状态图174.5. 详细内容184.5.1. 最小实现184.5.2. 透明性194.5.3. 大小19附录 A TCP传输服务19附录 B NCP传输服务20附录 C NITS 20附录 D X.25传输服务 20附录 E 应答码构成方法20附录 F 一些例子22参考资料361. 介绍简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
附录A,B,C和D描述了不同传送服务下SMT P的使用。
在名词表中还定义了本文档中使用的术语。
SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。
理解到传送系统(或IPCE)不是一对一的是很重要的。
进程可能直接和其它进程通过已知的IPCE通信。
邮件是一个应用程序或进程间通信。
邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。
更特别的是,邮件可以通过不同网络上的主机接力式传送。
2. SMTP模型SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。
RFC821 简单邮件传输协议(SMTP)(RFC821 SIMPLE MAIL TRANSFER PROTOCOL)目录1. 介绍22. SMTP模型33. SMTP过程43.1. MAIL43.2. 转发53.3. 确认和扩展63.4. 发送信件(mailing)和获得信件(sending)7 3.5. 打开和关闭73.6. 转发83.7. 域93.8. 改变角色94. SMTP说明94.1. SMTP命令94.1.1. 命令语法94.1.2. COMMAND语法格式134.2. SMTP响应154.3. 命令和应答序列164.4. 状态图174.5. 详细内容184.5.1. 最小实现184.5.2. 透明性194.5.3. 大小19附录 A TCP传输服务19附录 B NCP传输服务20附录 C NITS20附录 D X.25传输服务20附录 E 应答码构成方法20附录 F 一些例子22参考资料361. 介绍简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
附录A,B,C和D描述了不同传送服务下SMTP的使用。
在名词表中还定义了本文档中使用的术语。
SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。
理解到传送系统(或IPCE)不是一对一的是很重要的。
进程可能直接和其它进程通过已知的IPCE通信。
邮件是一个应用程序或进程间通信。
邮件可以通过连接在不同IP CE上的进程跨网络进行邮件传送。
更特别的是,邮件可以通过不同网络上的主机接力式传送。
2. SMTP模型SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。
接收SMTP可以是最终接收者也可以是中间传送者。
SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。
2024年软件资格考试信息技术支持工程师(基础知识、应用技术)合卷(中级)模拟试卷(答案在后面)一、基础知识(客观选择题,75题,每题1分,共75分)1、在计算机网络中,下列哪个协议用于将域名转换为IP地址?A. HTTPB. FTPC. DNSD. SMTP2、关于操作系统中的进程管理,以下哪一项描述是不正确的?A. 进程是一个程序的一次执行过程。
B. 操作系统通过进程控制块(PCB)来管理和控制进程。
C. 一个进程中可以包含多个线程,这些线程共享该进程的资源。
D. 当前正在CPU上执行的进程状态一定是就绪态。
3、以下哪个技术不是网络层的技术?A. TCP/IPB. IPX/SPXC. HTTPD. FTP4、在下列网络拓扑结构中,哪一种结构适用于大型企业网络?A. 星型拓扑B. 环型拓扑C. 网状拓扑D. 树型拓扑5、在下列选项中,哪一个协议主要用于发送电子邮件?A、FTPB、HTTPC、SMTPD、POP36、在数据库管理系统(DBMS)中,用来定义数据库结构的语言称为:A、查询语言B、过程语言C、数据定义语言D、数据操纵语言7、以下哪个协议主要用于在网络中传输电子邮件?A. HTTPB. FTPC. SMTPD. TCP8、在软件工程中,以下哪个阶段通常被认为是需求分析?A. 软件设计B. 软件测试C. 软件编码D. 软件需求分析9、在计算机网络中,OSI模型的哪一层负责提供逻辑地址以便源节点和目的节点之间的数据包正确传输?A. 物理层B. 数据链路层C. 网络层D. 传输层 10、下列哪个命令用于在Linux系统中查看当前工作目录?A. lsB. cdC. pwdD. mkdir11、在计算机网络中,下列哪种设备用于将数字信号转换为模拟信号,以便在模拟信道上传输?A. 调制解调器(Modem)B. 路由器(Router)C. 交换机(Switch)D. 网关(Gateway)12、以下哪种编程语言被广泛用于开发操作系统内核?A. JavaB. C语言C. PythonD. JavaScript13、关于计算机网络协议的说法正确的是:A. 网络协议仅由语法组成。
SMT表面组装技术SMTP简单邮件传输协议SMTP(SimpleMailTransferProtocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。
通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。
SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。
目录展开规定的命令是以明文方式进行的。
为了说明SMTP的工作原理,我们以向163发送邮件为实例进行说明。
在linux环境下,使用"telnetsmtp.163.25"连接smtp.163.的25号端口(SMTP 的标准服务端口);在windows下使用telnet程序,远程主机指定为smtp.163.,而端口号指定为25,然后连接smtp.163.:交互过程如下:SMTP[lix@nslix]$telnetsmtp.163.25220163.Anti-spamGTforCoremailSystem(163[071018]) HELOsmtp.163.250OKauthlogin334dXNlcm5hbWU6USERbase64加密后的用户名334UGFzc3dvcmQ6PASSbase64加密后的密码235AuthenticationsuccessfulMAILFROM:XXX@163.250MailOKRCPTTO:XXX@163.250MailOKDATA354Enddatawith.QUITSMTP250MailOKqueuedassmtp5,D9GowLArizfIFTpIxFX8AA==.41385S212117 66217HELO是客户向对方邮件服务器发出的标识自己的身份的命令,这里假设发送者为ideal;MAILFROM命令用来表示发送者的邮件地址;RCPTTO:标识接收者的邮件地址,这里表示希望发送邮件给XXX@163.,如果邮件接收者不是本地用户,例如RCPTTO:ideal,则说明希望对方邮件服务器为自己转发(Relay)邮件,若该机器允许转发这样的邮件,则表示该邮件服务器是OPENRELAY的,否则说明该服务器不允许RELAY;DATA表示下面是邮件的数据部分,输入完毕以后,以一个"."开始的行作为数据部分的结束标识;QUIT表示退出这次会话,结束邮件发送。
常⽤邮件协议SMTPSMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。
它是⼀组⽤于从源地址到⽬的地址传输邮件的规范,通过它来控制邮件的中转⽅式。
SMTP 帮助每台计算机在发送或中转信件时找到下⼀个⽬的地。
SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。
SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者⽆可乘之机。
增加 SMTP 认证的⽬的是为了使⽤户避免受到垃圾邮件的侵扰。
SMTP协议属于TCP/IP协议族,通信双⽅采⽤⼀问⼀答的命令/响应形式进⾏对话,且定了对话的规则和所有命令/响应的语法格式。
所以发邮件前,发送⽅先登录到SMTP服务器。
SMTP协议是⼀个基于TCP/IP的应⽤层协议,SMTP服务器默认的⽹络监听端⼝号为25。
POP3POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个⼈计算机连接到Internet的邮件服务器和下载电⼦邮件的电⼦协议。
它是因特⽹电⼦邮件的第⼀个离线协议标准,POP3允许⽤户从服务器上把邮件存储到本地主机(即⾃⼰的计算机)上,同时删除保存在邮件服务器上的邮件,⽽POP3服务器则是遵循POP3协议的接收邮件服务器,⽤来接收电⼦邮件的。
IMAPIMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之⼀。
不同的是,开启了IMAP 后,您在电⼦邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。
所以⽆论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是⼀致的。
IMAP和POP3有区别总之,IMAP 整体上为⽤户带来更为便捷和可靠的体验。
SMTP协议SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是互联网上邮件传输的标准协议。
它定义了电子邮件是如何通过网络发送和接收的规则。
在本文中,我们将详细介绍SMTP协议的工作原理和常见用途。
1. SMTP协议的基本原理SMTP协议是一种客户端-服务器协议,主要用于发送邮件。
它基于TCP/IP协议栈,使用25号端口进行通信。
SMTP协议的基本原理如下:1.客户端连接服务器:客户端应用程序通过建立与邮件服务器的TCP连接,连接到服务器的25号端口。
2.服务器欢迎信息:服务器接受客户端连接后,发送欢迎信息,通知客户端连接成功。
3.客户端身份验证:客户端向服务器发送身份验证信息,以验证自己的身份。
常见的身份验证机制包括登录名和密码的组合。
4.服务器身份验证:服务器接收到客户端的身份验证信息后,进行身份验证。
如果验证成功,服务器将继续处理客户端的请求。
5.邮件发送:客户端向服务器发送邮件内容,包括发件人、收件人、主题和正文等信息。
6.邮件传输:服务器接收到邮件内容后,将其传输到目标邮件服务器。
7.服务器响应:目标邮件服务器接收到邮件后,将发送响应给源邮件服务器,以确认邮件是否成功传输。
8.交互结束:客户端和服务器之间的交互结束后,可以关闭TCP连接。
2. SMTP协议的用途SMTP协议作为电子邮件系统的核心协议,主要用于以下几个方面:•发送邮件: SMTP协议允许用户通过邮件客户端发送电子邮件。
用户只需配置邮件客户端的SMTP服务器地址和端口,即可发送邮件。
•邮件路由: SMTP协议定义了邮件的传输路径,通过邮件服务器之间的交互,将邮件从源邮件服务器传输到目标邮件服务器。
•邮件中继: SMTP协议支持邮件的中继传输。
如果源邮件服务器无法直接将邮件传输到目标邮件服务器,它可以将邮件发送给其他中间邮件服务器,由中间邮件服务器负责将邮件传输到目标邮件服务器。
•反垃圾邮件: SMTP协议可以用于反垃圾邮件的过滤。
端口对应协议范文下面是一些常见的端口和对应的协议:-端口号20和21:用于文件传输协议(FTP),20端口负责数据传输,21端口负责命令传输。
-端口号22:用于安全外壳协议(SSH),用于远程登录和安全传输文件。
-端口号25:用于简单邮件传输协议(SMTP),用于在计算机之间传送电子邮件。
-端口号53:用于域名系统(DNS),将域名转换为IP地址。
- 端口号80:用于超文本传输协议(HTTP),用于在Web浏览器和Web服务器之间传输网页和其他资源。
-端口号110:用于邮局协议版本3(POP3),用于从邮件服务器接收电子邮件。
-端口号143和220:用于互联网消息访问协议(IMAP),143端口用于从邮件服务器接收电子邮件,220端口用于建立连接。
- 端口号443:用于安全套接字层(SSL)和传输层安全(TLS)的HTTPS通信,用于安全的Web浏览。
-端口号3389:用于远程桌面协议(RDP),用于远程访问和控制其他计算机。
- 端口号5432:用于开放源代码的关系型数据库管理系统PostgreSQL的默认通信端口。
此外,还有一些用于特定服务或协议的其他端口,例如:-端口号69:用于网络文件系统(NFS)。
-端口号123:用于网络时间协议(NTP),同步计算机上的时间。
-端口号161和162:用于简单网络管理协议(SNMP),用于网络设备的监控和管理。
-端口号5353:用于多播DNS(mDNS),用于局域网中的设备发现和服务注冊。
-端口号5900:用于远程桌面协议(VNC),用于远程访问和控制其他计算机。
-端口号6667和6697:用于互联网中继聊天(IRC)。
需要注意的是,同一个端口号可以在不同的协议中使用,因为协议是通过网络包中的头部信息进行区分的。
此外,还可以通过端口转发、端口映射等技术来使得不同的协议使用相同的端口号进行通信。
2024年国家电网招聘之电网计算机题库综合试卷A卷附答案单选题(共100题)1、在计算机领域中通常用MIPS来描述()。
A.计算机的可运行性B.计算机的运算速度C.计算机的可靠性D.计算机的可扩充性【答案】 B2、设模拟信号的最高频率为10MHz,采样频率必须大于()时,才能使得到的样本信号不失真,如果每个样本量化为256个等级,则信道的数据速率是(请作答此空)。
A.40Mb/sB.80 Mb/sC.160 Mb/sD.320 Mb/s【答案】 C3、在因特网中,下列哪个不是 IP 层所需解决的问题()。
A.流量控制B.路径选择C.寻址D.分段和重新组装【答案】 A4、设有学生关系S(SNO,SNAME,DEPT)和选课关系SC(SNO,CNO,GRADE)能正确执行的S的语句是()。
A.SELECTCNO,AVG(GRADE)FROMSCGROUPBYCNO;B.SELECTSNAME,DEPTFROMS,SCWHEREGRADE>80;C.SELECTFROMSWHEREIN(SELECTSNOFROMSCWHEREGRADE=90)D.SLECTCNO,COUNT(*)FROMSCWHERECOUNT(*)>50;【答案】 B5、从数据库中删除表的命令是()。
A.DROP TABLEB.ALTER TABLEC.DELETE TABLEE【答案】 A6、在机器数中,零的表示形式唯一的是()。
A.原码B.补码C.反码D.原码和反码【答案】 B7、使用Web方式收发电子邮件时,以下描述错误的是()。
A.无须设置简单邮件传输协议B.可以不输入帐号密码登录C.邮件可以插入多个附件D.未发送邮件可以保存到草稿箱【答案】 B8、下面协议中,提供安全服务的是(70)。
A.HTTPB.HTTPSC.FTPD.SOAP【答案】 B9、关键路径是 AOE 网中()。
A.从源点到终点的最长路径B.从源点到终点的最短路径C.最长的回路D.最短的回路【答案】 A10、分组交换不具有的优点是()。
欢迎随意转载:不过请注明出处前言:在网上找了很长时间如何发电子邮件的教程,发现大多数都是不能用的很黑心,要不就是有问题的,烦人,,,所以决定自己写一个C+WinSock+SMTP,不敢藏私,拿出来与大家分享先对协议和端口进行一下说明25端口:25端口为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要用于发送邮件,如今绝大多数邮件服务器都使用该协议。
109、110端口:109端口是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,110端口是为POP3(邮局协议3)服务开放的,POP2、POP3都是主要用于接收邮件的。
实现原理:假设由发件人********************发到****************邮箱,发送过程如下:1.连接smtp服务器, 主机返回:220 Anti-spam GT for Coremail System (126com[20101010])32 32 30 20 31 32 36 2E 63 6F 6D 20 41 6E 74 692D 73 70 61 6D 20 47 54 20 66 6F 72 20 43 6F 7265 6D 61 69 6C 20 53 79 73 74 65 6D 20 28 31 3236 63 6F 6D 5B 32 30 31 30 31 30 31 30 5D 29 0D0A2.查询支持什么指令(注意:有的教程上写的是HELO 其实是不对的。
)发送命令:************************\r\n(发送的命令要以"\r\n"作为结束标识符)返回数据:250-mail250-PIPELINING250-AUTH LOGIN PLAIN250-AUTH=LOGIN PLAIN250-coremail1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UroXVjYUCa0xDr UUUUj250-STARTTLS250 8BITMIME32 35 30 2D 6D 61 69 6C 0D 0A 32 35 30 2D 50 4950 45 4C 49 4E 49 4E 47 0D 0A 32 35 30 2D 41 5554 48 20 4C 4F 47 49 4E 20 50 4C 41 49 4E 0D 0A32 35 30 2D 41 55 54 48 3D 4C 4F 47 49 4E 20 504C 41 49 4E 0D 0A 32 35 30 2D 63 6F 72 65 6D 6169 6C 20 31 55 78 72 32 78 4B 6A 37 6B 47 30 786B 49 31 37 78 47 72 55 37 49 30 73 38 46 59 3255 33 55 6A 38 43 7A 32 38 78 31 55 55 55 55 5537 49 63 32 49 30 59 32 55 72 6F 58 56 6A 59 5543 61 30 78 44 72 55 55 55 55 6A 0D 0A 32 35 302D 53 54 41 52 54 54 4C 53 0D 0A 32 35 30 20 3842 49 54 4D 49 4D 45 0D 0A3.用户登录发送命令:AUTH LOGIN\r\n返回数据:334 dXNlcm5hbWU6 (这是username的base64编码)33 33 34 20 64 58 4E 6C 63 6D 35 68 62 57 55 360D 0A发送帐号:emhhb3J1bnplMTIz (这是zhaorunze123的base64编码)返回数据:334 UGFzc3dvcmQ6 (这是password的base64编码)33 33 34 20 55 47 46 7A 63 33 64 76 63 6D 51 360D 0A发送密码:XXXXXXXXX (这里是zhaorunze123这个帐号的密码的base64编码)返回数据:235 Authentication successful (登录成功)32 33 35 20 41 75 74 68 65 6E 74 69 63 61 74 696F 6E 20 73 75 63 63 65 73 73 66 75 6C 0D 0A4:发送邮箱说明发送命令:MAILFROM:<********************>\r\n返回数据:250 Mail OK32 35 30 20 4D 61 69 6C 20 4F 4B 0D 0A5.目的邮箱说明发送命令:RCPTTO:<****************>\r\n返回数据:250 Mail OK32 35 30 20 4D 61 69 6C 20 4F 4B 0D 0A6.请求发送邮件发送命令:DATA\r\n返回命令:354 End data with <CR><LF>.<CR><LF>33 35 34 20 45 6E 64 20 64 61 74 61 20 77 69 7468 20 3C 43 52 3E 3C 4C 46 3E 2E 3C 43 52 3E 3C4C 46 3E 0D 0A7.发送邮件头和邮件体发送数据:(数据以“<CR><LF>.<CR><LF>”结束)From:********************To:****************Subject: 我是标题MIME-Version: 1.0Have A Test \r\n.\r\n返回数据:250 Mail OK queued as smtp4,jdKowLC7f6SfgapNAfJMBw--.4939S2 1303019935 32 35 30 20 4D 61 69 6C 20 4F 4B 20 71 75 65 7565 64 20 61 73 20 73 6D 74 70 34 2C 6A 64 4B 6F77 4C 43 37 66 36 53 66 67 61 70 4E 41 66 4A 4D42 77 2D 2D 2E 34 39 33 39 53 32 20 31 33 30 3330 31 39 39 33 35 0D 0A8.结束发送数据发送命令:QUIT\r\n接收数据:221 Bye32 32 31 20 42 79 65 0D 0A9.断开连接代码部分:///////////////////////////////////////////////////////////////////// // stdafx.h : 标准系统包含文件的包含文件,// 或是经常使用但不常更改的// 特定于项目的包含文件//#pragma once#include "targetver.h"#include <stdio.h>#include <tchar.h>#include<WinSock2.h>#include<Windows.h>#pragma comment (lib,"Ws2_32.lib")SOCKET CreateConnection(char* pWebsite,int iPort); //创建连接//int DoWhat=0,先发送后接收,1,只发送,2只接收bool SendAndRecvMsg(SOCKET sockClient,char* lpMessage,int Messagelen,int DoWhat,char* recvBuf,int recvBufLen);//发送消息接收消息void CloseSock(SOCKET sockClient);void InitializeWSA();char* WebsiteToIPAddress(char* pWebsite);//网址转IPchar* StringToBase64(char* bString,int len); //asc2字符串转base64bool FormatEmail(char* pFrom,char* pTo,char* pSubject,char* pMessage,__out char* Email);//格式化Emailvoid WINAPI SendEmail( //发送邮件char* pUserNameToSendEmail, //发件箱char* pPassWordToSendEmail, //发件箱的密码char* SMTPService, //发件箱的SMTP服务器char* pTargetEmail, //目标邮箱char* pEmailTitle, //邮件的标题char* pContent //邮件的内容);int GetAsc2Len(char* pString);// TODO: 在此处引用程序需要的其他头文件///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // stdafx.cpp : 只包括标准包含文件的源文件// 发送邮件的测试.pch 将作为预编译头// stdafx.obj 将包含预编译类型信息#include "stdafx.h"// TODO: 在 STDAFX.H 中// 引用任何所需的附加头文件,而不是在此文件中引用void InitializeWSA(){WSAData wsadata;WSAStartup(MAKEWORD(2,2),&wsadata);}char* WebsiteToIPAddress(char* pWebsite){hostent* ht=gethostbyname( pWebsite);char* IpAddress=(char*)HeapAlloc(GetProcessHeap(),0,32);memset(IpAddress,0,32);sprintf(IpAddress,"%d.%d.%d.%d",*(byte*)(ht->h_addr_list[0]),*(by te*)(ht->h_addr_list[0]+1),*(byte*)(ht->h_addr_list[0]+2),*(byte*)(ht ->h_addr_list[0]+3));return IpAddress;}SOCKET CreateConnection(char* pWebsite,int iPort){//为建立socket对象做准备,初始化环境SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); //建立socket对象SOCKADDR_IN addrSrv;char* IpAddress= WebsiteToIPAddress(pWebsite);//printf("%s\n",IpAddress);addrSrv.sin_addr.S_un.S_addr=inet_addr(IpAddress);//把U_LONG的主机字节顺序转换为TCP/IP网络字节顺序addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(iPort);int tf = connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //向服务器发送请求if(tf!=0){return 0;//printf("链接失败\n");}return sockClient;}bool SendAndRecvMsg(SOCKET sockClient,char* pMessage,int Messagelen,int DoWhat,char* recvBuf,int recvBufLen)//int DoWhat是否接受数据{char lpMessage[256]={0};memcpy(lpMessage,pMessage,Messagelen);printf("\n\n%s \n",lpMessage);if (DoWhat==0){send(sockClient,lpMessage,Messagelen,0);memset(recvBuf,0,recvBufLen);DWORD num=recv(sockClient,recvBuf,recvBufLen,0); //接收数据printf("%s \n",recvBuf);int i=0;while(i!=num){printf("%02X ",recvBuf[i++]);if((i)%16==0){printf("\n");}}printf("\n");}else if (DoWhat==1){send(sockClient,lpMessage,Messagelen,0);}else if (DoWhat==2){memset(recvBuf,0,recvBufLen);DWORD num=recv(sockClient,recvBuf,recvBufLen,0); //接收数据printf("%s \n",recvBuf);int i=0;while(i<num){printf("%02X ",(byte)recvBuf[i++]);if((i)%16==0){printf("\n");}}printf("\n");}return recvBuf;}void CloseSock(SOCKET sockClient){//关闭套接字closesocket(sockClient);WSACleanup();}char* StringToBase64(char* bString,int len)//len是bString的长度,不算结束符\0{int Index=0;byte data[3]={0};char* Base64=(char*)HeapAlloc(GetProcessHeap(),0,(len*4)/3+12);memset(Base64,0,(len*4)/3+12);char* tmp=(char*)HeapAlloc(GetProcessHeap(),0,5);while((Index+3)<=len){memset(data,0,3);memcpy(data,bString+Index,3);memset(tmp,0,5);tmp[0]=(data[0]>>2)&0x3F;tmp[1]=((data[0]<<4)+(data[1]>>4))&0x3F;tmp[2]=((data[1]<<2)+(data[2]>>6))&0x3F;tmp[3]=data[2]&0x3F;lstrcat(Base64,tmp);Index+=3;}memset(tmp,0,5);Index=len%3;if(Index!=0){memset(data,0,3);memcpy(data,bString+len-Index,Index);memset(tmp,0,5);tmp[0]=(data[0]>>2)&0x3F;tmp[1]=((data[0]<<4)+(data[1]>>4))&0x3F;tmp[2]=((data[1]<<2)+(data[2]>>6))&0x3F;tmp[3]=data[2]&0x3F;lstrcat(Base64,tmp);memset(tmp,0,5);Index=3-Index;while(Index--){lstrcat(tmp,"=");}}Index=0;while(Base64[Index]!=0){// //printf("%02d=",Base64[Index]);if(Base64[Index]<=25 && Base64[Index]>=0){Base64[Index]+='A';}else if(Base64[Index]<=51 && Base64[Index]>=26){Base64[Index]-=26;Base64[Index]+='a';}else if(Base64[Index]<=61 && Base64[Index]>=52){Base64[Index]-=4;}else if(Base64[Index]==62){Base64[Index]='+';}else if(Base64[Index]==63){Base64[Index]='/';}else{// MessageBox(0,"转换成Base64出错",&Base64[Index],0);//printf("%02d\n",Base64[Index]);}// //printf("%c\n",Base64[Index]);Index++;}lstrcat(Base64,tmp);HeapFree(GetProcessHeap(),0,tmp);return Base64;}bool FormatEmail(char* pFrom,char* pTo,char* pSubject,char* pMessage,__out char* Email){lstrcat(Email,"From: ");lstrcat(Email,pFrom);lstrcat(Email,"\r\n");lstrcat(Email,"To: ");lstrcat(Email,pTo);lstrcat(Email,"\r\n");lstrcat(Email,"Subject: ");lstrcat(Email,pSubject);lstrcat(Email,"\r\n");lstrcat(Email,"MIME-Version: 1.0");lstrcat(Email,"\r\n");lstrcat(Email,"\r\n");lstrcat(Email,pMessage);lstrcat(Email,"\r\n.\r\n");return 1;}void WINAPI SendEmail(char* pUserNameToSendEmail, //发件箱char* pPassWordToSendEmail, //发件箱的密码char* SMTPService, //发件箱的SMTP服务器char* pTargetEmail, //目标邮箱char* pEmailTitle, //邮件的标题char* pContent //邮件的内容){char* base;char str[1024];InitializeWSA();;SOCKET sockClient=CreateConnection(SMTPService,25);char recvBuf[1024];memset(recvBuf,0,1024);bool tf = SendAndRecvMsg(sockClient,0,0,2,recvBuf,1024);char UserNameToSendEmail[256]={0};sprintf(UserNameToSendEmail,"EHLO %s",pUserNameToSendEmail);lstrcat(UserNameToSendEmail,"\r\n\0");tf = SendAndRecvMsg(sockClient,UserNameToSendEmail,GetAsc2Len(UserNameToSe ndEmail),0,recvBuf,1024);tf = SendAndRecvMsg(sockClient,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0,recvBuf,1024);char pUerName[256]={0};DWORD p=strstr(pUserNameToSendEmail,"@")-pUserNameToSendEmail;memcpy(pUerName,pUserNameToSendEmail,p);base=StringToBase64(pUerName,lstrlen(pUerName));memset(str,0,1024);sprintf(str,"%s\r\n",base);tf = SendAndRecvMsg(sockClient,str,lstrlen(str),0,recvBuf,1024);base=StringToBase64(pPassWordToSendEmail,lstrlen(pPassWordToSendE mail));memset(str,0,1024);sprintf(str,"%s\r\n",base);tf = SendAndRecvMsg(sockClient,str,lstrlen(str),0,recvBuf,1024);char MailFrom[256]={0};sprintf(MailFrom,"MAIL FROM: <%s>\r\n",pUserNameToSendEmail);tf = SendAndRecvMsg(sockClient,MailFrom,lstrlen(MailFrom),0,recvBuf,1024);char RcptTo[256]={0};sprintf(RcptTo,"RCPT TO: <%s>\r\n",pTargetEmail);tf = SendAndRecvMsg(sockClient,RcptTo,lstrlen(RcptTo),0,recvBuf,1024);tf = SendAndRecvMsg(sockClient,"DATA\r\n",lstrlen("DATA\r\n"),0,recvBuf,10 24);char Email[1024]={0};FormatEmail(pUserNameToSendEmail,pTargetEmail,pEmailTitle,pConten t,Email);tf = SendAndRecvMsg(sockClient,Email,lstrlen(Email),0,recvBuf,1024);tf = SendAndRecvMsg(sockClient,"QUIT\r\n",lstrlen("QUIT\r\n"),0,recvBuf,10 24);CloseSock(sockClient);return ;}int GetAsc2Len(char* pString){int i=0;while(pString[i++]!=0);return i-1;}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // 发送邮件的测试.cpp : 定义控制台应用程序的入口点。
namespace SMTPServer
{
public partial class sendMailTSMI : Form
{
public sendMailTSMI()
{
InitializeComponent();
}
private void sendMailTSMI_Load(object sender, EventArgs e) {
fromTxt.Text = SendMail.mailFrom;
prptComBox.SelectedIndex = 0;
rBtnHTML.Checked = true;
}
private void button1_Click(object sender, EventArgs e)//浏览按钮
{
OpenFileDialog oFileDialog = new OpenFileDialog();
if (oFileDialog.ShowDialog() == DialogResult.OK)
{
AttachTxt.Text = oFileDialog.FileName;
}
}
private void btnSend_Click(object sender, EventArgs e)//发送按钮
{
if (toTxt.Text.Trim() == "")
{
MessageBox.Show("收件人不能为空!");
return;
}
if (fromTxt.Text.Trim() == string.Empty)
{
MessageBox.Show("发件人不能为空!");
return;
}
string mailTo = toTxt.Text.Trim();
string mailCC = ccTxt.Text.Trim();
string mailSubject = subjectTxt.Text.Trim();
string mailFrom = fromTxt.Text.Trim();
string mailBody = bodytxt.Text.Trim();
//实例化MailAddress
MailAddress maddr = new MailAddress(mailFrom);//包含收件人地址的MailAddress
//初始化MailMessage
MailMessage mymail = new MailMessage();
mymail.To.Add(mailTo);//向收件人地址集合添加邮件地址
.Add(mailCC);//向抄送收件人地址集合添加邮件地址
mymail.From = mailFrom;//发件人地址
mymail.Subject = mailSubject;//邮件标题
mymail.SubjectEncoding = Encoding.UTF8;//获取或设置电子邮件的主题内容实用的编码
mymail.Body = mailBody;//邮件正文
mymail.BodyEncoding = Encoding.UTF8;//获取或设置邮件正文的编码
//设置优先级
switch (prptComBox.SelectedText.ToString())
{
case"高":
mymail.Priority = MailPriority.High;
break;
case"中":
mymail.Priority = MailPriority.Normal;
break;
case"低":
mymail.Priority = MailPriority.Low;
break;
default:
break;
}
//添加附件(Attachment 表示电子邮件的附件)
if (AttachTxt.Text != "")//有附件
{
Attachment item = new Attachment(AttachTxt.Text); mymail.Attachments.Add(item);
}
//以HTML格式还是纯文本发送
if (rBtnHTML.Checked == true)
{
//以HTML格式发送
mymail.IsBodyHtml = true;
}
else
{
//以纯文本格式发送
mymail.IsBodyHtml = false;
}
string mailPwd = SendMail.mailPwd;
SmtpClient smtp = new SmtpClient();//SmtpClient允许用户用来发送邮件的实例
smtp.Credentials = new
workCredential(mailFrom, mailPwd);//Credentials获取或设置用于发件人身份的凭据
smtp.Host = SendMail.mailServer;//设置SMTP邮件服务器
try
{
smtp.Send(mymail);
MessageBox.Show("发送成功!");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void btnCancel_Click(object sender, EventArgs e)//取消按钮
{
this.Close();
}
}
}。