posts - 28, comments - 27, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Socket收发邮件--SMTP和POP3

Posted on 2006-09-18 15:11 小小凉粉 阅读(2628) 评论(5)  编辑  收藏 所属分类: JavaSE
SMTP的连接和收发过程

a.建立TCP连接。
b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令服务器端正希望以OK作为响应,表明准备接收。
c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行
d.协商结束,发送邮件,用命令DATA发送
e.以.表示结束输入内容一起发送出去
f.结束此次发送,用QUIT命令退出。

SMTP的基本命令集

HELO   向服务器标识用户身份
MAIL   初始化邮件传输mail from:
RCPT   标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to:
DATA   在单个或多个RCPT命令后,表示所有的邮件接收人已标识,初始化数据传输,以.结束。
NOOP   无操作,服务器应响应OK
RSET   重置会话,当前传输被取消
QUIT   结束会话


POP3简介

在POP3协议中有三种状态,认可状态,处理状态,和更新状态。当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可状态转入处理状态,在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状态。

POP3基本命令集
USER username
PASS password   
STAT  请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数
LIST  返回邮件数量和每个邮件的大小
RETR [Msg#] 返回由参数标识的邮件的全部文本
DELE [Msg#] 服务器将由参数标识的邮件标记为删除,由quit命令执行
RSET 服务器将重置所有标记为删除的邮件,用于撤消DELE命令
NOOP 服务器返回一个肯定的响应
QUIT 更新


class POP3Demo {
   private static String POP3Server = "pop.126.com";
    private static String USERNAME = "username";//实际应用中改成真实的用户名
    private static String PASSWORD = "password";//实际应用中改成真实的密码
    public static void main(String[] args) {
        int POP3Port = 110;
        Socket client = null;
        try {
            // 向POP3服务程序建立一个套接字连接。
            client = new Socket(POP3Demo.POP3Server, POP3Port);
            // 创建一个BufferedReader对象,以便从套接字读取输出。
            InputStream is = client.getInputStream();
            BufferedReader sockin = new BufferedReader(new InputStreamReader(is));
            // 创建一个PrintWriter对象,以便向套接字写入内容。
            OutputStream os = client.getOutputStream();
            PrintWriter sockout = new PrintWriter(os, true);
            // 显示同SMTP服务程序的握手过程。
            System.out.println("S:" + sockin.readLine());
            sockout.println("user " + POP3Demo.USERNAME);
            System.out.println("S:" + sockin.readLine());
            sockout.println("pass " + POP3Demo.PASSWORD);
            System.out.println("S:" + sockin.readLine());
            sockout.println("stat");
            String temp[] = sockin.readLine().split(" ");
            int count = Integer.parseInt(temp[1]);//得到信箱中共有多少封邮件
            for (int i = 1; i < count + 1; i++) {//依次打印出邮件的内容
                sockout.println("retr " + i);
                System.out.println("以下为第" + i + "封邮件的内容");
                while (true) {
                    String reply = sockin.readLine();
                    System.out.println(reply);
                    if (reply.toLowerCase().equals(".")) {
                        break;
                    }
                }
            }

        } catch (IOException e) {
            System.out.println(e.toString());
        } finally {
            try {
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {}
        }
    }
}

 class SMTPDemo {
    //以下三项请在使用时改成真实的信箱地址
    //并且注意,SMTPServer和receiver必须是同一个服务器
    private static String sender = "sender";
    private static String receiver = "receiver";
    private static String SMTPServer = "smtpserver";
    public static void main(String[] args) {
        int SMTPPort = 25;
        Socket client = null;
        try {
            // 向SMTP服务程序建立一个套接字连接。
            client = new Socket(SMTPDemo.SMTPServer, SMTPPort);
            // 创建一个BufferedReader对象,以便从套接字读取输出。
            InputStream is = client.getInputStream();
            BufferedReader sockin = new BufferedReader(new InputStreamReader(is));
            // 创建一个PrintWriter对象,以便向套接字写入内容。
            OutputStream os = client.getOutputStream();
            PrintWriter sockout = new PrintWriter(os, true);
            // 显示同SMTP服务程序的握手过程。
            System.out.println("S:" + sockin.readLine());
            sockout.println("helo");
            System.out.println("S:" + sockin.readLine());
            sockout.println("mail from: " + "<" + SMTPDemo.sender + ">");
            System.out.println("S:" + sockin.readLine());
            sockout.println("rcpt to: " + "<" + SMTPDemo.receiver + ">");
            System.out.println("S:" + sockin.readLine());
            sockout.println("data");
            //发送邮件标题
            sockout.println("subject: 你好");
            //发送邮件内容
            sockout.println("ni hao");
            sockout.println("wo shi li jian");
            //此处的.为特殊标记,表示邮件结束
            sockout.println(".");
            sockout.println("rset");
            sockout.println("quit");
        } catch (IOException e) {
            System.out.println(e.toString());
        } finally {
            try {
                if (client != null) {
                    client.close();
                }
            } catch (IOException e) {}
        }
    }
}



评论

# re: Socket收发邮件--SMTP和POP3  回复  更多评论   

2006-09-19 09:16 by stoneshao
收邮件比较容易,难点是对收到的邮件进行解析,而解析的难点是编码问题,楼主可不可以针对这方面写点内容啊?

# re: Socket收发邮件--SMTP和POP3  回复  更多评论   

2006-09-19 09:32 by 小小凉粉
汗……

偶这篇文章只是帮一个国外的哥们作Java作业用的

编码这方面我也没有仔细研究过.....

看看最近有没有时间吧

# re: Socket收发邮件--SMTP和POP3  回复  更多评论   

2007-01-18 21:56 by 你好
呵呵, 楼主同时也帮了偶个大忙, 偶也是在国外, 也是这个java作业
用smtp 和pop3 收发电子邮件,

十分感谢!!!!!~~~~~~~~

# re: Socket收发邮件--SMTP和POP3  回复  更多评论   

2007-01-18 22:19 by 小小凉粉
不客气,请支持我的新博客:dearwolf.javaeye.com吧:)

# re: Socket收发邮件--SMTP和POP3  回复  更多评论   

2007-04-04 16:01 by 行风
楼主啊有没有程序啊我门做毕业设计做邮件系的啊
帮帮忙啊

只有注册用户登录后才能发表评论。


网站导航: