`

JAVA实现简易的邮件客户端程序

阅读更多
/**
 * 简易的邮件客户端程序,后期将逐步完善提供友好UI
 * 测试发现不支持Gmail,Gmail SMTP采用了TSL/SSL协议
 * 已知JavaMail可实现SSL协议。。。
 */
package mail;

/**
 * @author Daniel Cheng
 *
 */
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.StringTokenizer;

public class SMTPClient {

	private boolean debug = true;
	BASE64Encoder encode = new BASE64Encoder();// 自定义BASE64Encoder工具类用于加密字符串

	public static void main(String[] args) throws UnknownHostException,
			IOException {
		MailMessage message = new MailMessage();
		message.setFrom("test@163.com");// 发件人
		message.setTo("test@hotmail.com,test@gmail.com,test@sina.com");// 多个收件人地址间用逗号隔开
		String server = "smtp.163.com";// SMTP邮件服务器
		message.setSubject("Java Mail Test");// 邮件主题
		message.setContent("你好!这里是系统发出的JAVA MAIL测试,请勿回复。");// 邮件内容
		message.setDataFrom("Sender");// 发件人,在邮件的发件人栏目中显示
		message.setDataTo("Receiver");// 收件人,在邮件的收件人栏目中显示
		message.setUser("test@163.com");// 登陆的邮箱账号
		message.setPassword("********");// 登陆邮箱的密码,建议自己保密好,公开传播会泄密

		SMTPClient smtp = new SMTPClient(server, 25);
		boolean flag;
		flag = smtp.sendMail(message, server);
		if (flag) {
			System.out.println("邮件发送成功!");
		} else {
			System.out.println("邮件发送失败!");
		}
	}

	private Socket socket;

	public SMTPClient(String server, int port) throws UnknownHostException,
			IOException {
		try {
			socket = new Socket(server, 25);
		} catch (SocketException e) {
			System.out.println(e.getMessage());
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			System.out.println("已经建立连接!");
		}

	}

	// 注册到邮件服务器
	public void helo(String server, BufferedReader in, BufferedWriter out)
			throws IOException {
		int result;
		result = getResult(in);
		// 连接上邮件服务后,服务器给出220应答
		if (result != 220) {
			throw new IOException("连接服务器失败");
		}
		result = sendServer("HELO " + server, in, out);
		// HELO命令成功后返回250
		if (result != 250) {
			throw new IOException("注册邮件服务器失败!");
		}
	}

	private int sendServer(String str, BufferedReader in, BufferedWriter out)
			throws IOException {
		out.write(str);
		out.newLine();
		out.flush();
		if (debug) {
			System.out.println("已发送命令:" + str);
		}
		return getResult(in);
	}

	public int getResult(BufferedReader in) {
		String line = "";
		try {
			line = in.readLine();
			if (debug) {
				System.out.println("服务器返回状态:" + line);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 从服务器返回消息中读出状态码,将其转换成整数返回
		StringTokenizer st = new StringTokenizer(line, " ");
		return Integer.parseInt(st.nextToken());
	}

	public void authLogin(MailMessage message, BufferedReader in,
			BufferedWriter out) throws IOException {
		int result;
		result = sendServer("AUTH LOGIN", in, out);
		if (result != 334) {
			throw new IOException("用户验证失败!");
		}

		result = sendServer(encode.encode(message.getUser().getBytes()), in,
				out);
		if (result != 334) {
			throw new IOException("错误!");
		}
		result = sendServer(encode.encode(message.getPassword().getBytes()),
				in, out);

		if (result != 235) {
			throw new IOException("验证失败!");
		}
	}

	// 开始发送消息,邮件源地址
	public void mailFrom(String source, BufferedReader in, BufferedWriter out)
			throws IOException {
		int result;
		result = sendServer("MAIL FROM:<" + source + ">", in, out);
		if (result != 250) {
			throw new IOException("指定源地址错误");
		}
	}

	// 设置邮件收件人。多邮件发送用","隔开
	public void rcpt(String touchman, BufferedReader in, BufferedWriter out)
			throws IOException {

		String[] mailList = touchman.split(",");
		if (mailList.length > 1) {
			for (String touch : mailList) {
				connectionServer(touch,in,out);
			}
		}else
			connectionServer(touchman,in,out);

	}

	private void connectionServer(String touch, BufferedReader in, BufferedWriter out)
			throws IOException {
		int result;
		result = sendServer("RCPT TO:<" + touch + ">", in, out);
		if (result != 250) {
			throw new IOException("指定目的地址错误!");
		}
	}

	// 邮件体
	public void data(String from, String to, String subject, String content,
			BufferedReader in, BufferedWriter out) throws IOException {
		int result;
		result = sendServer("DATA", in, out);
		// 输入DATA回车后,若收到354应答后,继续输入邮件内容
		if (result != 354) {
			throw new IOException("不能发送数据");
		}
		out.write("From: " + from);
		out.newLine();
		out.write("To: " + to);
		out.newLine();
		out.write("Subject: " + subject);
		out.newLine();
		out.newLine();
		out.write(content);
		out.newLine();
		// 句号加回车结束邮件内容输入
		result = sendServer(".", in, out);
		System.out.println(result);
		if (result != 250) {
			throw new IOException("发送数据错误");
		}
	}

	// 退出
	public void quit(BufferedReader in, BufferedWriter out) throws IOException {
		int result;
		result = sendServer("QUIT", in, out);
		if (result != 221) {
			throw new IOException("未能正确退出");
		}
	}

	// 发送邮件主程序
	public boolean sendMail(MailMessage message, String server) {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(socket
					.getInputStream()));
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
					socket.getOutputStream()));
			helo(server, in, out);// HELO命令
			authLogin(message, in, out);// AUTH LOGIN命令
			mailFrom(message.getFrom(), in, out);// MAIL FROM
			rcpt(message.getTo(), in, out);// RCPT
			data(message.getDataFrom(), message.getDataTo(), message
					.getSubject(), message.getContent(), in, out);// DATA
			quit(in, out);// QUIT
		} catch (Exception e) {
			e.printStackTrace();
			return false;

		}
		return true;
	}

}

 

/**
 * 邮件实体POJO类
 */
package mail;

/**
 * @author Daniel Cheng
 *
 */
public class MailMessage {
	private String from;
	private String to;
	private String subject;
	private String content;
	private String dataFrom;
	private String dataTo;
	private String user;
	private String password;
	/**
	 * 
	 */
	public MailMessage() {
		super();
		// TODO Auto-generated constructor stub
	}
	/**
	 * @param from
	 * @param to
	 * @param subject
	 * @param content
	 * @param dataFrom
	 * @param dataTo
	 * @param user
	 * @param password
	 */
	public MailMessage(String from, String to, String subject, String content,
			String dataFrom, String dataTo, String user, String password) {
		super();
		this.from = from;
		this.to = to;
		this.subject = subject;
		this.content = content;
		this.dataFrom = dataFrom;
		this.dataTo = dataTo;
		this.user = user;
		this.password = password;
	}
	public String getFrom() {
		return from;
	}
	public void setFrom(String from) {
		this.from = from;
	}
	public String getTo() {
		return to;
	}
	public void setTo(String to) {
		this.to = to;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getDataFrom() {
		return dataFrom;
	}
	public void setDataFrom(String dataFrom) {
		this.dataFrom = dataFrom;
	}
	public String getDataTo() {
		return dataTo;
	}
	public void setDataTo(String dataTo) {
		this.dataTo = dataTo;
	}
	public String getUser() {
		return user;
	}
	public void setUser(String user) {
		this.user = user;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	

}

 

/**
 * BASE64Encoder加密类
 */
package mail;

/**
 * @author Daniel Cheng
 *
 */
public class BASE64Encoder {
	private static char[] codec_table = { 'A', 'B', 'C', 'D', 'E', 'F', 'G',
        'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
        'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
        'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
        'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6',
        '7', '8', '9', '+', '/' };

public BASE64Encoder() {

}

public String encode(byte[] a) {
    int totalBits = a.length * 8;
    int nn = totalBits % 6;
    int curPos = 0;// process bits
    StringBuffer toReturn = new StringBuffer();
    while (curPos < totalBits) {
        int bytePos = curPos / 8;
        switch (curPos % 8) {
        case 0:
            toReturn.append(codec_table[(a[bytePos] & 0xfc) >> 2]);
            break;
        case 2:

            toReturn.append(codec_table[(a[bytePos] & 0x3f)]);
            break;
        case 4:
            if (bytePos == a.length - 1) {
                toReturn
                        .append(codec_table[((a[bytePos] & 0x0f) << 2) & 0x3f]);
            } else {
                int pos = (((a[bytePos] & 0x0f) << 2) | ((a[bytePos + 1] & 0xc0) >> 6)) & 0x3f;
                toReturn.append(codec_table[pos]);
            }
            break;
        case 6:
            if (bytePos == a.length - 1) {
                toReturn
                        .append(codec_table[((a[bytePos] & 0x03) << 4) & 0x3f]);
            } else {
                int pos = (((a[bytePos] & 0x03) << 4) | ((a[bytePos + 1] & 0xf0) >> 4)) & 0x3f;
                toReturn.append(codec_table[pos]);
            }
            break;
        default:
            //never hanppen
            break;
        }
        curPos+=6;
    }
    if(nn==2)
    {
        toReturn.append("==");
    }
    else if(nn==4)
    {
        toReturn.append("=");
    }
    return toReturn.toString();

}

}
 
分享到:
评论
1 楼 wilsonchen 2013-10-23  
谢谢分享,请问如何实现按照时间的倒序收取邮件呢?
谢谢^_^

相关推荐

    java实现的邮件客户端

    Java邮件客户端是一个基于Java编程语言实现的程序,它允许用户发送和接收电子邮件,包括嵌入的图片和附件。这个客户端的实现是通过JavaMail API来完成的,这是一个强大的开源库,专门为处理邮件通信而设计。JavaMail...

    Java实现邮件客户端

    以上是实现Java邮件客户端的关键技术点。通过学习和实践这些内容,你将能够构建出一个功能完善的邮件系统客户端。在具体实践中,还要根据实际需求进行定制化开发,比如增加日历集成、联系人管理等功能,以满足不同...

    JAVA开发邮件客户端

    在JAVA开发邮件客户端的过程中,涉及的关键技术和知识点相当广泛,涵盖了网络通信、邮件协议以及JAVA编程等多个领域。以下是对这些核心内容的详细解析: 1. **SMTP协议**:Simple Mail Transfer Protocol,简单邮件...

    JAVA邮件客户端实现

    总的来说,实现一个Java邮件客户端涉及对SMTP协议的理解,以及熟练使用JavaMail API的各种组件。这个过程不仅需要编写发送邮件的代码,还可能需要处理邮件的接收、存储和显示,是一个涵盖网络通信、邮件格式和用户...

    电子邮件客户端_Java实现

    电子邮件客户端的实现是Java编程中的一个重要应用场景,它允许用户通过编程方式发送、接收和管理电子邮件。本项目提供了完整的源代码和可运行程序,方便开发者学习和使用。 在Java中实现电子邮件客户端,主要涉及到...

    java简单电子邮件客户端

    Java简单电子邮件客户端是一个基于Java编程语言开发的轻量级应用,它允许用户通过可视化的界面发送和接收电子邮件。这个Demo项目展示了如何利用JavaMail API来实现SMTP(Simple Mail Transfer Protocol)和POP3...

    java版邮件客户端

    Java版邮件客户端是一种基于Java语言实现的程序,它允许用户收发电子邮件,是学习和理解Java编程技术的一个实用示例。这个项目的核心是利用JavaMail API,这是一个强大的库,专门用于处理电子邮件通信。通过JavaMail...

    JAVA简单邮件发送客户端程序设计编程资料

    JAVA简单邮件发送客户端程序设计

    Java实现邮件客户端源代码

    大家好,前几天我刚发过Java邮件客户端的JAR包,现在把源程序给补上,功能我就不多说了,只是给提醒下方法:由于我单独调用了两个JAR包(放在JavaMail API文件夹下的),所以大家首先要在项目里点——&gt; 库 ——&gt;右键...

    JAVA简单邮件发送客户端程序设计.doc

    总结,这个项目涵盖了从基础的电子邮件协议理解,到具体使用Java编程实现邮件客户端的关键技术和步骤。通过这个项目,学生不仅学习了Java编程,还了解了SMTP协议和Java Mail API的使用,为未来开发更复杂的邮件应用...

    java收发邮件的客户端

    Java邮件客户端是使用Java编程语言实现的用于发送和接收电子邮件的应用程序。在Java中,我们主要依靠JavaMail API(Java Mail Application Programming Interface)来处理邮件的收发功能,包括附件的处理。JavaMail ...

    java邮件客户端java邮件客户端

    总结来说,Java邮件客户端是Java应用程序中实现邮件功能的关键工具,它允许开发者利用JavaMail API与各种邮件服务器进行交互,实现邮件的发送和接收。通过理解和掌握JavaMail API,开发者可以构建功能丰富的邮件应用...

    Java实现e-mail邮件客户端(仅支持发送邮件)

    在Java编程环境中,实现一个电子邮件客户端主要是通过JavaMail API来完成的。这个API提供了一系列的类和接口,允许开发者创建、发送、接收和处理电子邮件。本项目“Java实现e-mail邮件客户端”专注于发送邮件功能,...

    创建一个Java电子邮件客户端

    在本文中,我们将深入探讨如何使用Java来创建一个基本的电子邮件客户端。首先,我们需要了解电子邮件的基本原理,电子邮件系统通常基于SMTP(Simple Mail Transfer Protocol)协议发送邮件,而使用IMAP(Internet ...

    LMail简易邮件客户端

    LMail简易邮件客户端是一款基于JMail组件开发的轻量级邮件收发软件。这款应用程序的主要目标是提供一个简单易用的界面,让用户能够快速地发送和接收电子邮件。由于开发时间较短,其功能相对有限,可能存在的问题和...

    简单电子邮件客户端的实现

    - **互联网协议栈**:电子邮件客户端的实现依赖于计算机网络的基础知识,特别是TCP/IP协议栈的理解。TCP/IP协议栈包括了应用层、传输层、网络层和链路层,每一层都有其特定的功能。 - **应用层**:应用层负责处理...

    java毕业设计邮件客户端

    Java毕业设计邮件客户端项目是一个利用Java编程语言实现的软件,其目标是创建一个可以收发电子邮件的应用程序。在这个项目中,开发者将面临一系列的技术挑战,包括理解电子邮件协议、网络通信、用户界面设计以及数据...

    JAVA简单邮件发送客户端程序的设计说明.doc

    JAVA简单邮件发送客户端程序的设计说明.doc

    java邮件发送客户端

    Java邮件发送客户端是一种利用JavaMail API开发的程序,它允许用户通过图形化的用户界面发送电子邮件。这个客户端可以作为个人或企业内部沟通的工具,也可以用于自动化邮件发送任务,例如发送通知、报告或订阅内容。...

Global site tag (gtag.js) - Google Analytics