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

推荐订阅源

S
Schneier on Security
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
博客园 - Franky
V
V2EX
爱范儿
爱范儿
J
Java Code Geeks
小众软件
小众软件
Last Week in AI
Last Week in AI
The Cloudflare Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Hugging Face - Blog
Hugging Face - Blog
T
The Blog of Author Tim Ferriss
酷 壳 – CoolShell
酷 壳 – CoolShell
The Register - Security
The Register - Security
GbyAI
GbyAI
Vercel News
Vercel News
Y
Y Combinator Blog
腾讯CDC
F
Fortinet All Blogs
I
InfoQ
N
Netflix TechBlog - Medium
B
Blog RSS Feed
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
量子位
博客园 - 司徒正美
阮一峰的网络日志
阮一峰的网络日志
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
博客园 - 三生石上(FineUI控件)
宝玉的分享
宝玉的分享
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
Scott Helme
Scott Helme
T
Tor Project blog
U
Unit 42
Google Online Security Blog
Google Online Security Blog
PCI Perspectives
PCI Perspectives
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
NISL@THU
NISL@THU
D
Darknet – Hacking Tools, Hacker News & Cyber Security
aimingoo的专栏
aimingoo的专栏
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Stack Overflow Blog
Stack Overflow Blog
Security Archives - TechRepublic
Security Archives - TechRepublic

博客园 - 老金

直接初始化和复制初始化 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 }