JAVA邮件客户端
课设要求做一个基于JAVA Mail 的邮件收发客户端,在网上搜了一遍,没有看到比较完整的代码或者教程,因此自己做完之后把代码公开出来,供大家参考
运行结果展示:
输入账号密码进行登陆(账号密码的获取请接着往下看):
账号密码可用后进入主页面(进入可能需要十多秒的加载时间,加载时间是在读取收信箱中的数据)
点击按钮“接收窗口”跳转到收信箱界面,这个界面的布局有点问题两边有很大的空白,还没找到解决方式
刷新按钮会删除勾选的信件,以及刷新接收窗口中的信件,刷新也需要10秒左右的加载时间。
查看按钮会在浏览器内打开对应的邮件
下载按钮点击后下载附件
账号密码获取
这里以qq邮箱为例,账号即为 qq号@qq.com
密码通过如下方式获取
1.进入qq邮箱官网,点击设置
2.进入账号设置
3.下滑页面,找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务栏,点击管理服务
4.在跳出的页面中选择生成授权码
5.跟着网页之后的逻辑走,最后得到的授权码即为所需要的密码
代码
程序由四个文件组成,都在同一目录下,运行Window.java即可打开程序
window.java
package exm;
import javax.swing.*;
import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.Enumeration;
import java.util.Vector;
import java.awt.Desktop;
import java.util.regex.Pattern;
public class Window {
private JFrame frame;
private JPanel loginPanel, mainPanel, sendMailPanel, receiveMailPanel;
private JScrollPane receiveContents;
private JTextField usernameField;
private JPasswordField passwordField;
private CardLayout cardLayout;
private JPanel mainContentPanel;
private JTextField attachmentField;
private EmailManager emailManager;
public Window() {
frame = new JFrame("Mail Manager");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1000, 600);
initLoginPanel();
initMainPanel();
frame.getContentPane().add(loginPanel);
frame.setVisible(true);
}
private void initLoginPanel() {
loginPanel = new JPanel();
loginPanel.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(5, 5, 5, 5);
JLabel usernameLabel = new JLabel("用户名:");
usernameField = new JTextField(20);
JLabel passwordLabel = new JLabel("密钥:");
passwordField = new JPasswordField(20);
JButton loginButton = new JButton("登录");
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// Validate login (this is just a placeholder, real validation should be done)
if (!usernameField.getText().isEmpty() && passwordField.getPassword().length > 0) {
try {
emailManager = new EmailManager(usernameField.getText(),String.valueOf(passwordField.getPassword()));
frame.getContentPane().remove(loginPanel);
frame.getContentPane().add(mainPanel);
frame.revalidate();
frame.repaint();
} catch (Exception exception) {
exception.printStackTrace();
JOptionPane.showMessageDialog(frame, "账号或密码错误");
}
} else {
JOptionPane.showMessageDialog(frame, "请输入用户名及密钥");
}
}
});
gbc.gridx = 0;
gbc.gridy = 0;
loginPanel.add(usernameLabel, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
loginPanel.add(usernameField, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
loginPanel.add(passwordLabel, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
loginPanel.add(passwordField, gbc);
gbc.gridx = 1;
gbc.gridy = 2;
loginPanel.add(loginButton, gbc);
}
private void initMainPanel() {
mainPanel = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel();
JButton sendMailButton = new JButton("发送窗口");
JButton receiveMailButton = new JButton("接收窗口");
JButton refreshButton = new JButton("刷新");
buttonPanel.add(sendMailButton);
buttonPanel.add(receiveMailButton);
buttonPanel.add(refreshButton);
cardLayout = new CardLayout();
mainContentPanel = new JPanel(cardLayout);
initSendMailPanel();
initReceiveMailPanel();
mainContentPanel.add(sendMailPanel, "sendMail");
mainContentPanel.add(receiveContents, "receiveMail");
sendMailButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
cardLayout.show(mainContentPanel, "sendMail");
}
});
receiveMailButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
renderReceiveMailPanel(emailManager.reader.subjects,emailManager.reader.sender,emailManager.reader.subfiles);
cardLayout.show(mainContentPanel, "receiveMail");
}
});
refreshButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
emailManager.reader.refreshMessages();
renderReceiveMailPanel(emailManager.reader.subjects,emailManager.reader.sender,emailManager.reader.subfiles);
} catch (Exception exception) {
exception.printStackTrace();
}
}
});
mainPanel.add(buttonPanel, BorderLayout.NORTH);
mainPanel.add(mainContentPanel, BorderLayout.CENTER);
}
private void initSendMailPanel() {
sendMailPanel = new JPanel();
sendMailPanel.setLayout(new BoxLayout(sendMailPanel, BoxLayout.Y_AXIS));
Border emptyBorder = BorderFactory.createEmptyBorder(10, 10, 10, 10);
sendMailPanel.setBorder(emptyBorder);
JTextField subjectField = new JTextField();
JTextArea recipientField = new JTextArea(2, 50);
JTextArea mailContentArea = new JTextArea(10, 50);
attachmentField = new JTextField();
attachmentField.setEditable(false);
JButton attachButton = new JButton("选择附件");
JButton sendButton = new JButton("发送");
attachButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setMultiSelectionEnabled(true); // 启用多选
int returnValue = fileChooser.showOpenDialog(frame);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File[] selectedFiles = fileChooser.getSelectedFiles();
StringBuilder paths = new StringBuilder();
for (File file : selectedFiles) {
paths.append(file.getAbsolutePath()).append("\n");
}
attachmentField.setText(paths.toString());
}
}
});
sendButton.addActionListener(new ActionListener() {