初学JAVA,第一次写用户界面,实现发送邮件,很多不足,希望大家能指出,谢谢~~~
下面是服务程序
import java.net.*;
import java.io.*;
public class MailSenderWithGUI{
private String smtpServer="smtp.cauc.edu.cn";
//我校SMTP邮件服务器的主机名
private int port=587;
//我校SMTP邮件服务器的端口
private String senderadd="";
//发送者邮箱地址
private String username="";
//发送者用户名
private String password="";
//邮箱密码
private String receiveadd="";
//收件者邮箱地址
private String title="";
//邮件标题
private String message="";
//邮件正文
private Message msg;
//邮件类
public String ans="";
//通信信息
//含参构造函数,传入控件接收的数据,去掉了主函数
public MailSenderWithGUI
(String senderadd,String username,String password,
String receiveadd,String title,String message){
this.senderadd=senderadd;
this.username=username;
this.password=password;
this.receiveadd=receiveadd;
this.title=title;
this.message=message;
}
public MailSenderWithGUI(){}
public void sendMail(){
//发送邮件,去掉了参数
Message msg=new Message(senderadd,receiveadd,title,message);
Socket socket=null;
//创建未连接的套接字
try{
socket = new Socket(smtpServer,port);
//连接到邮件服务器
BufferedReader br =getReader(socket);
//套接字缓冲字符输入流
PrintWriter pw = getWriter(socket);
//套接字缓冲字符输出流
String localhost= InetAddress.getLocalHost().getHostName();
//客户主机的名字
//对用户名和口令进行base64编码
username = new BASE64Encoder().encode(username.getBytes());
password = new BASE64Encoder().encode(password.getBytes());
//对口令进行base64编码
//表示通信过程的字符串添加数据
ans=ans.concat(sendAndReceive(null,br,pw)+"\n");
//接收服务器的响应数据
ans=ans.concat(sendAndReceive("HELO " + localhost,br,pw)+"\n");
ans=ans.concat(sendAndReceive("AUTH LOGIN",br,pw)+"\n");
//认证命令
ans=ans.concat(sendAndReceive(username,br,pw)+"\n");
//用户名
ans=ans.concat(sendAndReceive(password,br,pw)+"\n");
//口令
ans=ans.concat(sendAndReceive("MAIL FROM: " + msg.from+"",br,pw)+"\n");
ans=ans.concat(sendAndReceive("RCPT TO: " + msg.to+"",br,pw)+"\n");
ans=ans.concat(sendAndReceive("DATA",br,pw)+"\n");
//接下来开始发送邮件内容
pw.println(msg.data);
//
发送邮件内容
ans=ans.concat("Client>"+msg.data+"\n");
ans=ans.concat(sendAndReceive(".",br,pw)+"\n");
//邮件发送完毕
ans=ans.concat(sendAndReceive("QUIT",br,pw)+"\n");
//结束通信
}catch (IOException e){
e.printStackTrace();
}finally{
try{
if(socket!=null)socket.close();
}catch (IOException e) {e.printStackTrace();}
}
}
//
发送一行字符串,并接收一行服务器的响应数据
private String sendAndReceive(String str,BufferedReader br,PrintWriter pw) throws IOException{
if (str != null){ pw.println(str); }
//
发送完str字符串后,还会发送“\r\n”。
String response;
if ((response = br.readLine()) != null){}
return "Client>"+str+"\n"+"Server>"+response;
//
返回字符串,去掉在控制台输出
}
private PrintWriter getWriter(Socket socket)throws IOException{
//
封装套接字输出流成字符型
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut,true);
}
private BufferedReader getReader(Socket socket)throws IOException{
//
封装套接字输入流成字符
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
}
class Message{
//
表示邮件
String from;
//
发送者的邮件地址
String to;
//
接收者的邮件地址
String subject;
//
邮件标题
String content;
//
邮件正文
String data;
//
邮件内容,包括邮件标题和正文
public Message(String from,String to, String subject, String content){
this.from=from;
this.to=to;
this.subject=subject;
this.content=content;
data="Subject:"+subject+"\r\n\r\n"+content;
}
}
class BASE64Encoder {
//base64
编码类(这段是摘的)
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();
}
}
下面是界面的代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class EmailGUI extends JFrame
//
定义空间,用于发送邮件界面
{
private JTextField senderadd=new JTextField(20);
//
定义单行文本框,输入发送人邮箱
private JTextField senderpassword=new JTextField(20);
//
定义单行文本框,输入发送人邮箱密码
private JTextField username=new JTextField(20);
//
定义单行文本框,输入发送人用户名
private JTextField receiveadd=new JTextField(20);
//
定义单行文本框,输入收件人邮箱
private JButton sendButton=new JButton("
发送");
//
定义按钮,执行发送命令
private JTextField mailname=new JTextField(20);
//
定义单行文本框,输入邮件标题
private JTextArea mailtext=new JTextArea(15,80);
//
定义多行文本框,输入邮件正文
private MailSenderWithGUI server;
//
定义邮件服务器
public EmailGUI(MailSenderWithGUI mailsender)
{
super("MailServer");
//
设置标题栏名字
this.server=mailsender;
Font f=new Font("Monospaced",Font.PLAIN,12);
//
设置字体
mailtext.setFont(f);
//
设置多行文本框字体
mailtext.setEditable(true);
//
设置多行文本框可编辑
JPanel centerPanel=new JPanel();
//
定义面板
centerPanel.setLayout(new BorderLayout());
//
设置布局
JPanel northPanel=new JPanel();
northPanel.setLayout(new BorderLayout());
Container pane=this.getContentPane();
//
定义容器
pane.add("Center", centerPanel);
//
添加面板
pane.add("North",northPanel);
JPanel northPanelTop=new JPanel();
northPanelTop.setLayout(new FlowLayout(FlowLayout.LEFT));
//
添加控件
northPanelTop.add(new JLabel("
发件人地址:"));
//
添加标签
northPanelTop.add(senderadd);
northPanelTop.add(new JLabel("
用户名:"));
northPanelTop.add(username);
northPanelTop.add(new JLabel("
邮箱密码:"));
northPanelTop.add(senderpassword);
northPanelTop.add(sendButton);
northPanel.add("North",northPanelTop);
JPanel northPanelBottom=new JPanel();
northPanelBottom.setLayout(new FlowLayout(FlowLayout.LEFT));
northPanelBottom.add(new JLabel("
收件人地址:"));
northPanelBottom.add(receiveadd);
northPanel.add("Center",northPanelBottom);
JPanel centerPanelNorth=new JPanel();
centerPanelNorth.setLayout(new FlowLayout(FlowLayout.LEFT));
centerPanelNorth.add(new JLabel("
邮件正标题:"));
centerPanelNorth.add(mailname);
centerPanel.add("North",centerPanelNorth);
JPanel centerPanelBottom=new JPanel();
centerPanelBottom.setLayout(new BorderLayout());
centerPanelBottom.add("North",new JLabel("
邮件正文:"));
JPanel centerPanelCenter=new JPanel();
centerPanelCenter.setLayout(new GridLayout(1,3,5,5));
JScrollPane jsp = new JScrollPane(mailtext);
//
定义滚动面板,在面板中添加多行文本框
centerPanelCenter.add(jsp);
centerPanelBottom.add("Center",centerPanelCenter);
centerPanel.add("Center",centerPanelBottom);
ActionListener al=new LookupNames();
//
定义动作事件监听器
sendButton.addActionListener(al);
//
给发送按钮注册动作事件监听器
}
class LookupNames implements ActionListener
//
动作事件监听器
{
public void actionPerformed(ActionEvent evt)
//
定义回调方法中的事件处理函数
{
MailSenderWithGUI newserver=new MailSenderWithGUI
(senderadd.getText(),username.getText(),senderpassword.getText(),
receiveadd.getText(),mailname.getText(),mailtext.getText());
//
将用户传给控件的数据作为参数构造邮件发送服务器
server=newserver;
server.sendMail();
//
发送邮件
JFrame ans=new JFrame("
回显");
//
定义容器,用于存放后台通信过程
ans.setBounds(300,200,800,400);
//
设置容器的位置和大小
ans.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
设置关闭按钮
JTextArea intrArea=new JTextArea();
//
设置多行文本框,用于显示通信过程
JScrollPane scrollPane=new JScrollPane (intrArea,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED
);//
定义滚动面板
ans.add(scrollPane);
ans.setVisible(true);
//
设置可见
intrArea.setText(server.ans);
//
设置多行文本框的内容
}
}
public static void main(String[] args)
{
MailSenderWithGUI server=new MailSenderWithGUI();
//
创建邮件发送服务器对象
EmailGUI a=new EmailGUI(server);
//
创建界面
a.setLocation(100,100);
//
设置位置
a.setSize(1000,600);
//
设置大小
a.setVisible(true);
//
设置可见
a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//
设置关闭按钮
}
}
运行效果:
填好信息后点击发送,会弹出界面表示通信过程:
我测试的时候是自己发给自己的,所以登陆我自己的校邮后可以看到收到的邮件
密码的输入应该使用
JPasswordField类,不显示回显的字符,但是实验时在使用时发生错误说使用了过时的方法,之后就没有使用,然后在编程过程中,但是不确定所用的传递的方法会不会影响安全性,同时在编写的代码中可能有一些冗余无用的语句,希望大家指导指导
转载于:https://blog.51cto.com/skinnylove/842029