回顧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)