初学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类,不显示回显的字符,但是实验时在使用时发生错误说使用了过时的方法,之后就没有使用,然后在编程过程中,但是不确定所用的传递的方法会不会影响安全性,同时在编写的代码中可能有一些冗余无用的语句,希望大家指导指导