关闭

嵌入式 简单邮件传输协议(SMTP)

506人阅读 评论(0) 收藏 举报
分类:

一、电子邮件的组成
 在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++语言实现(头文件)

  1.   
  2. #ifndef __Email_H__  
  3. #define __Email_H__  
  4.   
  5. typedef struct Email_info{  
  6.     charsmtp_server;  
  7.     charusername;  
  8.     charpassword;  
  9.     charsender_name;  
  10.     charsender_Email;  
  11.     charrecv_Email;  
  12.     charsubject;  
  13.     chartextinfo;  
  14.     charattachment[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 _DEBUG(msg...)    printf("[ %s,%s, %d ]=>",__FILE__, __FUNCTION__, __LINE__); printf(msg); printf("\r\n")  
  27. #define _ERROR(msg...)    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                    // 附件中最大数据包的个数,附件不能超过5M (BUFFER_SIZE) (BUFFER_CNT)  
  32. typedef int SOCKET;  
  33.   
  34. class Email    
  35.  
  36. public 
  37.     Email();  
  38.     ~Email();  
  39.     void AddAttachment(const charpath);     
  40.     void AddTextMsg(const charText);  
  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 charserver,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.     charSendBuf;  
  64.     charRecvBuf;  
  65.     vector Attachments;  
  66.    
  67.     void ReceiveData();  
  68.     void SendData();  
  69.     int FormatHeader(char);  
  70.     int SmtpRecdigits();  
  71.     SOCKET ConnectRemoteServer(const charserverIP, 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"和__cplusplus的作用。Email_info_t这个结构体的用途为提供对外的传参信息,通过intEmail_send(Email_info_t)函数----C++对外的接口函数,C文档(*.c)中只需调用这个接口就ok了,而C++(*.cpp)接着把这些函数分别实现,然后,就可以实现邮件功能了
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:983796次
    • 积分:17677
    • 等级:
    • 排名:第540名
    • 原创:741篇
    • 转载:522篇
    • 译文:0篇
    • 评论:105条
    最新评论