已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于pop3与smtp协议的邮件收发程序的开发1、 设计思想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 程序算法流程图三、源代码 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(email.png).getimage();getcontentpane().setlayout(null);jframevalidate();settitle(登录邮箱);jlabel backgroundlabel = new jlabel();backgroundlabel.setbounds(0, 0, 768, 540);backgroundlabel.settext();backgroundlabel.setlayout(null);final jlabel smtplable = new jlabel();smtplable.settext(smtp 服务器:);smtplable.setbounds(230, 203, 100, 18);backgroundlabel.add(smtplable);final jlabel pop3label = new jlabel();pop3label.settext(pop3 服务器:);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);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);/ 登录 和重置事件的处理overridepublic 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();/ 重新设置各项的值private void reset() smtpcb.setselectedindex(0);pop3cb.setselectedindex(0);nametf.settext(55531990);passwordtf.settext(qqmima);/ 登录验证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;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();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(email.png).getimage();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, 退出, exit.gif);/ 退出菜单项的初始化/ 新建邮件菜单项的初始化newmailmi = addmenuitem(mailmenu, 新建邮件, newmail.gif);/ 已发送邮件菜单项的初始化sendedmi = addmenuitem(mailmenu, 已发送, sended.png);/ 收件箱邮件菜单项的初始化receivemi = addmenuitem(mailmenu, 收件箱, receive.png);/ 已删除邮件菜单项的初始化recyclemi = addmenuitem(mailmenu, 已删除, deleted.png);/ 已删除邮件菜单项的初始化refreshmi = addmenuitem(mailmenu, 刷新收件箱, refresh.jpg);/ 构建树形节点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);/ 联系人面板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(linkman.gif);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(););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);/ 返回新建菜单项private jmenuitem addmenuitem(jmenu menu, string name, string icon) / 新建邮件菜单项的初始化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事件的处理overridepublic 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();/ 收邮件private sendframe sendframe = null;/ 发送邮件对象public jmenuitem itempopupone = null;/ 鼠标右键第一个选项overridepublic void mouseclicked(mouseevent e) / 树形节点中的单击事件defaultmutabletreenode selectednode = (defaultmutabletreenode) tree.getlastselectedpathcomponent();if (e.getsource() = tree & e.getbutton() != 3 & e.getbutton() != 2) if (selectednode = null)return;else if (selectednode.tostring().equals(发件夹) sendframe = framefactory.getframefactory().getsendframe();addifame(sendframe);/ 发件夹 else if (selectednode.tostring().equals(收件夹) addifame(framefactory.getframefactory().getreceiveframe();/ 收件夹 else if (selectednode.tostring().equals(已发送邮件) addifame(framefactory.getframefactory().getsendedframe();/ 已发送邮件 else if (selectednode.tostring().equals(已删除邮件) addifame(framefactory.getframefactory().getrecycleframe();/ 已删除邮件 else if (e.getsource() = jl & e.getclickcount() = 2) / 双击联系人事件int index = jl.getselectedindex();if (sendframe != null & sendframe.isselected() / 如果发送邮件界面被初始化并且被激活sendframe.addlinkman(readlinkman.findlinkman(index); else if (e.getbutton() = mouseevent.button3 & e.getsource() = tree) / 收件箱右键刷新if (selectednode = null)return;else if (收件夹.equals(selectednode.tostring() jpopupmenu popup = new jpopupmenu();itempopupone = new jmenuitem(刷新收件箱,editorutils.createicon(refresh.jpg);itempopupone.addactionlistener(this);popup.add(itempopupone);popup.show(e.getcomponent(), e.getx(), e.gety();public void mouseentered(mouseevent e) public void mouseexited(mouseevent e) public void mousepressed(mouseevent e) public void mousereleased(mouseevent e) package frame;import java.awt.borderlayout;import java.awt.color;import java.awt.dimension;import java.awt.graphicsenvironment;import java.awt.event.actionevent;import java.awt.event.actionlistener;import java.awt.event.focusevent;import java.awt.event.focuslistener;import java.awt.event.mouseevent;import java.awt.event.mouselistener;import java.awt.event.mousemotionlistener;import java.io.file;import java.util.arraylist;import javax.swing.action;import javax.swing.box;import javax.swing.defaultlistmodel;import javax.swing.icon;import javax.swing.jbutton;import javax.swing.jcolorchooser;import javax.swing.jcombobox;import javax.swing.jfilechooser;import javax.swing.jinternalframe;import javax.swing.jlabel;import javax.swing.jlist;import javax.swing.jmenuitem;import javax.swing.joptionpane;import javax.swing.jpanel;import javax.swing.jpopupmenu;import javax.swing.jscrollpane;import javax.swing.jsplitpane;import javax.swing.jtextfield;import javax.swing.jtextpane;import javax.swing.jtoolbar;import javax.swing.listselectionmodel;import javax.swing.text.stylededitorkit;import javax.swing.text.html.htmldocument;import javax.swing.text.html.htmleditorkit;import mailutil.sendattachmail;import utils.editorpopupmenu;import utils.editorutils;import utils.sendedmailtable;/* * 发送邮件界面 */public class sendframe extends jinternalframe implements actionlistener,mouselistener, mousemotionlistener, focuslistener private jcombobox fontsizecb;/ 字体大小列表private jcombobox fontcb;/ 字体列表private jtextpane sendcotent;/ 发送内容面板private jtextfield subjecttf;/ 邮件主题文本框private jtextfield copy_to;/ 抄送private jtextfield to_mail;/ 收件人private jlist attachmentlist = null;/ 附件列表,最多能添加三个附件private jscrollpane scrollpane = null;/ 正文编辑窗口private jscrollpane jsp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玉溪师范学院《外国民族音乐》2023-2024学年第一学期期末试卷
- 玉溪师范学院《思想政治学科教学论》2021-2022学年第一学期期末试卷
- 玉溪师范学院《色彩人像》2022-2023学年第一学期期末试卷
- 玉溪师范学院《空间构成基础》2022-2023学年第一学期期末试卷
- 动力测试仪器账务处理实例-记账实操
- 五年级下册音乐课件下载
- 广州版五年级英语下册教案
- 2024年航空制造和材料专用设备项目评价分析报告
- 2024届河北省张家口市尚义一中高三一模数学试题试卷
- 测绘及勘察合同
- 第五单元测试卷(单元测试)-2024-2025学年六年级上册语文统编版
- 中药方剂基本知识
- 应急物资检查记录
- 基金公司组织架构图
- 最新压滤机培训教材
- 新形势下做好国有企业执纪审查工作的对策建议
- 产品设计和开发过程-审核检查表
- 国内访学总结报告 (4)
- 外研社英语八年级上M10知识点整理gu
- 通用技术金工知识整理
- 船长常规命令
评论
0/150
提交评论