`
dearwolf
  • 浏览: 344443 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Socket收发邮件--SMTP和POP3

阅读更多
SMTP的连接和收发过程

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

SMTP的基本命令集

HELO   向服务器标识用户身份
MAIL   初始化邮件传输mail from: <xxx>
RCPT   标识单个的邮件接收人;常在MAIL命令后面可有多个rcpt to: <xxx>
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;
                    }
                }
            } </xxx></xxx>

 

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

分享到:
评论
2 楼 ashurm 2007-04-27  
为什么我发的helo服务器都没有响应阿,我只想看一下简单的smtp交互过程。可是服务器返回的都是null

import java.net.*;
import java.io.*;
public class SendMail {
	String from ="xxx@163.com";
	String to="ahurm001@gmail.com";
	String subject="hello";
	String mailServer="smtp.163.com";
	String data="nihoa";
	Socket s=null;
	PrintWriter bout=null;
	BufferedReader br=null;
	protected void sendM(String mess){
		try{
			if(mess!=null)
			{
			
				bout.write(mess);
				System.out.println("C "+mess);
				bout.flush();
			}

			System.out.println("S "+br.readLine());
			
		}
		catch(Exception e){
			e.getStackTrace();
			}
	}
	
	public SendMail(){
		try{
			s=new Socket(mailServer,25);
			System.out.println(""+s);
			bout=new PrintWriter(s.getOutputStream());
			br=new BufferedReader(new InputStreamReader(s.getInputStream()));
			//sendM(null);
			sendM("HELO "+"xxxx@163.com");
			sendM("MAIL FORM: "+from);
			sendM("RCPT TO: "+to);
			sendM("DATA");
			bout.println("Subject: "+subject);
			bout.println(data);
			sendM(".");
			bout.close();
			s.close();
		}
		catch(Exception e){
			e.getStackTrace();
			}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		
		SendMail a=new SendMail();
		
		
		// TODO Auto-generated method stub

	}

}

1 楼 ken1984 2006-12-28  
smtp少了需要帐号密码的功能

相关推荐

    计算机网络邮件收发 SMTP和POP3实现

    然后,使用SMTP协议发送邮件,这个过程涉及构建邮件头部(包括发件人、收件人信息)和邮件正文,并将它们发送到指定的邮件服务器。接收邮件则需要使用POP3协议,通过连接到邮件服务器,获取邮件列表,下载邮件内容到...

    pop3和SMTP协议邮件服务器

    POP3(Post Office Protocol version 3)和SMTP(Simple Mail Transfer Protocol)是互联网上用于电子邮件收发的两个关键协议。POP3主要用于从邮件服务器接收邮件,而SMTP则用于发送邮件。在本文中,我们将深入探讨...

    pop3 实现邮件客户端

    - `Pop3Message.cs`:这个类可能用于表示从服务器下载的单个邮件消息,可能包含邮件头信息和邮件体。 - `Pop3Client.cs`:这是核心的POP3客户端实现类,它负责建立与服务器的连接,执行登录、列举邮件、下载邮件和...

    精选_基于SMTP协议和POP3协议实现的邮件收发客户端_源码打包

    1. 用户界面:用户可以输入发件人、收件人、主题和邮件内容的地方。此外,还需要提供设置SMTP和POP3服务器地址、端口、用户名和密码的选项。 2. 连接管理:客户端需要建立与SMTP服务器和POP3服务器的连接,通常采用...

    Socket收发邮件

    总的来说,通过Java Socket编程实现邮件收发虽然比使用现成的JAVAMAIL库复杂,但它提供了对邮件传输过程的更多控制,可以用于学习网络编程和邮件系统的工作原理。不过,在实际项目中,除非有特殊需求,通常建议使用...

    Android邮件收发-毕业设计

    在Android应用中,我们可以使用JavaMail API或者Android的`java.net.Socket`类来实现SMTP发送邮件的功能。JavaMail API提供了一套完整的邮件处理库,包括创建、发送和管理邮件。你需要设置SMTP服务器地址、端口、...

    基于ApacheJames邮件服务器的收发邮件代码及服务

    - 创建`Message`对象,通常是`MimeMessage`实例,设置发件人、收件人、主题和邮件内容。 - 使用`Transport.send()`方法通过`Session`对象发送邮件。 4. **接收邮件的步骤** - 创建`Store`对象,通过`Session`...

    socket邮件客户端

    而IMAP则提供了更高级的功能,如在服务器上管理邮件、多设备同步和邮件分类。通过Socket连接,客户端与邮件服务器建立交互,获取邮件列表、下载邮件内容,甚至处理带有附件的邮件。 关于“支持附件”,Socket邮件...

    c# HotMail收发邮件

    在C#编程环境中,开发一个HotMail邮件收发系统涉及到多个关键知识点,这些知识点涵盖了网络通信、SMTP(Simple Mail Transfer Protocol)与POP3(Post Office Protocol version 3)协议、安全性和身份验证等方面。...

    邮件开发

    - **查找邮件服务器地址**:可通过邮件服务商的帮助中心获取SMTP服务器和POP3服务器的地址。 - **邮件发送者的身份标识**:实际的邮件发送者与邮件显示的发件人可以不一致。 - **邮件传输协议(SMTP)**:定义了...

    Java Socket Email 发送接收

    - 创建`Message`对象,设置发件人、收件人、主题和邮件正文,使用`MimeMessage`类可处理多部分消息(如HTML文本、纯文本)。 - 调用`Transport.send(Message)`方法将邮件发送出去。 2. **POP3接收邮件**: - ...

    POP3读取邮箱中邮件的服务

    POP3(Post Office Protocol version 3)是一种广泛用于接收电子邮件的标准协议,它是互联网上许多电子邮件服务器之间进行通信的协议之...在具体实践中,还需要结合服务商的特定要求和邮件内容的复杂性进行适配和优化。

    JavaMail收发Gmail邮件

    2. **Gmail的SMTP和POP3设置**: - SMTP服务器地址: smtp.gmail.com - SMTP端口: 465或587(使用SSL) - POP3服务器地址: pop.gmail.com - POP3端口: 995(使用SSL) #### 三、JavaMail配置SSL 在JavaMail中配置...

    一个用POP3扩展协议实现的收发SSL验证类邮箱的小程序

    在制作收发邮件的.NET程序时,一般使用JAMIL等第三方组件,但对于需要SSL安全验证的邮箱就有些麻烦了,其实有两种办法,SOCKET和POP3扩展协议,这里上传了一个Pop3mimeclient类实现的收发SSL类邮箱的小程序,该类是...

    基于NETBEANS邮件收发服务器代码

    邮件系统通常遵循SMTP(简单邮件传输协议)和POP3(邮局协议第三版)或IMAP(因特网消息访问协议)标准。SMTP用于发送邮件,而POP3或IMAP用于接收邮件。在Java中,我们可以使用内置的`java.net.Socket`类来创建和...

    计算机网络 邮件收发 课程设计报告

    在这个过程中,学生需要掌握SMTP(Simple Mail Transfer Protocol)和POP3(Post Office Protocol version 3)这两种电子邮件传输协议。 SMTP是用于发送邮件的标准协议,它规定了邮件服务器之间如何传递邮件。在...

    kmail油箱服务(支持自动收发邮件,支持任何类型的附件发送,接收.)

    总的来说,Kmail邮箱服务通过POP3和SMTP协议实现了邮件的收发,并且具备自动处理和附件管理的强大功能,为用户提供了高效、便捷的邮件通信体验。其开源的特性鼓励了开发者社区的交流和学习,对于提升个人或团队的...

    电子邮件收发程序(c++版)

    总之,"电子邮件收发程序(c++版)"项目涵盖了网络通信、协议解析、用户交互等多个方面的知识,通过分析"Mailchecker"和"MailSend"源码,开发者不仅可以深入理解SMTP和POP3协议,还能提升C++在网络编程领域的实践...

    vc++收发电子邮件系统

    这包括邮件头信息(发件人、收件人、主题等)和邮件体的MIME编码。 6. **多线程编程**:为了实现同时的邮件收发,可能需要使用多线程技术,让发送和接收任务并行进行,提高程序的响应速度。 7. **错误处理**:良好...

Global site tag (gtag.js) - Google Analytics