- 浏览: 221850 次
- 性别:
- 来自: 深圳
-
最新评论
-
lqixv:
abombhz 写道项目代码连接打不开,有的话发一份到我邮箱a ...
GWT 2 Spring 3 JPA 2 Hibernate 3.5 教程(译) -
abombhz:
项目代码连接打不开,有的话发一份到我邮箱abomb_hz@16 ...
GWT 2 Spring 3 JPA 2 Hibernate 3.5 教程(译) -
xiaokang1582830:
它直接抛出异常,无法定位是账号密码错误还是参数设置不正确... ...
javax.mail.AuthenticationFailedException: EOF on socket -
lqixv:
不再建议使用这个 tree。用 ztree 吧,ztree 是 ...
在xyTree中添加一个方法,用于获得所有已选择或部分被选择的node -
du_shu_lake:
贴主,请教一个xytree的问题,如果我从服务器向前台传数据, ...
在xyTree中添加一个方法,用于获得所有已选择或部分被选择的node
我干软件开发也有一点的年头了,回头想想,也经历了不少的酸甜苦辣,为解决了复杂的问题快乐过.也为不分昼夜的加班赶工程郁闷过.不过这些都没能减少我对计算机的热情,我对程序的喜好.以前对JavaMail也有一些学习性的认识,不过一直没在实际的项目中应用过.直到最近的一个项目,需要JavaMail所以我打算认真的学习一下这种技术,因为我目前擅长的是Struts,而Struts又不具备邮件发送的功能,所以我要深刻的学习一下JavaMailAPI.所以在我学会了JavaMail的基本操作的同时也将这篇文章献给大家,虽然技术含量不高,但是希望能对一些刚刚接触JavaMail的同道中人有所帮助.好了闲话少说进入正题,首先介绍几个邮件传输协议,虽然说不了解这些协议也可以实用JavaMailAPI,但是我始终认为,如果不透彻的了解一种技术的本质,即使会用了也是照葫芦画瓢,换一种模式也许就玩不转了.
SMTP:简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)由RFC821定义,它定义了发送邮件的机制,在JavaMail环境中,基于JavaMail的程序将和因特网服务供应商ISP(internet Service Provider ’ s)SMTP服务器通信.SMTP服务器会中转消息给接收方SMTP服务器以便最终让用户经由POP或者IMAP获得.
POP:代表邮局协议(Post Office Protocol).目前的版本是3.所以一般都称之为POP3.这个协议是由RFC1939定义的.POP是一种机制,因特网上多大数用户用它得到邮件.它规定每个用户一个邮箱的支持.使用POP协议的时候,用户的许多性能并不是由POP协议支持的,如查看几封新邮件消息这个功能,这些功能内建在如Eudora或MicrosoftOutlook之类的程序中,它们记住一些事.所以在用JavaMail的时候,如果你想要这些信息,你就必须自己算了.
IMAP:是更高级的用户接收消息的协议,被定义在RFC2060中,IMAP代表因特网消息访问协议(Internet Message Access Protocol),目前用的版本是4,所以也叫做IMAP4.在用到IMAP的时候,邮件服务器必须支持这个协议,不能仅仅把使用POP的程序用于IMAP,并指望它支持IMAP所有性能.
MIME:是因特网邮件扩展标准(Multipurpose Internet Mail Extensions).它不是邮件传输协议,但是对于传输的内容的消息,附件以及其他的内容定义了格式.可以理解成一个定义合适的标准.
NNTP:因为JavaMail将供应商和所有其它的东西分开了,您就能轻松添加额外的协议支持.NNTP 就是网络新闻传输协议.
JavaMailAPI可以到 http://java.sun.com/products/javamail/index.html 进行下载,并将mail.jar添加到classpath即可.
JAF框架可以到 http://java.sun.com/products/javabeans/glasgow/jaf.html 进行下载,并将activation.jar添加到classpath即可.
如果实用J2EE就没由什么特定非要用基本的JavaMailAPI了.J2EE的类就能处理了.只要确保j2ee.jar文件在classpath中就Ok了.
下面我用一个最简单的例子还演示第一条消息的发送.
1,获取系统Properties.
Properties props = System.getProperties();
2,将您的SMTP服务器名添加到mail.smtp.host关键字的属性中.
Props.pout( “ mail.smtp.host ” ,host);
3,获取基于Properties Session对象.
Session session = Session.getDefaultInstance(props,null);
4,从Session创建一个MimeMessage.
MimeMessage message = new MimeMessage(session);
5,设置消息from域.
Message.setForm(new InternetAddress(from));
6,设置to域.
Message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));
7,设置消息主题.
message.setSubject( “ HelloJavaMail ” );
8,设置消息内容.
Message.setText( “ Welcome to JavaMail ” );
9发送消息.
Transport.send(message);
10,在编译用运的时候传递MSTP服务器,from地址,to地址.
通过简单的接触了JavaMail相信大家多邮件发送也有了简单的了解和认识,下面我主要研究一下它的具体功能,也就是说具体的接口或类的含义.
Session类定义了一个基本的邮件会话,所有的其他类都是由这个session才得意生效的,Session对象用java.util.Properties对象获取信息,如邮件服务器,用户名,密码及整个应用程序中共享的其他信息.类的构造器是此有的,private.它能用getDefaultInstance()方法来共享.获取Session对象的方方法如下:
Properties props = new Properties();
Session session = Session.getDefaultInstance(props,null);
Null参数都是Authenticator对象,在这里没有使用.
对于大多数情况,共享的session已经足够用了.
Message消息类,在获得了Session对象后,就可以继续创建要发送的消息.因为Message是个抽象类,您必须用一个子类,多数情况下为java.mail.internet.MimeMessage.这个能理解成MIME类型和头的电子邮件消息.正如不同的RFC中定义的,虽然在某些头部域非ASCII字符也能被编译,但是Message头只能被限制用US-ASCII字符.要创建一个Message请将Session对象传递给MimeMessage的构造器.
MimeMessage message = newMimeMessage(session);
一旦获得消息,就可以设置各个部分了.最基本的就是setContent()方法,例如/
message.setContent( “ Hello ” , ” text/plain ” );
如果知道在实用MimeMessage,而且消息是纯文本格式,就可以用setText()方法,它只需要代表实际内容的参数.(Mime类型缺省为text/plain)
用setSubject()方法设置subject(主题);
message.setSubject( “ 主题 ” );
Address地址类,和Message一样也是一个抽象类,一旦创建了Session和Message并将内容填入消息后,就可以用Address确定信件的地址了,用javax.mail.internet.
InternetAddress类.若创建的地址只包含电子邮件地址,只要传递电子邮件地址给构造器就可以了.例如:Address address = new InternetAddress( “ it5719@163.com ” );
若希望名字挨着电子邮件现实,就可以把它传递给构造器,如下:
Address address = new InternetAddress( “ it5719@163.com ” , ” 我心依旧 ” );
需要为消息的from域和to域创建地址对象,除非邮件服务器阻止,没有什么能阻止你发送一段看上去是任何人的消息了呵呵.一旦创建address将他们域消息连接方法有两种,如要要识别发件人的就可以用setFrom()和setReplyTo方法.然后message.setFrom(address);
需要实用多个from地址的就用addFrom()方法.例子如下:
Address[] address = ,.,. ; message.addFrom(address);
若要识别消息recipient收件人,就要实用addRecipient()方法了.例如:
message.addRecipient(type,address)
Authenticator与java.net类一样,JavaMailAPI也可以利用Authentcator通过用户名密码访问受保护的资源.对于JavaMail来说,这些资源就是邮件服务器,Authentcator类在javax.mail包中.要使用Authenticator,首先创建一个抽象的子类,并从
GetPasswordAuthentication方法中返回passwordAuthentication实例,创建完成后,您必须向session注册Authenticator,然后在需要认证的时候会通知它,其实说白了就是把配置的用户名和密码返回给调用它的程序.例如:
Properties props = new properties();
Authenticator auth = new MailAuthenticator()//接口声明,创建自己新类的实例.
Session session = Session.getDefauItInstance(props,auth);
Transport消息发送传输类,这个类用协议指定的语言发送消息,通常是SMTP,它是抽象类,它的工作方式与Session有些类似,尽调用静态方法send()方法,就OK了.例如:
Transport.send(message);
或者也可以从针对协议的会话中获取一个特定的实例,传递用户名和密码.发送消息,然后关闭连接,例如:
message.saveChanges();
transport transport = session.getTreansport( “ smtp ” );//指定的协议
transport.connect(host,username,password);
transport.sendMessage(message,message.getAllRecipients());
transport.close();
如果要观察传到邮件服务器上的邮件命令,请用session.setDubug(true)设置调试标志.
Store和folder用session获取消息,与发送消息开始很相似,但是在session得到后,很可能实用用户名和密码或实用Authenticator连接到一个Store.类似于Transport,也是一样要告诉store用什么协议.例如
Store store = session.getStore( “ pop3 ” );
Store.connect(host,username,password);
连接到Store之后,接下来,获得一个folder,必须打开它就可以读取里边的消息了.
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message[] message = folder.getMessages();
POP3唯一可用的文件夹就是INBOX,如果实用IMAP,还可以用其他的文件夹.
当读到了具体的message以后,就可以用getContent来获取内容,或者用writeTo()将内容写入流,getContent()方法只能得到消息内容,而writeTo()的输出却包含消息头.
System.out.println(((MimeMessage)message).getConntent());
一旦读取完毕邮件,要关闭store和folder的连接.
folder.colse(boolean);
store.colse();
传递给folder的close()方法的boolean参数表示是否清楚已删除的消息从而更新folder.
上面就是JavaMail邮件操作的基本的常用类,我觉得理解了这几个类的机制,基本就可以处理一般的邮件操作了.下面是一个我写的JavaMail实现邮件发送的代码.
首先是一个Authenticator类的实现:记录用户名和密码:
import javax.mail.*; public class MailAuthenticator extends Authenticator { //****************************** //由于发送邮件的地方比较多, //下面统一定义用户名,口令. //****************************** public static String HUAWEI_MAIL_USER = "it5719@163.com"; public static String HUAWEI_MAIL_PASSWORD = "密码"; public MailAuthenticator() { } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(HUAWEI_MAIL_USER, HUAWEI_MAIL_PASSWORD); } }
这个类是发送邮件的类.
package com.deepdo.common.mail; /** * 此处插入类型说明。 * 创建日期:(2006-4-21 14:57:16) * @author:张宏亮 */ import java.util.*; import java.io.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class SendMail { //要发送Mail地址 private String mailTo = null; //Mail发送的起始地址 private String mailFrom = null; //SMTP主机地址 private String smtpHost = null; //是否采用调试方式 private boolean debug = false; private String messageBasePath = null; //Mail主题 private String subject; //Mail内容 private String msgContent; private Vector attachedFileList; private String mailAccount = null; private String mailPass = null; private String messageContentMimeType ="text/html; charset=gb2312"; private String mailbccTo = null; private String mailccTo = null; /** * SendMailService 构造子注解。 */ public SendMail() { super(); } private void fillMail(Session session,MimeMessage msg) throws IOException, MessagingException{ String fileName = null; Multipart mPart = new MimeMultipart(); if (mailFrom != null) { msg.setFrom(new InternetAddress(mailFrom)); System.out.println("发送人Mail地址:"+mailFrom); } else { System.out.println("没有指定发送人邮件地址!"); return; } if (mailTo != null) { InternetAddress[] address = InternetAddress.parse(mailTo); msg.setRecipients(Message.RecipientType.TO, address); System.out.println("收件人Mail地址:"+mailTo); } else { System.out.println("没有指定收件人邮件地址!"); return; } if (mailccTo != null) { InternetAddress[] ccaddress = InternetAddress.parse(mailccTo); System.out.println("CCMail地址:"+mailccTo); msg.setRecipients(Message.RecipientType.CC, ccaddress); } if (mailbccTo != null) { InternetAddress[] bccaddress = InternetAddress.parse(mailbccTo); System.out.println("BCCMail地址:"+mailbccTo); msg.setRecipients(Message.RecipientType.BCC, bccaddress); } msg.setSubject(subject); InternetAddress[] replyAddress = { new InternetAddress(mailFrom)}; msg.setReplyTo(replyAddress); // create and fill the first message part MimeBodyPart mBodyContent = new MimeBodyPart(); if (msgContent != null) mBodyContent.setContent(msgContent, messageContentMimeType); else mBodyContent.setContent("", messageContentMimeType); mPart.addBodyPart(mBodyContent); // attach the file to the message if (attachedFileList != null) { for (Enumeration fileList = attachedFileList.elements(); fileList.hasMoreElements();) { fileName = (String) fileList.nextElement(); MimeBodyPart mBodyPart = new MimeBodyPart(); // attach the file to the message FileDataSource fds = new FileDataSource(messageBasePath + fileName); System.out.println("Mail发送的附件为:"+messageBasePath + fileName); mBodyPart.setDataHandler(new DataHandler(fds)); mBodyPart.setFileName(fileName); mPart.addBodyPart(mBodyPart); } } msg.setContent(mPart); msg.setSentDate(new Date()); } /** * 此处插入方法说明。 */ public void init() { } /** * 发送e_mail,返回类型为int * 当返回值为0时,说明邮件发送成功 * 当返回值为3时,说明邮件发送失败 */ public int sendMail() throws IOException, MessagingException { int loopCount; Properties props = System.getProperties(); props.put("mail.smtp.host", smtpHost); props.put("mail.smtp.auth", "true"); MailAuthenticator auth = new MailAuthenticator(); Session session = Session.getInstance(props, auth); session.setDebug(debug); MimeMessage msg = new MimeMessage(session); Transport trans = null; try { fillMail(session,msg); // send the message trans = session.getTransport("smtp"); try { trans.connect(smtpHost, MailAuthenticator.HUAWEI_MAIL_USER, MailAuthenticator.HUAWEI_MAIL_PASSWORD);//, HUAWEI_MAIL_PASSWORD); } catch (AuthenticationFailedException e) { e.printStackTrace(); System.out.println("连接邮件服务器错误:"); return 3; } catch (MessagingException e) { System.out.println("连接邮件服务器错误:"); return 3; } trans.send(msg); trans.close(); } catch (MessagingException mex) { System.out.println("发送邮件失败:"); mex.printStackTrace(); Exception ex = null; if ((ex = mex.getNextException()) != null) { System.out.println(ex.toString()); ex.printStackTrace(); } return 3; } finally { try { if (trans != null && trans.isConnected()) trans.close(); } catch (Exception e) { System.out.println(e.toString()); } } System.out.println("发送邮件成功!"); return 0; } public void setAttachedFileList(java.util.Vector filelist) { attachedFileList = filelist; } public void setDebug(boolean debugFlag) { debug=debugFlag; } public void setMailAccount(String strAccount) { mailAccount = strAccount; } public void setMailbccTo(String bccto) { mailbccTo = bccto; } public void setMailccTo(String ccto) { mailccTo = ccto; } public void setMailFrom(String from) { mailFrom=from; } public void setMailPass(String strMailPass) { mailPass = strMailPass; } public void setMailTo(String to) { mailTo=to; } public void setMessageBasePath(String basePath) { messageBasePath=basePath; } public void setMessageContentMimeType(String mimeType) { messageContentMimeType = mimeType; } public void setMsgContent(String content) { msgContent=content; } public void setSMTPHost(String host) { smtpHost=host; } public void setSubject(String sub) { subject=sub; } public static void main(String[] argv) throws Exception { for(int i = 0;i<10;i++) { SendMail sm = new SendMail(); sm.setSMTPHost("SMTP地址"); sm.setMailFrom("发送地址"); sm.setMailTo("目标地址"); sm.setMsgContent("内容"); sm.setSubject("标题"); sm.sendMail(); } } }
原文出自:http://www.blogjava.net/action/archive/2009/09/11/42794.html
发表评论
-
eclipse 的关键字语法高亮的备忘
2012-04-04 10:03 1636因为常常被我莫名其妙地改变,导致我忘了,所以在这里做个备忘。要 ... -
GWT 2 Spring 3 JPA 2 Hibernate 3.5 教程(译)
2011-12-04 01:11 4417原文:http://www.javacodegeeks.c ... -
Eclipse 插件 links 方式的安装
2011-11-28 14:37 1045安装了 MyEclipse8 后,想安装 svn 插件,如 ... -
svn 使用备忘
2011-11-16 21:17 13551、svn 服务器地址改变后,subclipse 的修改方法( ... -
springsource-tool-suite-2.8.0 运行时报错
2011-11-02 01:11 1781刚才下载了:springsource-tool-suite-2 ... -
2011-11-02要阅读的文章
2011-11-02 00:41 1222用 sts 开发 spring3.0 的应用教程(英文版):h ... -
技术文章集(持续更新)
2011-10-10 09:57 1246《几种任务调度的 Java 实现方法与比较》:http:// ... -
java 免费空间
2011-03-04 23:32 1527找到一个免费的 java 空间,不知道多大,如果开通的话,需要 ... -
我读源码的一点体会
2010-12-29 11:03 1801刚才读到了一篇推荐源 ... -
javamail 访问 21cn 邮箱
2010-12-27 18:56 9681问题: 自己用 javamail 开发的邮件客户端无法 ... -
java 访问 usb (一)
2010-12-23 15:31 4321java 要访问 usb 设备,通常要自己写c/c++代码,然 ... -
在表格中有滚动条,滚动条里有表格,导致表格变形的问题
2010-09-08 11:17 2361早上发现,昨晚更新客户网站的首页,首页头变形了。检查并测试后发 ... -
jboss 4.x 经常死机的解决办法
2010-08-17 15:40 2395前段时间,客户的服务器频繁死机,检查发现,可能是内存无法及时回 ... -
在springside 中关于null参数值的传递
2010-08-02 10:57 1822我用 springside3 开发时,在我的程序了用到了 树 ... -
eclipse wtp 服务器的参数的修改
2010-07-30 17:43 1105要修改 wtp 服务器的参数,只需在 server 视图里,双 ... -
Eclipse wtp 里发布web工程
2010-07-30 00:55 1410Eclipse wtp 里发布web工程后被部署在这里: E ... -
SpringSide3及多数据库
2010-07-02 16:23 1254最近在研究 springside 3,从中学到不少东西。 ... -
在win xp上安装cvs的防火墙设置
2010-07-01 11:25 1158在xp上安装好 cvs nt 后,需要打开 xp 防火墙。设置 ... -
eclipse Java EE平台使用指南
2010-06-30 20:43 2427一直都用MyEclipse,现在试了一下 eclipse ja ... -
Eclipse 3.6 狠不错
2010-06-30 16:18 1944Eclipse 3.6 发布一周了,今天尝试把其 jee ...
相关推荐
JavaMail 深入浅出 JavaMail 是一个 Java 编程语言库,用于发送和接收电子邮件。它提供了一组 API,允许开发者在 Java 应用程序中实现电子邮件的发送和接收功能。在本文中,我们将深入浅出 JavaMail 的概念、架构、...
JavaMail 深入浅出 在本文中,我们将深入探索 JavaMail 的世界,了解 JavaMail 的基本概念、邮件传输协议、JavaMailAPI 的使用等方面的知识。 邮件传输协议 在了解 JavaMail 之前,首先需要了解邮件传输协议。...
JavaMail API是IBM developerWorks提供的一本深入浅出的电子书,旨在帮助开发者掌握在Java平台下开发邮件应用的关键技术。本书不仅介绍了JavaMail API的基本概念,还详细探讨了其与互联网邮件协议(如SMTP、POP3、...
张孝祥老师的的javamail邮件开发详解,深入浅出邮件开发原理。
张孝祥老师的的javamail邮件开发详解,深入浅出邮件开发原理。
张孝祥老师的的javamail邮件开发详解,深入浅出邮件开发原理。
张孝祥老师的的javamail邮件开发详解,深入浅出邮件开发原理。
传智播客张孝祥的课程“Java邮件开发”深入浅出地讲解了这个主题,结合提供的源代码,我们可以深入了解JavaMail API的使用方法。在这个课程中,开发者将学习到如何利用JavaMail API创建邮件、设置邮件头信息、添加...
《Java邮件开发详解》这本书深入浅出地讲解了如何使用JavaMail API进行邮件编程。源代码通常提供了实例和练习,帮助读者更好地理解和实践书中的理论知识。 JavaMail API是Java平台上的一个开源库,它允许开发者通过...
在张孝祥的讲解中,他深入浅出地介绍了邮件发送和接收的基本原理及JavaMail API的使用。 首先,邮件服务的工作原理可以比喻为邮局系统。发送邮件时,邮件先由发送方通过SMTP(简单邮件传输协议)发送到自己的邮件...
总的来说,北大青鸟javaweb课程深入浅出地教授了Java在Web开发中的核心技能,包括Servlet和JavaMail API的使用,对于想要从事Java Web开发的学生或从业者来说,是一份非常有价值的学习资源。通过学习这些知识,学员...
在该项目中,韩顺平老师深入浅出地阐述了如何构建一个功能完备的购物车系统,涵盖了后端逻辑处理、前端展示以及数据交互等多个关键环节。 【描述】提到的"韩顺平细说jspMVC购物车项目jar包",暗示了该项目依赖于...
这本书深入浅出地讲解了Java在企业级应用中的核心概念和技术,通过丰富的实例帮助读者理解和掌握相关知识。 首先,"06_whatareservlets"章节介绍了Servlets,这是Java Web开发中的关键组件。Servlet是运行在服务器...
对于Java初学者,推荐的视频教程有孙鑫和张孝祥的Java基础课程,他们的讲解深入浅出,适合新手入门。 完成J2SE的学习后,可以进一步深入到Java 2 Platform, Enterprise Edition(J2EE)领域。J2EE是用于开发大型...
这些笔记深入浅出地解释了JavaSE的重要概念,帮助你建立坚实的编程基础。 【JavaEE部分】 JavaEE(Java Enterprise Edition)是Java在企业级应用开发中的扩展,包括了服务器端组件、数据库连接、Web服务等。...
2, Volume I: Fundamentals》是两本值得推荐的入门书籍,它们深入浅出地讲解了Java的基础知识。 当J2SE基础稳固后,可以逐步接触J2EE的相关技术。Web服务相关的JAXP、JAXR、JAX-RPC和SAAJ,这些API用于处理XML,是...
这本书深入浅出地介绍了Java企业版5(Java EE 5)的各种核心技术,旨在帮助读者快速掌握这一强大的企业级开发平台。Java EE 5是Java应用程序开发的重要里程碑,它简化了开发过程,提供了丰富的API和框架,使得构建...
良葛格的Java JDK 5.0学习笔记涵盖了这些关键知识点,深入浅出地解析了Java编程中的新特性和最佳实践,是理解和掌握JAVA JDK 5.0的宝贵资源。通过学习这些内容,开发者能够提升编程技能,更好地利用Java进行软件开发...
《JBuilder开发人员指南》是一本专为Java开发者量身打造的实用教程,它深入浅出地介绍了如何利用Borland公司的JBuilder集成开发环境(IDE)进行高效、便捷的Java应用程序开发。作为一款强大的Java开发工具,JBuilder...