基于pop3,stm邮件收发系统及报告

更新时间:2023-12-09 08:44:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

基于POP3与SMTP协议的邮件收发程序的开发

一、设计思想

POP3(Post Office Protocol 3)即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员,,由RFC 1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

POP3是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。

POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是PC机或 MAC。一旦邮件发送到 PC 机或MAC上,邮件服务器上的邮件将会被删除。但目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。

脱机模型即不能在线操作,POP不支持对服务器邮件进行扩展操作,此过程需要更高级的IMAP4协议来完成。支持POP协议使用ASCII码来传输数据消息,这些数据消息可以是指令,也可以是应答。

SMTP目前已是事实上的在Internet传输E-Mail的标准,是一个相对简单的基于文本的协议。在其之上指定了一条消息的一个或多个接收者(在大多数情况下被确定是存在的),然后消息文本就传输了。可以很简单地通过Telnet程序来测试一个SMTP服务器,SMTP使用TCP端口25。要为一个给定的域名决定一个SMTP服务器,需要使用MX(Mail eXchange)DNS。

在20世纪80年代早期SMTP开始被广泛地使用。当时它只是作为UUCP的补充,UUCP更适合于处理在间歇连接的机器间传送邮件。相反SMTP在发送和接收的机器始终都联网的情况下工作得最好。

SMTP独立于特定的传输子系统,且只需要可靠有序的数据流信道支持。SMTP重要特性之一是其能跨越网络传输邮件,即“SMTP邮件中继”。通常,一个网络可以由公用因特网上TCP可相互间访问的主机、防火墙分隔的TCP/IP网络上TCP可相互访问的主机,以及其他LAN/WAN中的主机利用非TCP传输层协议组成。使用SMTP,可实现相同网络上处理机之间的邮件传输,也可通过中继器或网关是实现某处理机与其他网络之间的邮件传输。

在smtp这种方式下,邮件的发送可能经过从发送端到接收端路径上的大量中间中继器或网关主机。域名服务系统(DNS)的邮件交换服务器可以用来识别出传输邮件的下一跳IP地址。

Sendmail是最早实现SMTP的邮件传输代理之一。到2001年至少有50个程序将SMTP 实现为一个客户端(消息的发送者)或一个服务器(消息的接受者)。一些其他的流行的SMTP服务器包括Philip Hazel 的exim,IBM的Postfix,D.J.Bernstein的Qmail,以及Microsoft Exchange Server.

由于这个协议开始是基于纯ASCⅡ文本的,在二进制文件上处理得并不好。后来开发了用来编码二进制文件的标准,如MIME,以使其通过SMTP来传输。今天,大多数SMTP服务器都支持8位MIME扩展,它使二进制文件的传输变得几乎和纯文本一样简单。

- 1 -

基于POP3与SMTP协议的邮件收发程序的开发

二、算法流程图

本程序的核心算法流程图如下图所示:

图1 程序算法流程图

- 2 -

基于POP3与SMTP协议的邮件收发程序的开发

三、源代码

package frame;

import java.awt.Dimension; import java.awt.Toolkit;

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel;

import javax.swing.JOptionPane; import javax.swing.JPasswordField; import javax.swing.JTextField; import utils.CheckNewMail; import utils.EditorUtils; import action.LoginAction; /**

* 登录页面 */

public class LoginFrame extends JFrame implements ActionListener, ItemListener { private static final long serialVersionUID = 1L; private JComboBox pop3CB;// 收邮件服务器下拉列表 private JComboBox smtpCB;// 发邮件服务器下拉列表 private JTextField nameTF; private JPasswordField passwordTF; private JButton loginButton = null, resetButton = null; private String username = null, password = null, popHost = null, smtpHost = null;// SMTP服务器 private JProgressBarFrame progressBar = null;// 进度条实例 public LoginFrame() { super(); this.setIconImage(EditorUtils.createIcon(\ getContentPane().setLayout(null); jFrameValidate(); setTitle(\登录邮箱\ JLabel backgroundLabel = new JLabel(); backgroundLabel.setBounds(0, 0, 768, 540); backgroundLabel.setText(\ + this.getClass().getResource(\ backgroundLabel.setLayout(null); final JLabel smtpLable = new JLabel();

- 3 -

基于POP3与SMTP协议的邮件收发程序的开发

smtpLable.setText(\服务器:\smtpLable.setBounds(230, 203, 100, 18); backgroundLabel.add(smtpLable);

final JLabel pop3Label = new JLabel(); pop3Label.setText(\服务器:\pop3Label.setBounds(230, 243, 100, 18); backgroundLabel.add(pop3Label);

final JLabel nameLabel = new JLabel(); nameLabel.setText(\邮箱名称:\

nameLabel.setBounds(230, 283, 100, 18); backgroundLabel.add(nameLabel);

final JLabel passwordLable = new JLabel(); passwordLable.setText(\密码:\

passwordLable.setBounds(230, 323, 100, 18); backgroundLabel.add(passwordLable); // 发件箱服务器地址列表

String[] smtpAdd = { \ \ \ \ \smtpCB = new JComboBox(smtpAdd); smtpCB.setSelectedIndex(0); smtpCB.setEditable(true);

smtpCB.addItemListener(this);

smtpCB.setBounds(370, 203, 150, 22); backgroundLabel.add(smtpCB); // 收件箱服务器地址列表

String[] pop3Add = { \ \ \ \ \

pop3CB = new JComboBox(pop3Add); pop3CB.setSelectedIndex(0); pop3CB.addItemListener(this); pop3CB.setEditable(true);

pop3CB.setBounds(370, 243, 150, 22); backgroundLabel.add(pop3CB); nameTF = new JTextField();

nameTF.setBounds(370, 283, 150, 22); backgroundLabel.add(nameTF);

passwordTF = new JPasswordField();

passwordTF.setBounds(370, 323, 150, 22);

- 4 -

基于POP3与SMTP协议的邮件收发程序的开发

backgroundLabel.add(passwordTF); loginButton = new JButton(\登录\ resetButton = new JButton(\重置\ backgroundLabel.add(loginButton); backgroundLabel.add(resetButton); loginButton.setBounds(280, 360, 80, 30); resetButton.setBounds(400, 360, 80, 30); loginButton.addActionListener(this); resetButton.addActionListener(this); getContentPane().add(backgroundLabel); progressBar = new JProgressBarFrame(this, \登录\登录中,请稍后...\ reset();// 默认初始值 }

public void jFrameValidate() { Toolkit tk = getToolkit();// 获得屏幕的宽和高 Dimension dim = tk.getScreenSize(); this.setResizable(false); this.setBounds(dim.width / 2 - 380, dim.height / 2 - 270, 776, 574); validate(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

// 登录 和重置事件的处理 @Override

public void actionPerformed(ActionEvent e) { if (e.getSource() == loginButton) {// 登录 progressBar.setVisible(true);// 设置进度条可见 new Thread() { public void run() { getValues();// 得到界面中的所有项的值 checkUser();// 登录验证 } }.start(); } else if (e.getSource() == resetButton) {// 重置 reset();// 重新设置各项的值 } }

// 得到界面中的所有项的值 private void getValues() { smtpHost = (String) smtpCB.getSelectedItem(); popHost = (String) pop3CB.getSelectedItem(); username = nameTF.getText().trim(); password = passwordTF.getText().trim(); }

- 5 -

基于POP3与SMTP协议的邮件收发程序的开发

// 重新设置各项的值 private void reset() { smtpCB.setSelectedIndex(0); pop3CB.setSelectedIndex(0); nameTF.setText(\ passwordTF.setText(\ } // 登录验证 private void checkUser() { LoginAction login = new LoginAction(smtpHost, popHost, username, password); if (login.isLogin()) {// 登录成功 progressBar.dispose(); new CheckNewMail().start();// 开始检测新邮件 this.dispose();// 释放本窗口资源 new MainFrame().setVisible(true); } else {// 登录失败 progressBar.setVisible(false); JOptionPane.showMessageDialog(this, \ + \登录失败,请检查主机、用户名、密码是否正确!\\警告\ JOptionPane.WARNING_MESSAGE); } } // 下拉列表改变时的事件处理 public void itemStateChanged(ItemEvent e) { if (e.getSource() == smtpCB) { if (e.getStateChange() == ItemEvent.SELECTED && smtpCB.getSelectedIndex() != -1) pop3CB.setSelectedIndex(smtpCB.getSelectedIndex()); } else if (e.getSource() == pop3CB) { if (e.getStateChange() == ItemEvent.SELECTED && pop3CB.getSelectedIndex() != -1) smtpCB.setSelectedIndex(pop3CB.getSelectedIndex()); } } }

package frame;

import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.Toolkit;

import java.awt.event.ActionEvent;

- 6 -

基于POP3与SMTP协议的邮件收发程序的开发

import java.awt.event.ActionListener; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.beans.PropertyVetoException; import javax.swing.JButton;

import javax.swing.JDesktopPane; import javax.swing.JFrame;

import javax.swing.JInternalFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPanel;

import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSplitPane; import javax.swing.JTree;

import javax.swing.tree.DefaultMutableTreeNode; import utils.ClassNameTreeCellRenderer; import utils.EditorUtils; import utils.FrameFactory; import utils.ReadLinkmanXMl; import utils.ReceiveMailTable;

public class MainFrame extends JFrame implements ActionListener, MouseListener { private static final long serialVersionUID = 1L; private static JDesktopPane desktopPane = null;// 用于创建多文档界面或虚拟桌面的容器 public static MainFrame MAINFRAME; private JTree tree;// 树形图 private JList jl;// 联系人列表 private JPanel panel, panelframe;// panelframe左半部界面 private JLabel labelbackground; private JScrollPane scrollPane; private JMenuItem exitMI = null, newMailMI = null, sendedMI = null, receiveMI = null, recycleMI = null, refreshMI = null; private JButton addLinkmanButton = null;// 添加联系人按钮 private JMenu mailMenu = null; private ReadLinkmanXMl readLinkman = null; // 初始化界面配置 public void jFrameValidate() { Toolkit tk = getToolkit();// 获得屏幕的宽和高 Dimension dim = tk.getScreenSize();

- 7 -

基于POP3与SMTP协议的邮件收发程序的开发

this.setBounds(dim.width / 2 - 420, dim.height / 2 - 350, 850, 678); validate(); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }

public MainFrame() { super(\电子邮件\ MAINFRAME = this; this.setIconImage(EditorUtils.createIcon(\ desktopPane = new JDesktopPane(); jFrameValidate();// 初始化界面 JMenuBar menuBar = new JMenuBar(); this.setJMenuBar(menuBar); final JMenu fileMenu = new JMenu(\文件(F)\ mailMenu = new JMenu(\邮件(M)\ menuBar.add(fileMenu); menuBar.add(mailMenu); exitMI = addMenuItem(fileMenu, \退出\退出菜单项的初始化

// 新建邮件菜单项的初始化 newMailMI = addMenuItem(mailMenu, \新建邮件\ // 已发送邮件菜单项的初始化

SendedMI = addMenuItem(mailMenu, \已发送\ // 收件箱邮件菜单项的初始化

receiveMI = addMenuItem(mailMenu, \收件箱\ // 已删除邮件菜单项的初始化

recycleMI = addMenuItem(mailMenu, \已删除\ // 已删除邮件菜单项的初始化

refreshMI = addMenuItem(mailMenu, \刷新收件箱\ // 构建树形节点 DefaultMutableTreeNode root = new DefaultMutableTreeNode(\电子邮件系统\ DefaultMutableTreeNode addressee = new DefaultMutableTreeNode(\收件夹\ DefaultMutableTreeNode send = new DefaultMutableTreeNode(\发件夹\ DefaultMutableTreeNode AlreadySend = new DefaultMutableTreeNode(\已发送邮件\ DefaultMutableTreeNode delete = new DefaultMutableTreeNode(\已删除邮件\ root.add(send); root.add(addressee); root.add(AlreadySend); root.add(delete); tree = new JTree(root); tree.addMouseListener(this);// 为树形节点注册鼠标事件 tree.setPreferredSize(new Dimension(160, 150)); // 重新渲染树形节点 ClassNameTreeCellRenderer render = new ClassNameTreeCellRenderer(); tree.setCellRenderer(render); // 联系人面板

- 8 -

基于POP3与SMTP协议的邮件收发程序的开发

}

// 返回新建菜单项

private JMenuItem addMenuItem(JMenu menu, String name, String icon) { // 新建邮件菜单项的初始化

- 9 -

panel = new JPanel();

panel.setLayout(new BorderLayout());

panel.setPreferredSize(new Dimension(160, 300)); // 界面左半部面板

panelframe = new JPanel();

panelframe.setLayout(new BorderLayout()); panelframe.add(panel, BorderLayout.CENTER); panelframe.add(tree, BorderLayout.NORTH); addLinkmanButton = new JButton();

addLinkmanButton.setText(\联系人(C)\

addLinkmanButton.setIcon(EditorUtils.createIcon(\panel.add(addLinkmanButton, BorderLayout.NORTH);

addLinkmanButton.addActionListener(this);// 注册添加联系人事件 readLinkman = new ReadLinkmanXMl();

jl = readLinkman.makeList();// 返回联系人列表

jl.addMouseListener(this);// 添加联系人列表双击事件 scrollPane = new JScrollPane();

panel.add(scrollPane, BorderLayout.CENTER);

scrollPane.setViewportView(jl);// 在滚动面板中添加联系人 validate();

labelbackground = new JLabel();

labelbackground.setIcon(null); // 窗体背景

desktopPane.addComponentListener(new ComponentAdapter() { public void componentResized(final ComponentEvent e) { Dimension size = e.getComponent().getSize(); labelbackground.setSize(e.getComponent().getSize()); labelbackground.setText(\ + \ + this.getClass().getResource(\ + \ } });

desktopPane.add(labelbackground, new Integer(Integer.MIN_VALUE)); // 添加一个分割窗口

JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panelframe, desktopPane);

// 在分隔条上提供一个 UI 小部件来快速展开/折叠分隔条 splitPane.setOneTouchExpandable(true); splitPane.setDividerSize(10);// 设置分隔条的大小

getContentPane().add(splitPane, BorderLayout.CENTER);

基于POP3与SMTP协议的邮件收发程序的开发

JMenuItem menuItem = new JMenuItem(name, EditorUtils.createIcon(icon)); menuItem.addActionListener(this);// 监听退出菜单项事件 menu.add(menuItem); return menuItem; } // 添加子窗体的方法 public static void addIFame(JInternalFrame iframe) { JInternalFrame[] frames = desktopPane.getAllFrames(); try { for (JInternalFrame ifm : frames) { if (ifm.getTitle().equals(iframe.getTitle())) { desktopPane.selectFrame(true); ifm.toFront(); ifm.setSelected(true); return; } } desktopPane.add(iframe); iframe.setSelected(true); iframe.toFront(); } catch (PropertyVetoException e) { e.printStackTrace(); } } // action事件的处理 @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == exitMI) { System.exit(0);// 退出系统 } else if (e.getSource() == addLinkmanButton) { addIFame(FrameFactory.getFrameFactory().getAddLinkManFrame());// 联系人列表 } else if (e.getSource() == newMailMI) {// 新建邮件 addIFame(FrameFactory.getFrameFactory().getSendFrame());// 发件夹 } else if (e.getSource() == itemPopupOne || e.getSource() == refreshMI) {// 右键刷新收件列表 ReceiveMailTable.getMail2Table().startReceiveMail();// 右键刷新收件列表 } else if (e.getSource() == sendedMI) {// 已发送 addIFame(FrameFactory.getFrameFactory().getSendedFrame());// 已发送 } else if (e.getSource() == receiveMI) {// 收邮件 addIFame(FrameFactory.getFrameFactory().getReceiveFrame());// 收邮件 } else if (e.getSource() == recycleMI) {// 已删除 addIFame(FrameFactory.getFrameFactory().getRecycleFrame());// 收邮件 }

- 10 -

本文来源:https://www.bwwdw.com/article/oxy5.html

Top