Java Swing 郵箱管理系統(實現註冊/登錄、收/發郵件)

回顧Swing知識第二天,實現了一個簡單的郵箱管理系統

技術點:

Swing窗口+MYSQL+Eclipse

主要代碼實現:

一、數據庫連接類

package Jdbc;

import java.sql.*;

public class connector {
    // JDBC 驅動名及數據庫 URL
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC";//需要自行設置數據庫路由

    // 數據庫的用戶名與密碼,需要根據自己的設置
    static final String USER = "root";//數據庫用戶名
    static final String PASS = "123456";//數據庫密碼

    //以下是我自己項目裏面的涉及到jdbc數據庫操作的兩個函數,一個是select,一個是insert
    public static String getname(String account, String password) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 註冊 JDBC 驅動
            Class.forName("com.mysql.jdbc.Driver");

            // 打開鏈接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 執行查詢
            stmt = conn.createStatement();
            String sql;
            sql = "SELECT user_name FROM user WHERE user_account='"+account+"' AND user_psd='"+password+"'";
            System.out.println(sql);
            ResultSet rs = stmt.executeQuery(sql);
            if(rs.next()){
                return rs.getString("user_name");
            }
            return "";
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
    public static boolean adduser(String account, String password,String username) {
        Connection conn = null;
        Statement stmt = null;
        try {
            // 註冊 JDBC 驅動
            Class.forName("com.mysql.jdbc.Driver");

            // 打開鏈接
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            // 執行查詢
            String sql="insert into user(user_account,user_psd,user_name) values(?,?,?)";//sql語句

            PreparedStatement pstmt=conn.prepareStatement(sql);//獲得預置對象
            pstmt.setString(1, account);//設置佔位符的值
            pstmt.setString(2, password);
            pstmt.setString(3, username);

            int res=pstmt.executeUpdate();//執行sql語句
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
}

二、登錄窗口

package MailAssistant;

import Jdbc.connector;
import MailAssistant.Entity.User;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class LoginFrame extends JFrame {
    private String mailAccount;
    private String authorizePassword;

    private JPanel contentPane;
    private final JButton LoginButton = new JButton("登陸");
    private final JButton RegisterButton = new JButton("註冊");
    private int number;
    private final JTextField AccounttextField = new JTextField();
    private final JTextField PasswordtextField = new JTextField();
    private final JTable table = new JTable();
    int xOld = 0;
    int yOld = 0;
    private final JLabel Accountlabel = new JLabel("用戶名:");
    private final JLabel Passwordlabel = new JLabel("密碼:");
    private final JScrollPane scrollPane = new JScrollPane();
    //背景圖片bgImage
    private ImageIcon bgImage = new ImageIcon("res/Register.png");

    public void uninum() {
        mailAccount = "";
        authorizePassword = "";
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    LoginFrame frame = new LoginFrame();
                    frame.setVisible(true);
                    frame.button(frame);
                    frame.RegisterButton(frame);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public JButton getLoginbutton() {
        return LoginButton;
    }

    public void button(LoginFrame a) {
        JButton button = new JButton();
        button = a.getLoginbutton();
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String user_name = connector.getname(AccounttextField.getText(),PasswordtextField.getText());
                if (!user_name.equals("")){
                    JOptionPane.showMessageDialog(new JLabel(), "登陸成功,歡迎你 "+user_name, "提示",JOptionPane.WARNING_MESSAGE);
                    User user = User.getSingleInstance(AccounttextField.getText(),PasswordtextField.getText(),user_name);
                    MailFrame frame = new MailFrame(user);
                    frame.button(frame);
                    frame.Inboxbutton(frame);
                    frame.setVisible(true);
                    a.setVisible(false);  //窗體不可見
                }
                else {
                    JOptionPane.showMessageDialog(new JLabel(), "用戶名或密碼錯誤", "警告",JOptionPane.WARNING_MESSAGE);
                    AccounttextField.setText("");
                    PasswordtextField.setText("");
                }

            }
        });
    }

    public JButton getRegisterbutton() {
        return RegisterButton;
    }

    public void RegisterButton(LoginFrame a) {
        JButton button = new JButton();
        button = a.getRegisterbutton();
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                a.setVisible(false);
                RegisterFrame frame = new RegisterFrame();
                frame.Registerbutton(frame);
                frame.Loginbutton(frame);
                frame.setVisible(true);

            }
        });
    }

    public LoginFrame() {
        uninum();
        getContentPane().setLayout(null);
        this.setLocationRelativeTo(null);
        bgImage.setImageObserver(null);
        this.setSize((bgImage).getIconWidth(), bgImage.getIconHeight());
        //處理拖動事件---去掉默認邊框後,不能拖動了,具體實現如下
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                xOld = e.getX();//記錄鼠標按下時的座標
                yOld = e.getY();
            }
        });

        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                int xOnScreen = e.getXOnScreen();
                int yOnScreen = e.getYOnScreen();
                int xx = xOnScreen - xOld;
                int yy = yOnScreen - yOld;
                LoginFrame.this.setLocation(xx, yy);//設置拖拽後,窗口的位置
            }
        });

        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.setSize(bgImage.getIconWidth(), bgImage.getIconHeight());
        getContentPane().add(layeredPane);

        //背景圖層Panel,充當容器---最底層
        JPanel bgPanel = new JPanel();
        bgPanel.setLocation(0, 0);
        bgPanel.setSize(bgImage.getIconWidth(), bgImage.getIconHeight());
        layeredPane.add(bgPanel, JLayeredPane.DEFAULT_LAYER);//放在最底層

        //背景圖片,添加到背景圖層Panel裏面
        JLabel bgLabel = new JLabel(bgImage);
        bgPanel.add(bgLabel);

        //主界面,也就是背景上面的一層Panel,可用於添加控件
        contentPane = new JPanel();
        contentPane.setLocation(0, 0);
        contentPane.setSize(700, 450);
        contentPane.setLayout(null);
        contentPane.setOpaque(false);
        layeredPane.add(contentPane, JLayeredPane.MODAL_LAYER);//放在較高一層

        //關閉按鈕
        JButton closeButton = new JButton();
        closeButton.setSize(30, 30);
        contentPane.add(closeButton);

        JLabel lblNewLabel = new JLabel("用戶登錄");
        lblNewLabel.setFont(new Font("楷體", Font.PLAIN, 28));
        lblNewLabel.setForeground(new Color(0, 0, 128));
        lblNewLabel.setBounds(200, 0, 464, 50);
        contentPane.add(lblNewLabel);

        //請輸入用戶郵箱賬號
        Accountlabel.setForeground(new Color(0, 0, 0));
        Accountlabel.setBounds(5, 185, 60, 20);
        contentPane.add(Accountlabel);

        //用戶郵箱賬號輸入框
        AccounttextField.setBounds(65, 185, 120, 20);
        contentPane.add(AccounttextField);

        //請輸入用戶郵箱授權密碼
        Passwordlabel.setForeground(new Color(0, 0, 0));
        Passwordlabel.setBounds(185, 185, 45, 20);
        contentPane.add(Passwordlabel);

        //用戶郵箱授權密碼輸入框
        PasswordtextField.setBounds(230, 185, 120, 20);
        contentPane.add(PasswordtextField);

        //登錄
        LoginButton.setBounds(360, 185, 60, 20);
        contentPane.add(LoginButton);

        //註冊
        RegisterButton.setBounds(425, 185, 60, 20);
        contentPane.add(RegisterButton);

//        table.setBounds(20, 73, 309, 367);
        table.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent arg0) {
                int rowIndex = table.getSelectedRow();
                String b = table.getValueAt(rowIndex, 0).toString();
                int id = Integer.parseInt(b);
            }
        });
        scrollPane.setViewportView(table);

        closeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        this.setLayeredPane(layeredPane);
        this.setLocationRelativeTo(null);
        bgImage.setImageObserver(null);
        this.setSize((bgImage).getIconWidth(), bgImage.getIconHeight());
        this.setLocation(bgImage.getIconWidth(), bgImage.getIconHeight());
        this.setUndecorated(true);//去邊框

    }
}

三、主窗口

package MailAssistant;

import MailAssistant.Entity.User;

import javax.mail.Message;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;

public class MailFrame extends JFrame {

    private JPanel contentPane;
    private final JButton SendButton = new JButton("發送");
    private final JButton InboxButton = new JButton("收件箱");
    private int number;

    private final JTable table = new JTable();
    int xOld = 0;
    int yOld = 0;
    private final JLabel Receiverlabel = new JLabel("收件人");
    private final JTextField ReceivertextField = new JTextField();
    private final JLabel Subjectlabel = new JLabel("主題");
    private final JTextField SubjecttextField = new JTextField();
    private final JLabel Contentlabel = new JLabel("郵件內容");
    private final JTextArea ContenttextField = new JTextArea();

    private final JScrollPane scrollPane = new JScrollPane();
    private final JLabel lblAbc = new JLabel("");
    private final JLabel lblNewLabel_1 = new JLabel("");
    private final JLabel lblNewLabel_2 = new JLabel("");
    private final JLabel lblNewLabel_3 = new JLabel("");
    private final JLabel lblNewLabel_4 = new JLabel("");
    private final JSplitPane splitPane = new JSplitPane();
    private String mailAccount;
    private String authorizePassword;

    private String ReceiverAccount;
    private String Subject;
    private String Content;

    private User user;


    //背景圖片bgImage
    private ImageIcon bgImage = new ImageIcon("res/Mail.jpg");

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MailFrame frame = new MailFrame(null);
                    frame.setVisible(true);
                    //frame.fillTable(frame.table, 2);
                    frame.button(frame);
                    frame.Inboxbutton(frame);
                    frame.setSize(1000, 450);
                    //frame.setLocation(300, 100);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public JButton getbutton() {
        return SendButton;
    }

    public JButton getInboxButton() {
        return InboxButton;
    }

    public void button(MailFrame a) {
        JButton button = new JButton();
        button = a.getbutton();
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                ReceiverAccount = ReceivertextField.getText();
                Subject = SubjecttextField.getText();
                Content = ContenttextField.getText();
                if (ReceiverAccount.equals("") || Content.equals("")) {
                    System.out.println("信息輸入不完整!");
                }
                boolean results = SendMail.sendMail(ReceiverAccount, Subject, Content, "");
                if (results){
                    JOptionPane.showMessageDialog(new JLabel(), "郵件發送成功!", "提示",JOptionPane.WARNING_MESSAGE);
                    ReceivertextField.setText("");
                    SubjecttextField.setText("");
                    ContenttextField.setText("");
                }
            }
        });
    }
    public void Inboxbutton(MailFrame a) {
        JButton button = new JButton();
        button = a.getInboxButton();
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Message[] messages = ReceiveMail.getAllMails();
                if (messages  !=null){
                    a.setVisible(false);
                    JOptionPane.showMessageDialog(new JLabel(), "所有郵件獲取成功", "提示",JOptionPane.WARNING_MESSAGE);
                    ReceivesFrame receivesFrame = new ReceivesFrame(messages);
                    receivesFrame.Inboxbutton(receivesFrame);
                    receivesFrame.setVisible(true);
//                    receivesFrame.Inboxbutton(receivesFrame);
                }
            }
        });
    }

    public void fillTable(JTable table, int num) {

        try {
            String[] column = {"Packet", "版本號", "標識"};
            DefaultTableModel defaultTableModel = new DefaultTableModel(column, 0) {
                public boolean isCellEditable(int row, int column) {
                    return false;//重寫isCellEditable類使整個表格不允許被編輯
                }
            };
            int j = 0;
            while (j < num) {
                int id = j + 1;
                String version = "IPv4";
//                int ident = packets[j].getIdent();

//                Object[] str_row = {id, version, ident};
//                defaultTableModel.addRow(str_row);
                j++;
            }
            table.setModel(defaultTableModel);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, "加載不成功!");
        }
    }

    public void uninum() {
        mailAccount = "";
        authorizePassword = "";
    }

    public MailFrame(User user) {
        this.user = user;
//        uninum();
        getContentPane().setLayout(null);
        this.setLocationRelativeTo(null);
        bgImage.setImageObserver(null);
        this.setSize((bgImage).getIconWidth(), bgImage.getIconHeight());
        //處理拖動事件---去掉默認邊框後,不能拖動了,具體實現如下
        this.addMouseListener(new MouseAdapter() {
            @Override
            public void mousePressed(MouseEvent e) {
                xOld = e.getX();//記錄鼠標按下時的座標
                yOld = e.getY();
            }
        });

        this.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                int xOnScreen = e.getXOnScreen();
                int yOnScreen = e.getYOnScreen();
                int xx = xOnScreen - xOld;
                int yy = yOnScreen - yOld;
                MailFrame.this.setLocation(xx, yy);//設置拖拽後,窗口的位置
            }
        });

        JLayeredPane layeredPane = new JLayeredPane();
        layeredPane.setSize(bgImage.getIconWidth(), bgImage.getIconHeight());
        getContentPane().add(layeredPane);

        //背景圖層Panel,充當容器---最底層
        JPanel bgPanel = new JPanel();
        bgPanel.setLocation(0, 0);
        bgPanel.setSize(bgImage.getIconWidth(), bgImage.getIconHeight());
        layeredPane.add(bgPanel, JLayeredPane.DEFAULT_LAYER);//放在最底層

        //背景圖片,添加到背景圖層Panel裏面
        JLabel bgLabel = new JLabel(bgImage);
        bgPanel.add(bgLabel);

        //主界面,也就是背景上面的一層Panel,可用於添加控件
        contentPane = new JPanel();
        contentPane.setLocation(0, 0);
        contentPane.setSize(700, 450);
        contentPane.setLayout(null);
        contentPane.setOpaque(false);
        layeredPane.add(contentPane, JLayeredPane.MODAL_LAYER);//放在較高一層

        //關閉按鈕
        JButton closeButton = new JButton();
        //closeButton.setIcon(new ImageIcon("src/images/closebtn.png"));
        closeButton.setSize(30, 30);
        contentPane.add(closeButton);

        JLabel lblNewLabel = new JLabel("基於SMTP協議的模擬郵件系統");
        lblNewLabel.setFont(new Font("楷體", Font.PLAIN, 26));
        lblNewLabel.setForeground(new Color(0, 0, 128));
        lblNewLabel.setBounds(250, 0, 520, 50);
        contentPane.add(lblNewLabel);

        JLabel userLabel = new JLabel("歡迎你 --" + user.getUser_name());
        userLabel.setFont(new Font("楷體", Font.PLAIN, 20));
        userLabel.setForeground(new Color(0, 0, 128));
        userLabel.setBounds(530, 25, 500, 50);
        contentPane.add(userLabel);

        Receiverlabel.setForeground(new Color(0, 0, 0));
        Receiverlabel.setBounds(270, 60, 70, 20);
        Receiverlabel.setFont(new Font("楷體", Font.PLAIN, 20));
        contentPane.add(Receiverlabel);

        ReceivertextField.setBounds(350, 60, 160, 20);
        contentPane.add(ReceivertextField);

        Subjectlabel.setForeground(new Color(0, 0, 0));
        Subjectlabel.setBounds(280, 100, 60, 20);
        Subjectlabel.setFont(new Font("楷體", Font.PLAIN, 20));
        contentPane.add(Subjectlabel);

        SubjecttextField.setBounds(350, 100, 160, 20);
        contentPane.add(SubjecttextField);

        Contentlabel.setForeground(new Color(0, 0, 0));
        Contentlabel.setBounds(260, 240, 80, 20);
        Contentlabel.setFont(new Font("楷體", Font.PLAIN, 20));
        contentPane.add(Contentlabel);

        ContenttextField.setBounds(350, 140, 160, 200);
        contentPane.add(ContenttextField);

        InboxButton.setBounds(560, 70, 100, 20);
        contentPane.add(InboxButton);

        SendButton.setBounds(560, 100, 100, 20);
        contentPane.add(SendButton);


        table.setBounds(20, 73, 309, 367);
        scrollPane.setViewportView(table);

        closeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });

        this.setLayeredPane(layeredPane);
        this.setLocationRelativeTo(null);
        bgImage.setImageObserver(null);
        this.setSize((bgImage).getIconWidth(), bgImage.getIconHeight());
        this.setLocation(bgImage.getIconWidth(), bgImage.getIconHeight());
        this.setUndecorated(true);//去邊框

    }
}

四、發送郵件

package MailAssistant;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class SendMail {
    public static boolean sendMail(String account,String subject,String content,String fromUser){
        if (fromUser == null){
            fromUser = "Sayello";
        }
        try {
            String host = "smtp.qq.com";//這是QQ郵箱的smtp服務器地址
            String port = "25"; //端口號
            /*
             *Properties是一個屬性對象,用來創建Session對象
             */
            Properties props = new Properties();
            props.setProperty("mail.smtp.host", host);
            props.setProperty("mail.smtp.port", port);
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.ssl.enable", "false");//"true"
            props.setProperty("mail.smtp.connectiontimeout", "5000");
            final String user = "[email protected]";//郵箱賬號
            final String pwd = "xxxxxxx";//smtp/pop3授權密碼
            /*
             *Session類定義了一個基本的郵件對話。
             */
            Session session = Session.getInstance(props, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //登錄用戶名密碼
                    return new PasswordAuthentication(user, pwd);
                }
            });
            session.setDebug(true);
            /*
             *Transport類用來發送郵件。
             *傳入參數smtp,transport將自動按照smtp協議發送郵件。
             */
            Transport transport = session.getTransport("smtp");//"smtps"
            transport.connect(host, user, pwd);
            /*
             *Message對象用來儲存實際發送的電子郵件信息
             */
            MimeMessage message = new MimeMessage(session);
            message.setSubject(subject);
            //消息發送者接收者設置(發件地址,暱稱),收件人看到的暱稱是這裏設定的
            message.setFrom(new InternetAddress(user, fromUser));
            message.addRecipients(Message.RecipientType.TO, new InternetAddress[]{
            //消息接收者(收件地址,暱稱)
            // 不過這個暱稱貌似沒有看到效果
            new InternetAddress(account, "Sayello"),});
            message.saveChanges();
            //設置郵件內容及編碼格式
            // 後一個參數可以不指定編碼,如"text/plain",但是將不能顯示中文字符
            message.setContent(content, "text/plain;charset=UTF-8");
            //發送
            Transport.send(message);
            transport.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return true;
    }
}

五、接收郵件

package MailAssistant;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Store;
import java.util.Date;
import java.util.Properties;

public class ReceiveMail {
    public static Message[] getAllMails() {
        String protocol = "pop3";//使用pop3協議
        boolean isSSL = true;//使用SSL加密
        String host = "pop.qq.com";//QQ郵箱的pop3服務器
        int port = 995;//端口
        final String username = "[email protected]";//郵箱賬戶
        final String password = "xxxxxx";//smtp/pop3授權密碼
        /*
         *Properties是一個屬性對象,用來創建Session對象
         */
        try{
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            Properties props = new Properties();
            props.put("mail.pop3.auth.plain.disable",true);
            props.put("mail.pop3.ssl.enable",true);

            props.put("mail.pop3.auth", "true"); //這樣才能通過驗證

            props.put("mail.pop3.ssl.socketFactory", sf);
            props.put("mail.pop3.host", host);
            props.put("mail.pop3.port", port);

            MyAuthenticator myauth = new MyAuthenticator(username, password);

            Session session = Session.getDefaultInstance(props,myauth);
            /*
             * Store類實現特定郵件協議上的讀、寫、監視、查找等操作。
             * 通過Store類可以訪問Folder類。
             * Folder類用於分級組織郵件,並提供照Message格式訪問email的能力。
             */
            Store store = null;
            Folder folder = null;
            try {
                store = session.getStore(protocol);
                store.connect(username, password);
                folder = store.getFolder("INBOX");// 獲得用戶的郵件帳戶
                folder.open(Folder.READ_WRITE); // 設置對郵件帳戶的訪問權限
                Message[] messages = folder.getMessages();
                System.out.println("count="+messages.length);
                int n = folder.getUnreadMessageCount();// 得到未讀數量
                int n1 = folder.getMessageCount();// 得到未讀數量
                return messages;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("接收完畢!");
        return null;
    }
}

系統的簡單頁面:

登錄註冊:

發送/接收郵件:

 

 

有些小瑕疵:

背景圖片有點low(網上隨便找的背景素材)、收件箱的佈局沒有弄好,內容顯示有點擠得慌

(如需要完整代碼或者問題,也可以加我Q: 3459067873)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章