`
bruce198
  • 浏览: 236707 次
  • 性别: 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详解 #### 一、概述与背景 JavaMail API是用于处理电子邮件的一组标准接口,它为开发人员提供了强大的邮件收发能力。JavaMail API不仅支持常见的邮件协议如SMTP(简单邮件传输协议)、POP3(邮局...

    JavaMail API详解.doc

    JavaMail API 详解 JavaMail API 是一款功能强大且灵活的电子邮件处理API,允许开发者建立电子邮件客户端程序,例如Eudora、Foxmail、MS Outlook Express等。JavaMail API 的主要特点是它可以与各种电子邮件协议...

    JavaMail API详解.htm

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

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

    提供的“javamail源码详解”和“开发手册”是理解JavaMail API的重要参考资料。通过阅读源码,可以深入了解其实现原理;开发手册则提供了详尽的API使用示例和教程,帮助开发者快速上手。 总结,JavaMail API是Java...

    JavaMail+JAF+JavaMail_API+JavaMail_API详解

    JavaMail API详解.chm文件可能是一个帮助文档,详细介绍了如何使用JavaMail API进行邮件操作。它可能涵盖了如何设置邮件服务器连接,创建邮件消息,添加附件,处理邮件头信息,以及使用MIME多部分消息等内容。这个...

    JavaMail API详解

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

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

    在JavaMail API详解的资源中,我们可以深入理解这一强大的工具。 首先,JavaMail API简介部分会讲解JavaMail的基本概念,包括其设计目标、核心组件以及与SMTP(简单邮件传输协议)、POP3(邮局协议版本3)和IMAP...

    JavaMail API Design Specification

    《JavaMail API设计规范详解》 JavaMail API是Java平台上的一个强大工具,它为开发者提供了处理邮件系统交互的能力,包括发送、接收、管理邮件等。这篇博文将深入探讨JavaMail API的设计规范,帮助读者理解其核心...

    JavaMail_API详解.doc

    JavaMail API 是一个Java编程语言中的库,用于处理电子邮件的创建、发送和接收。这个API提供了与邮件协议无关的抽象层,使得开发人员能够在不直接处理底层协议细节的情况下,实现邮件功能。JavaMail API 主要分为两...

    JavaMail(JAVA邮件服务) API详解

    JavaMail API是Java平台上用于处理电子邮件的一套强大的库,它为开发者提供了丰富的功能,使得在应用程序中发送和接收邮件变得简单。本文将深入探讨JavaMail API的各个方面,帮助你理解和掌握这一关键工具。 首先,...

    JavaMail_API,JavaMail_API简介,JavaMail

    ### JavaMail API 知识点详解 #### 一、JavaMail API 概述 JavaMail API 是一个可选的标准扩展,用于读取、编写和发送电子邮件。它允许开发者创建类似于 Eudora、Pine 或 Microsoft Outlook 的邮件用户代理 (Mail ...

    javamail 中文API文档

    ### JavaMail API中文文档知识点详解 #### 一、概述 JavaMail API是Java平台上的电子邮件解决方案,它提供了一组用于发送、接收、管理和处理电子邮件消息的API。JavaMail API主要包含以下几个核心概念:会话...

    javaMail详解

    JavaMail API详解将深入探讨这些关键概念和技术。 1. **JavaMail API概述**: JavaMail API是Java平台上的标准邮件服务接口,由Java Community Process(JCP)定义为JSR 54。它允许开发者在应用程序中发送、接收和...

    JavaMail邮件开发详解

    ### JavaMail邮件开发详解 #### 一、JavaMail API简介 JavaMail API 是一个用于读取、撰写和发送电子邮件的强大工具包。它主要用于构建邮件用户代理程序(Mail User Agent,简称 MUA),这类程序通常包括像 Eudora...

    fundamentals of the javamail api

    ### JavaMail API基础知识详解 #### 一、教程提示 ##### 是否应该参加此教程? 如果你希望在平台独立的Java解决方案中集成邮件功能,那么JavaMail API将是你不可或缺的选择。该API提供了一个与协议无关的模型,...

Global site tag (gtag.js) - Google Analytics