嵌⼊式简单邮件传输协议(SMTP)
⼀、电⼦邮件的组成
在SMTP协议中,电⼦邮件由三部分组成,信封、⾸部和正⽂。
1)信封
信封包括发信⼈的邮件地址和接收⼈的邮件地址,⽤两条SMTP命令指明。
① MAILFROM:<;发信⼈的地址>,告诉SMTP服务器发信⼈的地址。
② RCPTTO:<;收信⼈的地址>,告诉SMTP服务器收信⼈地址。
2)⾸部
⾸部中常⽤命令:
① FROM :< 姓名>< 邮件地址> ,表明邮件发送者是谁。
② TO :< 姓名>< 邮件地址> ,表明邮件接收者是谁。
③ SUBJECT :< 邮件标题> ,表明邮件的主题。
④ DATE :< 时间> ,表明发邮件的时间。
⑤ REPLY-TO :< 邮件地址> ,表明邮件的回复地址。
⑥ Content-Type :< 邮件类型> ,表明邮件包含⽂本、HTML 超⽂本和附件的哪些类型。
⑦ X-Priority :< 邮件优先级> ,表明邮件的发送优先级。
⑧ MIME-Version :< 版本> ,MIME 的意思是Multipurpose Internet MailExtensions ,即多⽤途Internet 邮件扩展标准,它对传输内容的消息、附件及其他的内容定义了格式。
3)正⽂
正⽂是邮件的内容。⾸部以⼀个空⾏结束,再下⾯就是正⽂部分。
4)结束符号
邮件以“.” 结束。
⼆、与邮件服务器连接
1.与SMTP服务器的连接
使⽤命令格式:HELO<;信息发送端的名称>
格式举例:HELOLocal
2.与ESMTP服务器建⽴连接
(1) 使⽤命令格式:EHLO<;信息发送端的名称>
格式举例:EHLO Local
(2)启动服务器认证
命令格式:AUTH LOGIN
3.断开与服务器的连接
命令格式:QUIT
使⽤QUIT命令退出系统,断开与服务器的连接。
三、邮件的发送过程
以与ESMTP服务器建⽴连接发送邮件为例。
1.客户端先与服务器建⽴连接
1) 客户端发送EHLO Local
2) 客户端发送AUTH LOGIN
3) 客户端发送经过Base64编码处理的⽤户名
4) 客户端发送经过Base64编码处理的密码2.客户端开始发送邮件的信封
5) 客户端发送 MAIL FROM:<;发信⼈的地址>
6) 客户端发送 RCPT TO:<;收信⼈的地址>
3.客户端开始发送邮件数据
7) 客户端发送DATA
8) 客户端可以选择发送邮件的⾸部字段
9) 客户端发送⼀个空⾏表⽰邮件⾸部结束。
10) 客户端开始发送正⽂。
11) 客户端发送“.”表⽰邮件发送结束。4.客户端先服务器断开连接
12) 客户端发送QUIT表⽰断开连接。
四、SMTPServer返回值表
五、C++语⾔实现(头⽂件)
[cpp]
1.
2. #ifndef __Email_H__
3. #define __Email_H__
4.
5. typedef struct Email_info{
6. char* smtp_server;
7. char* username;
8. char* password;
9. char* sender_name;
10. char* sender_Email;
11. char* recv_Email;
12. char* subject;
13. char* textinfo;
14. char* attachment[10];
15. }Email_info_t;
16.
17. #ifdef __cplusplus
18. #include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
嵌入式系统是什么意思#include <unistd.h>
#include <stdlib.h>
19.
20. using namespace std;
21.
22. #ifdef __cplusplus
23. extern "C" {
24. #endif //__cplusplus
25.
26. #define _) printf("[ %s,%s, %d ]=>",__FILE__, __FUNCTION__, __LINE__); printf(msg);
printf("\r\n")
27. #define _) printf("[ error: %s, %d]=>", __FILE__, __LINE__); printf(msg); printf("\r\n")
28. #define SOCKET_ERROR -1
29. #define INVALID_SOCKET -1
30. #define BUFFER_SIZE (10*1024) // 收发数据的⼤⼩:1M
31. #define BUFFER_CNT 5 // 附件中最⼤数据包的个数,附件不能超过5M = (BUFFER_SIZE) *
(BUFFER_CNT)
32. typedef int SOCKET;
33.
34. class Email
35. {
36. public:
37. Email();
38. ~Email();
39. void AddAttachment(const char* path);
40. void AddTextMsg(const char* Text);
41. void Send();
42. void SetSubject(const char* );
43. void SetSenderName(const char* );
44. void SetSenderEmail(const char* );
45. void SetRecvEmail(const char* );
46. void SetUsername(const char* );
47. void SetPassword(const char* );
48. void SetSMTPServer(const char* server,const unsigned short port=0);
49. bool is_send;
50.
51. private:
52. string SMTPSrvName;
53. unsigned short SMTPSrvPort;
54. string Username;
55. string Password;
56. string EmailFrom;
57. string EmailTo;
58. string NameFrom;
59. string TextMsg;
60. string Subject;
61.
62. SOCKET hSocket;
63. char* SendBuf;
64. char* RecvBuf;
65. vector Attachments;
66.
67. void ReceiveData();
68. void SendData();
69. int FormatHeader(char* );
70. int SmtpRecdigits();
71. SOCKET ConnectRemoteServer(const char* serverIP, const unsigned short port=0);
72. string base64_encode(unsigned char const*, unsigned int len);
73. };
74.
75. int Email_send(Email_info_t );
76.
77. #ifdef __cplusplus
78. }
79. #endif //__cplusplus
80.
81. #endif //__cplusplus
82. #endif // __Email_H__
因为邮件发送只是⼀个模块⽽已,项⽬中涉及到C\C++混合编程问题,所以,强调了extern "C"和__cp
lusplus的作⽤。Email_info_t这个结构体的⽤途为提供对外的传参信息,通过intEmail_send(Email_info_t)函数----C++对外的接⼝函数,C ⽂档(*.c)中只需调⽤这个接⼝就ok了,⽽C++(*.cpp)接着把这些函数分别实现,然后,就可以实现邮件功能了
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论