`
bruce198
  • 浏览: 233096 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[转] JavaMail API 详解(续)

    博客分类:
  • java
阅读更多

处理HTML消息

发送基于HTML的消息比发送纯文本消息要稍微复杂一点,尽管它不需要做大量的工作。它全部取决于您特定的需求。

发送HTML消息

如果您所要做的全部工作是发送一个等价的HTML文件作为消息,并让邮件阅读者忧心于取出任何嵌入的图片或相关片段,那么就可以使用消息的setContent()方法,以字符串形式传递消息内容,并把内容类型设置为text/html。

  1. String htmlText = "

    Hello

    "
     +    
  2.   
  3. "<img src=\"http://www.jguru.com/images/logo.gif\">";   
  4.   
  5. message.setContent(htmlText, "text/html"));   

在接收端,如果您用JavaMail API获取消息,在该API中没有内置任何用于以HTML格式显示消息的功能。JavaMail API只以字节流的形式来查看消息。要以HTML格式显示消息,您必须使用Swing JeditorPane或某些第3方HTML阅读器组件。

  1. if (message.getContentType().equals("text/html")) {   
  2.   
  3. String content = (String)message.getContent();   
  4.   
  5. JFrame frame = new JFrame();   
  6.   
  7. JEditorPane text = new JEditorPane("text/html", content);   
  8.   
  9. text.setEditable(false);   
  10.   
  11. JScrollPane pane = new JScrollPane(text);   
  12.   
  13. frame.getContentPane().add(pane);   
  14.   
  15. frame.setSize(300300);   
  16.   
  17. frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   
  18.   
  19. frame.show();   
  20.   
  21. }   
  22.   

在消息中包含图片

另一方面,如果您的HTML消息中嵌入了作为消息一部分的图片,并且您想保持消息内容的完整,就必须把图片看作附件,并用特殊的通信标识符URL引用该图片,该通信标识符引用的是图片附件的内容ID报文。

嵌入图片的处理与附加一个文件到消息上非常相似,惟一的不同之处在于:您必须区分MimeMultipart中,哪些部分是在构造器(或通过setSubType()方法)通过设置其子类型而使之相关的,以及将图片的内容ID报头设置成任意字符串,它将在img标记中用作图片的源路径。下面显示了一个完整的示例:

  1. String file = ...;   
  2. // Create the message   
  3. Message message = new MimeMessage(session);   
  4. // Fill its headers   
  5. message.setSubject("Embedded Image");   
  6. message.setFrom(new InternetAddress(from));   
  7. message.addRecipient(Message.RecipientType.TO,    
  8. new InternetAddress(to));   
  9. // Create your new message part   
  10. BodyPart messageBodyPart = new MimeBodyPart();   
  11. String htmlText = "<H1>Hello</H1>" +    
  12. "<img src=\"cid:memememe\">";   
  13. messageBodyPart.setContent(htmlText, "text/html");   
  14. // Create a related multi-part to combine the parts   
  15. MimeMultipart multipart = new MimeMultipart("related");   
  16. multipart.addBodyPart(messageBodyPart);   
  17. // Create part for the image   
  18. messageBodyPart = new MimeBodyPart();   
  19. // Fetch the image and associate to part   
  20. DataSource fds = new FileDataSource(file);   
  21. messageBodyPart.setDataHandler(new DataHandler(fds));   
  22. messageBodyPart.setHeader("Content-ID","memememe");   
  23. // Add part to multi-part   
  24. multipart.addBodyPart(messageBodyPart);   
  25. // Associate multi-part with message   
  26. message.setContent(multipart);   
  27.   

练习

发送带有图片的 HTML 消息

用SearchTerm搜索

JavaMail API包含一种可用于创建SearchTerm(搜索条件)的筛选机制,它可以在javax.mail.search包中找到。一旦创建了SearchTerm,您就可以询问某个文件夹匹配的消息,并检索出消息对象数组:

  1. SearchTerm st = ...;   
  2.   
  3. Message[] msgs = folder.search(st);   

有22种不同的类可用于帮助创建搜索条件。

· AND条件(AndTerm类)

· OR条件(OrTerm类)

· NOT条件(NotTerm类)

· SENT DATE条件(SentDateTerm类)

· CONTENT条件(BodyTerm类)

· HEADER条件(FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.)

本质上,您可以为匹配的消息创建一个逻辑表达式,然后进行搜索。例如,下面显示了一条消息的条件搜索示例,该消息带有(部分带有)一个ADV主题字符串,其发送者字段为friend@public.com。您可能考虑定期运行该查询,并自动删除任何返回的消息。

  1. SearchTerm st =    
  2.   
  3. new OrTerm(   
  4.   
  5. new SubjectTerm("ADV:"),    
  6.   
  7. new FromStringTerm("friend@public.com"));   
  8.   
  9. Message[] msgs = folder.search(st);   


一个支持多附件的mail发送类


package mail;


import javax.mail.*;

import javax.mail.internet.*;

import java.util.*;

import javax.activation.*;

import java.io.*;

/**

*

Title:

 

*

Description:

 

*

Copyright: Copyright (c) 2004

 

*

Company:

 

* @author 黄新

* @version 1.0

*/


public class Mail {

 

  public Mail() {

  }


  /**

   * 发送邮件

   * @param to 收件人

   * @param subject 主题

   * @param body 主体 邮件内容

   * @param from 法件人

   * @param PassWord 密码

   * @param str_files 附件 数组

   * @return 是否发送成功 只能以是否跑出异常来做判断 寻求更好的判断方法

   */

  public boolean sendMail(String to,String subject,String body, String from,String PassWord,String []str_files){

    Properties props = new Properties();

    boolean isSended = true;

    try {

      String protocol = "smtp";//smtp  pop3

      String host = getHost(from,protocol);

      String username = getUsername(from);

      //Setup mail server

      props.put("mail."+protocol+".host",host);//smtp  pop3

      //Get Session

      props.put("mail."+protocol+".auth","true");

      PopupAuthenticator popAuthenticator = new PopupAuthenticator();

      PasswordAuthentication pop = popAuthenticator.performCheck(username,PassWord);

      Session session = Session.getInstance(props,popAuthenticator);


      //Define message

      MimeMessage message=new MimeMessage(session);

      message.setFrom(new InternetAddress(from));


      message.setSentDate(new java.util.Date ()) ;


      message.addRecipient(Message.RecipientType.TO,

                           new InternetAddress(to));

      message.setSubject(subject);

      //给消息对象设置内容

      BodyPart textBodyPart=new MimeBodyPart();

      textBodyPart.setContent(body,"text/html;charset=gb2312") ;

      Multipart mm=new MimeMultipart();

      mm.addBodyPart(textBodyPart);

      int i = str_files.length ;

        mm.addBodyPart(getFileBodyPart(str_files[i-1])) ;

        i--;

      }

      message.setContent(mm) ;

      message.saveChanges() ;

      Transport.send(message);

    }

    catch(AuthenticationFailedException afe){

      isSended = false;

      System.out.println("登陆验证出现错误 ,请检查你的用户名和密码") ;

      afe.printStackTrace() ;

    }

    catch(MessagingException me){

      isSended = false;

      me.printStackTrace() ;

      System.out.print("") ;

    }

    catch(Exception e){

      isSended = false;

      e.printStackTrace() ;

    }

    return isSended;

  }

  /**

   * 获得通过邮件地址获取用户名

   * @param email 邮件地址

   * @return 用户名

   */

  private String getUsername(String email){

    StringBuffer str = new StringBuffer(email);

    String usename = str.substring(0,str.indexOf("@") ) ;

    return usename;

  }

  /**

   * 通过邮件地址获取邮件服务器地址

   * @param email 邮件地址

   * @param protocol 邮件协议

   * @return 邮件服务器主机地址

   */

  private String getHost(String email,String protocol){

    StringBuffer str = new StringBuffer(email);

    String host = protocol+"." + str.substring(str.indexOf("@")+1 ) ;

    return host;

  }

  private BodyPart getFileBodyPart(String str_file){

    BodyPart  fileBodyPart = new MimeBodyPart();

//    int NO_files = str_files.length ;

    try {

      File file = new File(str_file);

      FileDataSource fds=new FileDataSource(file);//用本地文件

      DataHandler dh = new DataHandler(fds);

      fileBodyPart.setFileName(file.getName());//可以和原文件名不一致

      fileBodyPart.setDataHandler(dh);


    }

    catch (MessagingException ME) {

      ME.printStackTrace() ;

      System.out.println("获取文件名setFileName或设置setDataHandler时出现错误") ;

      return null;

    }

    return fileBodyPart;

  }

  public static void main(String[] args) {

    String[] str_files ={"G:\\192.168.7.144备份\\学习资料\\技术文章\\eclipse 参考手册\\CSDN_eclipse 参考手册(三).htm ","G:\\日立.html"};

    Mail m = new Mail();

    System.out.println(m.sendMail("xini_huang@hotmail.com","nihao","helloworld!!!!","huangxinyi2003@163.com","差点把自己的密码给泄漏了",str_files)) ;

    //System.out.println(m.getUsername("huangxinyi2003@163.com")+"======"+m.getHost("huangxinyi2003@163.com")  ) ;

  }

}


[ Last edited by 黄新 on 2004-12-2 at 16:31 ]

 2004-12-2 16:26                

黄新

 

 


积分 293

发贴 263

注册 2003-6-22

来自 福建漳州

状态 离线  验证


package mail;

import javax.mail.*;

import javax.mail.internet.*;

/**

*

Title:

 

*

Description:

 

*

Copyright: Copyright (c) 2004

 

*

Company:

 

* @author 黄新

* @version 1.0

*/


public class PopupAuthenticator extends Authenticator{

  String username=null;

  String password=null;

  public PopupAuthenticator(){

  }

  public PasswordAuthentication performCheck(String user,String pass){

    username = user;

    password = pass;

    return getPasswordAuthentication();

  }

  protected PasswordAuthentication getPasswordAuthentication() {

    return new PasswordAuthentication(username, password);

  }

  public static void main(String[] args) {

  }


}

分享到:
评论

相关推荐

    JavaMail API详解.txt

    JavaMail API详解.txt JavaMail API详解.txt JavaMail API详解.txt JavaMail API详解.txt

    JavaMail API详解.doc

    JavaMail API详解

    JavaMail API详解.htm

    一、JavaMail API简介 JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。而不是像sendmail或者其它的...

    JavaMail API详解

    JavaMail API是读取、撰写、发送电子信息的可选包。我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。而不是像sendmail或者其它的邮件传输代理(Mail ...

    JavaMail+JAF+JavaMail_API+JavaMail_API详解

    包含JavaMail1.4.5、JAF1.1.1、JavaMail API文档英文版,以及JavaMailAPI中文详解

    javamail API详解,帮助文档,源码

    javamail源码详解,帮助文档,开发手册

    JavaMail(JAVA邮件服务器)API详解 chm.rar

    JavaMail(JAVA邮件服务器)API详解 chm,内容涉及JavaMail API简介、相关协议一览、安装JavaMail、认识和使用JavaMail API等相关内容。

    JavaMail_API详解.doc

    JavaMail_API详解

    JavaMail(JAVA邮件服务) API详解

    JavaMail(JAVA邮件服务) API详解

    JavaMail API

    这份资料详解JavaMail APIJavaMail API,希望能给有志成为IT人才一点帮助! Thank you for your use!

    详解Java编程中JavaMail API的使用

    主要介绍了详解Java编程中JavaMail API的使用,通过JavaMail可以实现丰富的邮件类相关功能,需要的朋友可以参考下

    JAVA邮件服务API详解

    JavaMail(JAVA邮件服务) API详解,并且是中文版的

    JavaMail+JAF+JavaMailAPI文档

    内含JavaMail1.4.5官方包、JAF1.1.1官方包和JavaMailAPI详解文档。 !!!若文档有无法打开的情况,请将文档拷贝到C盘根目录再打开。

    JAVAMail邮箱服务器搭建步骤详解

    我们可以基于JavaMail,开发出类似于Microsoft Outlook的应用程序。 SMTP协议:Simple Mail Transfer Protocol,即简单邮件传输协议,用于发送电子邮件 POP3协议:Post Office Protocol 3,即邮局协议的第三个版本,...

    Java ServerSocket用法详解

    Java网络编程的基础知识、套接字编程、非阻塞通信、创建HTTP服务器与客户程序、数据报通信、对象的序列化与反序列化、Java反射机制、RMI框架、JDBC API、JavaMail API、MVC设计模式、安全网络通信、CORBA和Web服务

Global site tag (gtag.js) - Google Analytics