首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > Socket收发邮件--SMTP和POP3
【标  题】:Socket收发邮件--SMTP和POP3
【关键字】:Socket,--SMTP,POP3
【来  源】:http://www.blogjava.net/dearwolf/archive/2006/09/18/70300.html

Socket收发邮件--SMTP和POP3

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) {}
??????? }
??? }
}


JavaScript 随笔汇集:【上一篇】
权限的设计分析:【下一篇】
【相关文章】
  • WinSocket工作模式(转)
  • .Net 下Socket的一些性能参数
  • setsockopt(CreateSock,SOL_SOCKET,SO_REUSEADDR,(LPSTR)&dwFlag,sizeof(dwFlag));说明
  • Linux c 网络socket编程
  • 用AsyncSocket实现telnet服务的疑问
  • socket编程中select的使用
  • 网卡问题:Unable to initialize Windows Sockets interface
  • SMTP/POP3 命令简介
  • 关于serverSocket和clientSocket文件传输
  • 用CAsyncSocket类实现TCP UDP的模型
  • 【随机文章】
  • c++学习资料下载站点
  • SQLServer实现工具的中英文界面互换
  • PHP与SQL注入攻击[一]
  • 基于C#的接口基础教程之三
  • 嘴上长了个火泡
  • 光纤市场 亟待规范
  • java学习笔记(四)----对象、数组作为参数传递,静态变量、静态方法的使用,内部类,使用文档注释
  • GetPrivateProfileString函数说明
  • 将字符串中某一字符串替代成其它的字符
  • Hacker文化
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.