/**
* 简易的邮件客户端程序,后期将逐步完善提供友好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();
}
}
分享到:
相关推荐
Java邮件客户端是一个基于Java编程语言实现的程序,它允许用户发送和接收电子邮件,包括嵌入的图片和附件。这个客户端的实现是通过JavaMail API来完成的,这是一个强大的开源库,专门为处理邮件通信而设计。JavaMail...
以上是实现Java邮件客户端的关键技术点。通过学习和实践这些内容,你将能够构建出一个功能完善的邮件系统客户端。在具体实践中,还要根据实际需求进行定制化开发,比如增加日历集成、联系人管理等功能,以满足不同...
在JAVA开发邮件客户端的过程中,涉及的关键技术和知识点相当广泛,涵盖了网络通信、邮件协议以及JAVA编程等多个领域。以下是对这些核心内容的详细解析: 1. **SMTP协议**:Simple Mail Transfer Protocol,简单邮件...
总的来说,实现一个Java邮件客户端涉及对SMTP协议的理解,以及熟练使用JavaMail API的各种组件。这个过程不仅需要编写发送邮件的代码,还可能需要处理邮件的接收、存储和显示,是一个涵盖网络通信、邮件格式和用户...
电子邮件客户端的实现是Java编程中的一个重要应用场景,它允许用户通过编程方式发送、接收和管理电子邮件。本项目提供了完整的源代码和可运行程序,方便开发者学习和使用。 在Java中实现电子邮件客户端,主要涉及到...
Java简单电子邮件客户端是一个基于Java编程语言开发的轻量级应用,它允许用户通过可视化的界面发送和接收电子邮件。这个Demo项目展示了如何利用JavaMail API来实现SMTP(Simple Mail Transfer Protocol)和POP3...
Java版邮件客户端是一种基于Java语言实现的程序,它允许用户收发电子邮件,是学习和理解Java编程技术的一个实用示例。这个项目的核心是利用JavaMail API,这是一个强大的库,专门用于处理电子邮件通信。通过JavaMail...
JAVA简单邮件发送客户端程序设计
大家好,前几天我刚发过Java邮件客户端的JAR包,现在把源程序给补上,功能我就不多说了,只是给提醒下方法:由于我单独调用了两个JAR包(放在JavaMail API文件夹下的),所以大家首先要在项目里点——> 库 ——>右键...
总结,这个项目涵盖了从基础的电子邮件协议理解,到具体使用Java编程实现邮件客户端的关键技术和步骤。通过这个项目,学生不仅学习了Java编程,还了解了SMTP协议和Java Mail API的使用,为未来开发更复杂的邮件应用...
Java邮件客户端是使用Java编程语言实现的用于发送和接收电子邮件的应用程序。在Java中,我们主要依靠JavaMail API(Java Mail Application Programming Interface)来处理邮件的收发功能,包括附件的处理。JavaMail ...
总结来说,Java邮件客户端是Java应用程序中实现邮件功能的关键工具,它允许开发者利用JavaMail API与各种邮件服务器进行交互,实现邮件的发送和接收。通过理解和掌握JavaMail API,开发者可以构建功能丰富的邮件应用...
在Java编程环境中,实现一个电子邮件客户端主要是通过JavaMail API来完成的。这个API提供了一系列的类和接口,允许开发者创建、发送、接收和处理电子邮件。本项目“Java实现e-mail邮件客户端”专注于发送邮件功能,...
在本文中,我们将深入探讨如何使用Java来创建一个基本的电子邮件客户端。首先,我们需要了解电子邮件的基本原理,电子邮件系统通常基于SMTP(Simple Mail Transfer Protocol)协议发送邮件,而使用IMAP(Internet ...
LMail简易邮件客户端是一款基于JMail组件开发的轻量级邮件收发软件。这款应用程序的主要目标是提供一个简单易用的界面,让用户能够快速地发送和接收电子邮件。由于开发时间较短,其功能相对有限,可能存在的问题和...
- **互联网协议栈**:电子邮件客户端的实现依赖于计算机网络的基础知识,特别是TCP/IP协议栈的理解。TCP/IP协议栈包括了应用层、传输层、网络层和链路层,每一层都有其特定的功能。 - **应用层**:应用层负责处理...
Java毕业设计邮件客户端项目是一个利用Java编程语言实现的软件,其目标是创建一个可以收发电子邮件的应用程序。在这个项目中,开发者将面临一系列的技术挑战,包括理解电子邮件协议、网络通信、用户界面设计以及数据...
JAVA简单邮件发送客户端程序的设计说明.doc
Java邮件发送客户端是一种利用JavaMail API开发的程序,它允许用户通过图形化的用户界面发送电子邮件。这个客户端可以作为个人或企业内部沟通的工具,也可以用于自动化邮件发送任务,例如发送通知、报告或订阅内容。...