Socket实例1--POP3客户端程序

Socket实例1--POP3客户端程序
 

   下面的代码实例基于POP3的客户协议,与邮件服务器连接并取回指定用户帐号的邮件。
  与邮件服务器交互的命令存在字符串数组POPMessage中,程序通过一个do-while循环依次发送这些命令。
#include<stdio.h> <stdlib.h> <errno.h> <string.h> <netdb.h>
#include<sys/types.h> <netinet/in.h> <sys/socket.h>
#define POP3SERVPORT 110  #define MAXDATASIZE 4096
int main(int argc, char *argv[])
{
    int sockfd;
    char Serv_Host[] = "60.28.205.11";
    struct hostent *host;
    struct sockaddr_in serv_addr;
    char *POPMessage[] = {
        "USER huaying.xie/r/n", //回车换行
        "PASS mypasswd/r/n",
        "STAT/r/n",
        "LIST/r/n",
        "TOP 1/r/n",
        "RETR 1/r/n",
        //"DELE 1/r/n",
        "QUIT/r/n",
        NULL
    };
    int iLength;
    int iMsg = 0;
    //int iEnd = 0;
    char buf[MAXDATASIZE];
    if((host = gethostbyname(Serv_Host)) == NULL){
        perror("gethostbyname error:");
        exit(1);
    }
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("socket error:");
        exit(1);
    }
    serv_addr.sin_family = PF_INET;
    serv_addr.sin_port = htons(POP3SERVPORT);
    serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
    bzero(&(serv_addr.sin_zero), 8);
    if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1){
        perror("connect error:");
        exit(1);
    }
    do{
        int iEnd = 0;
        send(sockfd, POPMessage[iMsg], strlen(POPMessage[iMsg]), 0);
        printf("have sent: %s", POPMessage[iMsg]);
        //iLength = recv(sockfd, buf+iEnd, sizeof(buf)-iEnd, 0);
        iLength = recv(sockfd, buf, sizeof(buf), 0);
        iEnd += iLength;
        buf[iEnd] = '/0';
        printf("received: %s, %d/n", buf, iMsg);
        iMsg++;
    }while(POPMessage[iMsg]);
    close(sockfd);
    return 0;
}

POP3 命令简介(网络整理)
  POP3 (Post Office Protocol 3) 即邮局协议的第 3 个版本,它规定怎样将个人计算机连接到 Internet 的邮件服务器和下载电子邮件的电子协议。
      它是因特网电子邮件的 第一个离线协议标准, POP3 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3 协议的接收邮件服务器,用来接收电子邮件的。
  POP3 命令:(不区分大小写)
    USER username 认证用户名
    PASS password 认证密码认证,认证通过则状态转换
    APOP name,digest 认可一种安全传输口令的办法,执行成功导致状态转换,请参见 RFC 1321 。
    STAT 处理请求 server 回送邮箱统计资料,如邮件数、 邮件总字节数
    UIDL n 处理 server 返回用于该指定邮件的唯一标识, 如果没有指定,返回所有的。
    LIST n 处理 server 返回指定邮件的大小等
    RETR n 处理 server 返回邮件的全部文本
    DELE n 处理 server 标记删除,QUIT 命令执行时才真正删除
    RSET 处理撤消所有的 DELE 命令
    TOP n,m 处理返回 n 号邮件的前 m 行内容,m 必须是自然数
    NOOP 处理 server 返回一个肯定的响应
    QUIT 希望结束会话。如果 server 处于"处理" 状态,则现在进入"更新"状态,删除那些标记成删除的邮件。如果 server 处于"认可"状态,则结束会话时 server 不进入"更新"状态 。

  使用telnet 连接 Mail Server 收信
    telnet 60.28.205.40 110 ---使用 telnet 命令连接服务器 110 端口
      Trying 119.119.119.212... --- 正在连接服务器 110 端口
      Connected to 119.119.119.212. --- 连接服务器 110 端口成功
      +OK Winmail Mail Server POP3 ready
    user username --- 输入用户名, username 为具体的用户名 如:huaying.xie
      +OK --- 执行命令成功
    pass password --- 输入用户密码,password 为具体的密码
      +OK 2 messages --- 密码认证通过
      (-ERR authorization failed --- 密码认证失败)
    stat --- 邮箱状态
      +OK 2 6415 --- 2 为该信箱总邮件数,6415 为总字节数
    list --- 列出每封邮件的字节数
      +OK --- 执行命令成功,开始显示,左边为邮件的序号,右边为该邮件的大小
      1 537 --- 第 1 封邮件,大小为 537 字节
      2 5878 --- 第 2 封邮件,大小为 5878 字节
      .
    top 1 --- 接收第 1 封邮件
      +OK --- 接收成功, 返回第 1 封邮件头
      Return-Path: <test1@look.com>
      Delivered-To: test2@look.com
      Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
      From: test1@look.com
      To: test2@look.com
      Date: Mon, 25 Oct 2004 14:24:27 +0800
      Subject: test mail
      .
    retr 1 --- 接收第 1 封邮件
      +OK --- 接收成功, 返回第 1 封邮件全部内容
      Return-Path: <test1@look.com>
      Delivered-To: test2@look.com
      Received: (winmail server invoked for smtp delivery); Mon, 25 Oct 2004 14:24:27 +0800
      From: test1@look.com
      To: test2@look.com
      Date: Mon, 25 Oct 2004 14:24:27 +0800
      Subject: test mail     
      Hi, test2
      This is a test mail, you don't reply it.
      .
    dele 1 --- 删除第 1 封邮件
      +OK --- 删除成功
    dele 2 --- 删除第 2 封邮件
      +OK --- 删除成功
    quit --- 结束会话
      +OK --- 执行命令成功

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值