惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
Recent Announcements
Recent Announcements
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
MyScale Blog
MyScale Blog
爱范儿
爱范儿
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
美团技术团队
Y
Y Combinator Blog
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
Martin Fowler
Martin Fowler
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
M
MIT News - Artificial intelligence
博客园 - Franky
V
Visual Studio Blog
I
InfoQ
V
V2EX
Hugging Face - Blog
Hugging Face - Blog
腾讯CDC
博客园 - 司徒正美
L
LangChain Blog

博客园 - 老金

直接初始化和复制初始化 C++ 内连接与外连接 (转) mysql-Innodb事务隔离级别-repeatable read详解(转) Linux操作系统多线程信号总结 Linux操作系统多线程信号总结(转) 转-C/C++捕获段错误,打印出错的具体位置(精确到哪一行) 关键字restrict简介 C/C++中的日期和时间 time_t与struct tm Unicode(UTF-8, UTF-16)令人混淆的概念 跟着url走一圈(ASP.NET请求底层流转个人总结 二) 跟着url走一圈(ASP.NET请求底层流转个人总结 一) GDB教程详解&打印STL容器 C# 中的"yield"使用 谈谈.Net中的协变和逆变(转) 对象的比较与排序:IComparable和IComparer接口 jsoncpp在linux下的配置 在Ubuntu上安装并C++使用libmemcached C++ Primer 第十六章 模板与范型编程 C++ Primer 第十五章 面向对象编程
使用SMTP 和POP3 协议实现收发邮件(C/C++) (转)
老金 · 2012-11-14 · via 博客园 - 老金

SMTP协议和POP3协议就不详细阐述了 ,网上一搜索会有一大把给你解释的。

下面直接贴代码:

首先写一个class Sock类,这个类的功能主要是创建套接字(即int sock),用套接字來连接邮箱服务器。类里面还带有send_socket和recv_socket两个函数,其功能分别是向邮箱服务器发送协议指令和接收服务器反馈回来的信息。

sock.h文件

  1. 1 #ifndef __SOCK_H__ 
  2. 2 #define __SOCK_H__ 
  3. 3  
  4. 4 #include <iostream> 
  5. 5 #include <sys/socket.h> 
  6. 6 #include <sys/epoll.h> 
  7. 7 #include <stdio.h> 
  8. 8 #include <netinet/in.h> 
  9. 9  
  10. 10 class Sock 
  11. 11 { 
  12. 12     public
  13. 13         Sock(); 
  14. 14         bool Connect(const char *host_id, const int &port); 
  15. 15         void send_socket(const char *s); 
  16. 16         int recv_socket(); 
  17. 17         const char * get_recvbuf(); 
  18. 18         ~Sock(); 
  19. 19         private
  20. 20         char recvbuf[BUFSIZ]; 
  21. 21         int sock; 
  22. 22         int num; 
  23. 23         struct sockaddr_in server; 
  24. 24         struct hostent *hp; 
  25. 25 }; 
  26. 26  
  27. 27 #endif 

sock.cpp文件

  1. 1 #include "sock.h" 
  2.   2 #include <stdexcept> 
  3.   3 #include <netdb.h> 
  4.   4 #include <string.h> 
  5.   5 #include <sys/types.h> 
  6.   6  
  7.   7 Sock::Sock() 
  8.   8 { 
  9.   9     sock = socket(AF_INET, SOCK_STREAM, 0); 
  10. 10     if(sock == -1) 
  11. 11     { 
  12. 12         throw std::runtime_error("socket init error\n"); 
  13. 13     } 
  14. 14 } 
  15. 15 Sock::~Sock() 
  16. 16 { 
  17. 17     close(sock); 
  18. 18 } 
  19. 19 bool Sock::Connect(const char *host_id, const int &port) 
  20. 20 { 
  21. 21     server.sin_family = AF_INET; 
  22. 22     hp = gethostbyname(host_id); 
  23. 23     if(hp == (struct hostent *) 0) 
  24. 24     { 
  25. 25         std::cerr << "服务器地址获取失败!" << std::endl; 
  26. 26         return false
  27. 27     } 
  28. 28     memcpy((char *)&server.sin_addr, 
  29. 29             (char *)hp->h_addr, hp->h_length); 
  30. 30     server.sin_port = htons(port); 
  31. 31     if(connect(sock, (sockaddr *) &server, sizeof server) == -1) 
  32. 32     { 
  33. 33         std::cerr << "连接服务器失败!" << std::endl; 
  34. 34         return false
  35. 35     } 
  36. 36     else 
  37. 37         return true
  38. 38 } 
  39.  
  40. void Sock::send_socket(const char *s) 
  41. 40 { 
  42. 41     send(sock, s, strlen(s), 0); 
  43. 42 } 
  44. 43 int Sock::recv_socket() 
  45. 44 { 
  46. 45     memset(recvbuf, 0,BUFSIZ); 
  47. 46     return recv(sock, recvbuf, BUFSIZ, 0); 
  48. 47 } 
  49. 48 const char * Sock::get_recvbuf() 
  50. 49 { 
  51. 50     return recvbuf; 
  52. 51 } 

下面是用SMTP协议发送邮件,格式就如代码所示。了解下SMTP协议,依葫芦画瓢了。

  1. 1 #include "sock.h" 
  2.   2 #include <iostream> 
  3.   3  
  4.   4 int main() 
  5.   5 { 
  6.   6     Sock sock; 
  7.   7     const char *host_id = "smtp.126.com"
  8.   8     int port = 25; 
  9.   9     char wkstr[100] = "hello,how are you?"; 
  10. 10     if(sock.Connect(host_id, port) == false
  11. 11         return 1; 
  12. 12     sock.recv_socket(); 
  13. 13     std::cout << "Client : connected! \nServer :" 
  14. 14         << sock.get_recvbuf() << std::endl; 
  15. 15  
  16. 16     
  17. 17     sock.send_socket("EHLO **********\r\n"); 
  18. 18     sock.recv_socket(); 
  19. 19     std::cout << "Client : send helo \nServer :" 
  20. 20         << sock.get_recvbuf() << std::endl; 
  21. 21  
  22. 22      
  23. 23     sock.send_socket("auth login\r\n"); 
  24. 24     sock.recv_socket(); 
  25. 25     std::cout << "Client : send auth login \nServer :" 
  26. 26         << sock.get_recvbuf() << std::endl; 
  27. 27  
  28. 28    
  29.  
  30. 31     sock.send_socket("**********"); 
  31. 32     sock.send_socket("\r\n"); 
  32. 33     sock.recv_socket(); 
  33. 34     std::cout << "Client : send name \nServer :" 
  34. 35         << sock.get_recvbuf() << std::endl; 
  35.  
  36. 37     
  37. 38     sock.send_socket("base64编码后的密码"); 
  38. 39     sock.send_socket("\r\n"); 
  39. 40     sock.recv_socket(); 
  40. 41     std::cout << "Client : send password \nServer :" 
  41. 42         << sock.get_recvbuf() << std::endl; 
  42. 43  
  43. 44      
  44. 45     sock.send_socket("mail from: <"); 
  45. 46     sock.send_socket("yuzhenxiong0823@126.com"); 
  46. 47     sock.send_socket(">"); 
  47. 48     sock.send_socket("\r\n"); 
  48. 49     sock.recv_socket(); 
  49. 50     std::cout << "Client: send mail from \nServer :" 
  50. 51         << sock.get_recvbuf() << std::endl; 
  51. 52  
  52. 53      
  53. 54     sock.send_socket("rcpt to: <"); 
  54. 55     sock.send_socket("120091241@qq.com"); 
  55. 56     sock.send_socket(">"); 
  56. 57     sock.send_socket("\r\n"); 
  57. 58     sock.recv_socket(); 
  58. 59     std::cout << "Client : send rcpt to \nServer" 
  59. 60         << sock.get_recvbuf() << std::endl; 
  60. 61  
  61. 62      
  62. 63     sock.send_socket("data\r\n"); 
  63. 64     sock.recv_socket(); 
  64. 65     std::cout << "Client : send data \nServer :" 
  65. 66         << sock.get_recvbuf() << std::endl; 
  66. 67    
  67.  
  68. 69     sock.send_socket("subject:"); 
  69. 70     sock.send_socket("testmail\r\n"); 
  70. 71     sock.send_socket("\r\n\r\n"); 
  71. 72     sock.send_socket("hello,how are you.\r\n"); 
  72. 73     sock.send_socket(".\r\n"); 
  73. 74     sock.recv_socket(); 
  74. 75     std::cout << "Client : send content \nServer :" 
  75. 76         << sock.get_recvbuf() << std::endl; 
  76.  
  77.   sock.send_socket("quit\r\n"); 
  78. 79     sock.recv_socket(); 
  79. 80     std::cout << "Client : send quit \nServer :" 
  80. 81         << sock.get_recvbuf() << std::endl; 
  81. 82  
  82. 83 }