使用SMTP 和POP3 协议实现收发邮件(C/C++)



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


下面直接贴代码:

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

sock.h文件

  #ifndef __SOCK_H__
  #define __SOCK_H__
 
  #include <iostream>
  #include <sys/socket.h>
  #include <sys/epoll.h>
  #include <stdio.h>
  #include <netinet/in.h>
 
 class Sock
 {
 public:
     Sock();
      bool Connect(const char *host_id, constint &port);
      void send_socket(const char *s);
      int recv_socket();
      constchar * get_recvbuf();
      ~Sock();
       private:
      char recvbuf[BUFSIZ];
      int sock;
      int num;
      struct sockaddr_in server;
      struct hostent *hp;
   };
  #endif

sock.cpp文件

#include"sock.h"
#include<stdexcept>
#include<netdb.h>
#include<string.h>
#include<sys/types.h>
 
Sock::Sock()
{
     sock= socket(AF_INET, SOCK_STREAM, 0);
      if(sock == -1)
      {
           throw std::runtime_error("socketinit error\n");
      }
}
Sock::~Sock()
 {
      close(sock);
 }
bool Sock::Connect(constchar *host_id, const int &port)
{
      server.sin_family = AF_INET;
      hp = gethostbyname(host_id);
      if(hp == (struct hostent *) 0)
      {
           std::cerr << "服务器地址获取失败!" << std::endl;
           return false;
      }
      memcpy((char *)&server.sin_addr,
      (char *)hp->h_addr, hp->h_length);
      server.sin_port = htons(port);
      if(connect(sock, (sockaddr *) &server,sizeof server) == -1)
      {
           std::cerr << "连接服务器失败!" << std::endl;
           return false;
      }
      else
            return true;
 }
 
 void Sock::send_socket(const char *s)
 {
      send(sock, s, strlen(s), 0);
 }
 int Sock::recv_socket()
 {
     memset(recvbuf,0,BUFSIZ);
     returnrecv(sock, recvbuf, BUFSIZ, 0);
  }
 const char * Sock::get_recvbuf()
 {
      return recvbuf;
 }


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

#include "sock.h"
#include <iostream>
 
int main()
{
      Socksock;
      constchar *host_id = "smtp.126.com";
      intport = 25;//smtp协议专用端口
      charwkstr[100] = "hello,how are you?";//邮件内容
      if(sock.Connect(host_id,port) == false)
           return1;
      sock.recv_socket();
      std::cout<< "Client : connected! \nServer :"
            << sock.get_recvbuf() <<std::endl;
 
      /*EHLO指令是必须首先发的,相当于和服务器说hello*/
      sock.send_socket("EHLO**********\r\n");//邮箱用户名
      sock.recv_socket();
      std::cout<< "Client : send helo \nServer :"
           <<sock.get_recvbuf() << std::endl;
 
      /*发送 auth login 指令,告诉服务器要登录邮箱*/
      sock.send_socket("authlogin\r\n");
      sock.recv_socket();
      std::cout<< "Client : send auth login \nServer :"
           <<sock.get_recvbuf() << std::endl;
 
     /*告诉服务器要登录后,接着就是把用户名发过去了.
      不过这个用户名是经过了base64编码的,smtp也支持
      明文传送,至于具体有什么区别上网上找资料看看就知道了*/
      sock.send_socket("**********");//经过base64编码后的邮箱用户名
      sock.send_socket("\r\n");
      sock.recv_socket();
      std::cout<< "Client : send name \nServer :"
           <<sock.get_recvbuf() << std::endl;
 
      /*用户名发过去后接着就是用户密码了,当然也是经过base64编码后的*/
      sock.send_socket("base64编码后的密码");
      sock.send_socket("\r\n");
      sock.recv_socket();
      std::cout<< "Client : send password \nServer :"
           <<sock.get_recvbuf() << std::endl;
 
       /*发送 mail from 指令,相当于填写发件人*/
     sock.send_socket("mail from<");
      sock.send_socket("yuzhenxiong0823@126.com");
     sock.send_socket(">");
      sock.send_socket("\r\n");
      sock.recv_socket();
      std::cout<< "Client: send mail from \nServer :"
           <<sock.get_recvbuf() << std::endl;
 
       /*发送 rcpt to 指令,就是填写收件人了 */
      sock.send_socket("rcptto <");
      sock.send_socket("120091241@qq.com");
      sock.send_socket(">");
      sock.send_socket("\r\n");
      sock.recv_socket();
      std::cout<< "Client : send rcpt to \nServer"
           <<sock.get_recvbuf() << std::endl;
 
       /*发送data,标志着后面开始发送邮件的主题部分*/
      sock.send_socket("data\r\n");
      sock.recv_socket();
      std::cout<< "Client : send data \nServer :"
           <<sock.get_recvbuf() << std::endl;
      /*发送邮件主体部分,先是邮件主题(subject),后面是邮件内容。
      下面就是发送主体的格式*/
      sock.send_socket("subject:");
      sock.send_socket("testmail\r\n");
      sock.send_socket("\r\n\r\n");
      sock.send_socket("hello,howare you.\r\n");
      sock.send_socket(".\r\n");
      sock.recv_socket();
      std::cout<< "Client : send content \nServer :"
            << sock.get_recvbuf() <<std::endl;
 
     sock.send_socket("quit\r\n");
      sock.recv_socket();
      std::cout<< "Client : send quit \nServer :"
          << sock.get_recvbuf() <<std::endl;
     
}


下面是用POP3协议指令接收邮件:

#include "sock.h"
#include <iostream>
#include <string.h>

int main()
{
 Sock sock;
 const char *host_id = "pop3.126.com";
 int port = 110;
 if(sock.Connect(host_id, port) == false)
    return 1;
 std::cout << "connected\n";
 sock.recv_socket();
 std::cout << "Client:connect successfully! \nServer:"
  << sock.get_recvbuf() << std::endl;
 
 sock.send_socket("user 输入邮箱用户名
 sock.recv_socket();
 std::cout << "Client : send name \nServer:"
    << sock.get_recvbuf() << std::endl;

 sock.send_socket("pass *****\r\n");//邮箱密码
 sock.recv_socket();
 std::cout << "Client : send password \n Server :"
     << sock.get_recvbuf() << std::endl;

 sock.send_socket("stat\r\n");
 sock.recv_socket();
 std::cout << "Client : send stat \nServer : "
  << sock.get_recvbuf() << std::endl;
 sleep(1);

 sock.send_socket("list\r\n");
 std::cout << "Client : send list \nServer :"
  << sock.get_recvbuf() << std::endl;
 sleep(1);

 sock.send_socket("retr 5\r\n");
 std::cout << "Client : send retr (...) \n";
          //下面的while循环有些问题,目前还没有想到解决方法。以后改正!
           while(1)
 {
     int num = sock.recv_socket();
      std::cout << "Server :" << sock.get_recvbuf() << std::endl;
    if(num <= 0)
    {
       break;
    }
 }
 
 sock.send_socket("quit\r\n");
 std::cout << "Client : send quit \nServer :"
        << sock.get_recvbuf() << std::endl;
}


pop3连接邮箱是有时候会被服务器拒绝连接,多运行几次编译文件即可!

接收到的邮件是经过编码后的,需要解码!作为一个初学者,实在是无能为力了,也希望各位大神能多指点一二。

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 基于POP3SMTP协议邮件收发应用程序是一种能够通过互联网发送和接收电子邮件的软件。POP3协议是一种用于接收邮件协议,它允许用户从邮件服务器上下载邮件到本地计算机上。SMTP协议则是一种用于发送邮件协议,它允许用户将邮件发送到邮件服务器上,然后由服务器将邮件发送到目标地址。 这种邮件收发应用程序通常包括一个邮件客户端和一个邮件服务器。邮件客户端是用户用来发送和接收邮件的软件,它可以连接到邮件服务器上,下载邮件并将邮件发送到服务器上。邮件服务器则是用来存储和转发邮件的软件,它可以接收用户发送的邮件并将邮件发送到目标地址。 基于POP3SMTP协议邮件收发应用程序可以帮助用户快速、方便地发送和接收邮件,是现代通信中不可或缺的一部分。 ### 回答2: 邮件系统是现代通讯的重要组成部分,在各种应用场景中广泛使用。其中,基于pop3smtp协议邮件收发应用程序是其中的一种应用程序。 Pop3协议是一种电子邮件协议,用于从远程服务器上获取电子邮件使用pop3协议,应用程序可以连接到邮件服务器上的pop3端口,获取到存储在服务器上的邮件。通过pop3协议,应用程序可以获取邮件的主题、发件人、收件人、正文等信息,并且可以将获取到的邮件缓存到本地计算机上。 SMTP协议是一种电子邮件协议,用于将电子邮件传递到远程服务器上。使用smtp协议,应用程序可以连接到邮件服务器上的smtp端口,将需要发送的邮件发送到服务器上。通过smtp协议,应用程序可以将邮件发送给多个收件人,并且可以添加附件、抄送、密送等功能。 基于pop3smtp协议邮件收发应用程序可以实现邮件的在线收发邮件的过滤、自动回复等功能。比如,用户可以通过这种应用程序将自己的邮件同步到不同的设备上,方便用户在不同设备之间进行邮件通讯。同时,邮件过滤功能可以帮助用户对垃圾邮件进行自动过滤,避免因垃圾邮件带来的骚扰和时间浪费。自动回复功能可以帮助用户在繁忙的工作中提高工作效率,避免因忙碌而错失重要的邮件。 总之,基于pop3smtp协议邮件收发应用程序可以帮助用户方便快捷地管理自己的邮件,提高工作效率,并且可以通过邮件通讯与他人进行沟通和交流。 ### 回答3: 随着互联网的普及,电子邮件作为一种必要的通信工具,已经被广泛地应用到各个领域。在日常生活和工作中,我们使用电子邮件收发邮件已经成为一种习惯。电子邮件涉及到多种协议,其中POP3SMTP协议邮件收发的核心协议。 基于POP3协议邮件收取应用程序,可以实现邮件的接收功能。POP3是邮局协议的缩写,其作用是接收用户在邮件服务器上的邮件。在收取邮件时,邮件客户端向邮件服务器发送请求,服务器响应请求并将邮件传输到客户端。POP3协议通过TCP协议传输数据,使用110端口。POP3协议的特点是将所有邮件下载到本地,用户可以对邮件进行管理,例如标记已读、删除、归档等操作。 基于SMTP协议邮件发送应用程序,可以实现邮件的发送功能。SMTP是简单邮件传输协议的缩写,其作用是将用户在邮件客户端上编写的邮件发送到邮件服务器。SMTP协议通过TCP协议传输数据,使用25端口。SMTP协议的特点是将邮件发送到服务器后,由服务器转发到其他邮件服务器,最终到达接收方。SMTP协议需要认证用户身份,确保发送者身份的安全。同时,SMTP协议还支持多种附件格式,例如文本、图片、音频、视频等。 邮件收发应用程序是一种基于网络的应用程序,能够帮助我们快速高效地收发邮件。在实现这种应用程序时,我们需要掌握POP3SMTP协议的工作原理和使用方法。除此之外,还需要考虑安全性、稳定性以及易用性等因素。通过不断地优化和改进,我们可以开发出更加高效、稳定、安全的邮件收发应用程序,为用户提供更好的服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值