javax.mail

 

最近在项目中用到发送邮件的功能,由于以前没有接触过,找了很多资料才终于把它弄出来,今天写下这些,算是做个总结吧。 
1、首先定义一个邮件的数据结构类 
public class EmailData() { 
     String from   = null;  //发件人 
     String[] recipients = null;  //收件人,可以多个 
     String subject   = null;  //邮件主题 
     String content   = null;  //邮件内容 
     String contentType  = null;  //邮件内容格式(文本或html) 
     String fileName  = null;  //附件文件名(目前只提供一个附件) 
  
     //下面是相应的setter/getter方法,省略.. 

2、发送不带附件的邮件(包括文本格式和html两种格式) 
public void postMail(EmailData emailData) 
 throws MessagingException,Exception { 
   
 String from   = emailData.getFrom(); 
 String[] recipients = emailData.getRecipents(); 
 String subject   = emailData.getSubject(); 
 String content   = emailData.getContent(); 
 String contentType = emailData.getContentType(); 
 String fileName  = emailData.getFileName(); 
  
    if (recipients != null && recipients.length > 0) {

     Properties props = new Properties(); 
     //设置邮件服务器地址,连接超时时限等信息 
     props.put("mail.smtp.host", "10.30.1.233"); //10.30.1.233邮件服务器 
     props.put("mail.smtp.connectiontimeout", "10000"); // 
  props.put("mail.smtp.timeout", "10000");   // 
     
     //创建缺省的session对象 
     Session session = Session.getDefaultInstance(props, null); 
  
     //创建message对象 
     Message msg = new MimeMessage(session); 
  
     //设置发件人和收件人 
     InternetAddress addressFrom = new InternetAddress(from); 
     msg.setFrom(addressFrom);   
     InternetAddress[] addressTo = new InternetAddress[recipients.length]; 
     for (int i = 0; i < recipients.length; i++){ 
         addressTo[i] = new InternetAddress(recipients[i]); 
     } 
     msg.setRecipients(Message.RecipientType.TO, addressTo); 
   
  //设置邮件标题,中文编码 
     subject = MimeUtility.encodeText(new String(subject.getBytes(), "GB2312"), "GB2312", "B"); 
     msg.setSubject(subject); 
     
     //设置邮件内容,区分文本格式和HTML格式 
     if (contentType == null || contentType.equals("text")) { 
      msg.setText(content); 
  } else if (contentType.equals("html")) { 
   //给消息对象设置内容 
   BodyPart bodyPart1 = new MimeBodyPart(); //新建一个存放信件内容的BodyPart对象 
   mdp.setContent(content, "text/html;charset=gb2312");//给BodyPart对象设置内容和格式/编码方式 
   Multipart mmp = new MimeMultipart();//新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个) 
   //设置邮件附件 
   BodyPart bodyPart2 = new MimeBodyPart();  
   FileDataSource fileDataSource = new FileDataSource(fileName); 
   bodyPart2.setDataHandler(new DataHandler(fileDataSource));        
   bodyPart2.setFileName("=?GB2312?B?"+enc.encode(fileName.getBytes())+"?="); 
    
      
   Multipart multipart = new MimeMultipart(); 
   multipart.addBodyPart(bodyPart1); 
   multipart.addBodyPart(bodyPart2); 
    
   mmp.addBodyPart(mdp);//将BodyPart加入到MimeMultipart对象中(可以加入多个BodyPart) 
   msg.setContent(mmp);//把mm作为消息对象的内容 
  } 
      
     //设置邮件发送时间 
        msg.setSentDate(new java.util.Date()); 
        //调用抽象类的静态方法send()发送邮件 
     Transport.send(msg); 
    } 


3、发送带附件的邮件稍微复杂一些,跟发送普通邮件的区别主要如下: 
   //设置邮件内容 
   BodyPart bodyPart1 = new MimeBodyPart(); 
   bodyPart1.setDataHandler(new DataHandler( new MailDataSource(content,"text/html"))); 
    
   //设置邮件附件 
   BodyPart bodyPart2 = new MimeBodyPart();  
   FileDataSource fileDataSource = new FileDataSource(fileName); 
   bodyPart2.setDataHandler(new DataHandler(fileDataSource));        
   //需要对附件文件名称进行转码,不然会出现乱码 
   bodyPart2.setFileName("=?GB2312?B?"+enc.encode(fileName.getBytes())+"?="); 
         
   Multipart multipart = new MimeMultipart(); 
   multipart.addBodyPart(bodyPart1); 
   multipart.addBodyPart(bodyPart2);

   //将Multipart加入到信件 
   newMessage.setContent(multipart); 

4、以下是转载的关于java mail的介绍 
Session 
-------------------------------------------------------------------- 
 Session 定义了一个基本的邮件会话,任何工作都是基于这个Session的。Session 对象需要一个 java.util.Properties 对象来得到类似 邮件服务器,用户名,密码这样的信息。 
  
 Session 的构造函数是私有的,你可以通过 getDefaultInstance() 方法来取得一个单一的可以被共享的默认session 如: 

  Properties props = new Properties(); 
  // 填写一些信息 
  Session session = Session.getDefaultInstance(props,null); 

 或者,你可以使用 getInstance() 方法来创建一个唯一的 session如: 

  Properties props = new Properties(); 
  // 填写一些信息 
  Session session = Session.getInstance(props,null); 
  
 在这两种方法中 其中的 null 参数是一个 Authenticator 对象,在这里没有被使用的,所以就是null 
  
 在大多数案例中,使用一个共享session 已经做够了。 

Message 
---------------------------------------------------------------- 
 一旦你创建了Session对象,那么下面要做的就是创建 message 来发送。Message 是一个抽象类,在大部分应用中你可以使用它的子类 javax.mail.internet.MimeMessage 。MimeMessage 是一个理解在不同RFCs中定义的MIME类型以及headers的e-mail message&nbsp;。 Message headers 必须使用 US-ASCII 字符集。 

 可以用如下的方法创建一个 Message  
  MimeMessage message = new MimeMessage(session); 
 我们注意到,这里需要用session对象作为构造函数的参数。当然,还有其它的构造函数,比如从用RFC822格式化过的输入流来创建message。 

 一旦你得到了 message ,你就可以来设置它的各个部分(parts)。设置内容(content)的基本的机制是使用setContent() 方法。 

  message.setContent("Email Content. ","text/plain"); 

 如果,你能够明确你的使用MimeMessage来创建message 并且只是使用普通的文本(plain text) 那么你也可以使用 setText() 方法,setTest()方法只需要设置具体的内容,它默认的MIME类型是 text/plain 
   
  message.setText("Email Content. "); 
  
 对于普通文本类型的邮件,有一种机制是首选( message.setText("Email Content. "))的设置内容的方法。如果要创建其它类型的message ,比如 HTML类型的message  那么还是需要使用前者 ( message.setContent("Email Content. ","text/html"); ) 

 设置主题(subject ),使用setSubject() 方法 
   
  message.setSubject(" Subject "); 

Address  
---------------------------------------------------------------- 
  
 当你已经创建Session 以及 Message,并且已经为message 填充了内容,那么接下来要做的就是给你的邮件添加一个地址(Address)。 就像Message一样,Address也是一个抽象类,我们可以使用它的一个子类javax.mail.internet.InternetAddress 。 

 创建一个地址非常简单 

  Address address = new InternetAddress("suixin@asiainfo.com"); 

 如果,你希望在出现邮件地址的地方出现一个名称,那么你只需要再多传递一个参数。 

  Address address = new InternetAddress("suixin@asiainfo.com","Steve"); 

 你需要为 message 的from以及 to 字段创建address对象。为了识别发送者,你需要使用setFrom() 和 setReplyTo() 方法。 
   
  messge.setFrom(address); 

 如果你的message 需要显示多个 from 地址,可以使用 addFrom() 方法 

  Address address[] = {....}; 
  message.addFrom(address); 

 为了辨识message 的收件人,你需要使用 setRecipient() 方法。这个方法除了address参数之外,还需要一个Message.RecipientType 。 

 message.addRecipient(type,address); 

 Message.RecipientType有几个预先定义好的类型 
  
 Message.RecipientType.TO  收件人 
 Message.RecipientType.CC  抄送 
 Message.RecipientType.BCC  暗送 

 如果你的一封邮件,需要发送给你的老师,并还要给你的几个同学,那么你可以这样 

 Address toAddress = new InternetAddress("teacher@17288.com"); 
 Address[] ccAddress = {new InternetAddress("schoolmate1@17288.com"),new InternetAddress("schoolmate2@17288.com")}; 

 message.addRecipient(Message.RecipientType.To, toAddress); 
 message.addRecipient(Message.RecipientType.CC, ccAddress); 
  
 JavaMail 没有提供电子邮件地址有效性的检测。这些超越了JavaMail API的范围。 

Authenticator 
  
 通过Authenticator设置用户名、密码,来访问受保护的资源,这里的资源一般指的是邮件服务器。 
  
 Authenticator也是一个抽象类,你需要自己编写子类已备应用。你需要实现getPasswordAuthentication()方法,并返回一个PasswordAuthentication实例。你必须在 session被创建时, 注册你的 Authenticator。这样,当需要进行认证是,你的Authenticator就可以被得到。 

  Properties props = new Properties(); 
  //设置属性 
  Authenticator auth = new YourAuthenticator(); 
  Session session = Session.getDefaultInstance(props, auth); 
  
Transport 
---------------------------------------------------------------- 

 发送消息最后的一步就是使用Transport类,你可以通过两种方法来进行发送。 
 Transport 是一个抽象类,你可以调用它静态的send() 方法来发送 

  Transport.send(message); 

 或者,你可以为你使用的协议从session中取得一个指定的实例, 

  Transport transport = session.getTransport("smtp"); 
  transport.sendMessage(message, message.getAllRecipients()); 
  transport.close(); 

Store and Folder 
  
 这两个类重要用于取得信息。在创建了Session之后,需要连接到一个 Store ,你需要告诉Store  你使用的是什么协议。 

  // Store store = session.getStore("imap"); 
  Store store = session.getStore("pop3"); 
  store.connect(host, username, password); 

 在连接到一个 Store 后,你可以得到一个 Folder,当然,这个Floder必须是打开的。 

  Folder folder = store.getFolder("INBOX"); 
  folder.open(Folder.READ_ONLY); 
  Message message[] = folder.getMessages(); 

 如果使用POP3那么,INDEX是唯一可用的文件夹。如果使用的是IMAP,你就可以使用其它的文件夹。  

 

 

 

 最后讲述下最容易出现的错误:

    网上很多人都说J2EE5兼容性不好,例如典型的javamail1.4中包与J2EE5中包接口包引起冲突,导致单元测试经常报如下错误:

    java.lang.NoClassDefFoundError: com/sun/mail/util/BEncoderStream

    当然这个错误是没有将javamail的实现者引进工程(没有导包),但导包后,就会出现另外一个错误:

    java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream

    此时甚至web容器都无法启动,经常会有网友们为这两个异常搞得焦头烂额,如此更换J2EE1.4,会对工程造成影响。但是一定要把概念弄清楚,问题就好解决。J2EE5中mail.jar包定义的只是接口,没有实现,是不能真正发送邮件的,但开发编译肯定是可以过去的,因为我们是针对J2EE规范编的程序。而运行期用Sun公司的JavaMail1.4的实现才可以开始发送邮件,但老大为什么把这两个弄冲突了?

    笔者的解决办法是:

    开发期不要导包,运行期将javamail1.4压缩文件中的mail.jar包放入到tomcat\lib目录下,这样完全可以通过开发和运行。若要做单元测试则新开一个Java Project,注意,不是web工程,此时可以将javamail1.4压缩包中的mail.jar放入到工程的classpath下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
javaMail的详细文档,都有以下多有类的详细信息: ACL Address AddressException AddressStringTerm AddressTerm AndTerm AuthenticationFailedException Authenticator BodyPart BodyTerm ByteArrayDataSource ComparisonTerm ConnectionAdapter ConnectionEvent ConnectionListener ContentDisposition ContentType DateTerm DeliveryStatus DispositionNotification FetchProfile FetchProfile.Item Flags Flags.Flag FlagTerm Folder FolderAdapter FolderClosedException FolderEvent FolderListener FolderNotFoundException FromStringTerm FromTerm Header HeaderTerm HeaderTokenizer HeaderTokenizer.Token IllegalWriteException IMAPFolder IMAPFolder.FetchProfileItem IMAPFolder.ProtocolCommand IMAPMessage IMAPSSLStore IMAPStore IntegerComparisonTerm InternetAddress InternetHeaders InternetHeaders.InternetHeader MailDateFormat MailEvent MailHandler MailSSLSocketFactory Message Message.RecipientType MessageAware MessageChangedEvent MessageChangedListener MessageContext MessageCountAdapter MessageCountEvent MessageCountListener MessageHeaders MessageIDTerm MessageNumberTerm MessageRemovedException MessagingException MethodNotSupportedException MimeBodyPart MimeMessage MimeMessage.RecipientType MimeMultipart MimePart MimePartDataSource MimeUtility Multipart MultipartDataSource MultipartReport NewsAddress NoSuchProviderException NotTerm OrTerm ParameterList ParseException Part PasswordAuthentication POP3Folder POP3Message POP3SSLStore POP3Store PreencodedMimeBodyPart Provider Provider.Type Quota Quota.Resource QuotaAwareStore ReadOnlyFolderException ReceivedDateTerm RecipientStringTerm RecipientTerm Report Rights Rights.Right SearchException SearchTerm SendFailedException SentDateTerm Service Session SharedByteArrayInputStream SharedFileInputStream SharedInputStream SizeTerm SMTPAddressFailedException SMTPAddressSucceededException SMTPMessage SMTPSendFailedException SMTPSSLTransport SMTPTransport Store StoreClosedException StoreEvent StoreListener StringTerm SubjectTerm Transport TransportAdapter TransportEvent TransportListener UIDFolder UIDFolder.FetchProfileItem URLName
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值