`
liugang594
  • 浏览: 987540 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Mail API和camel-mail组件

 
阅读更多

什么是SMTP

SMTP 是Simple Mail Transfer Protocol (SMTP)的简称,由 RFC 821 定义。它是一个用来发送电子邮件的协议,互联网上绝大部分的邮件系统都使用SMTP作为邮件传输机制。

 

怎样使用Java Mail API来发送邮件

依赖

首先,添加Java Mail依赖:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

设置

当我们使用某些邮件客户端,例如Outlook,作为代理来接收邮件时,需要提供以下信息:

  1. 协议 : SMTP 用于发送; POP3 或 IMAP 用于接收
  2. 主机 : 用于发送和接收邮件的服务器主机地址
  3. 端口 : 服务器主机上对应于上述协议的邮件收发端口
  4. 用户名: 用于访问以上邮件服务器的用户名
  5. 密码 : 用于访问以上邮件服务器的、对应于用户名的密码

同样的,当使用Java mail API去实现自己的邮件收送端时,也需要以上的信息,例如:

 

Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", "smtp.sohu.com"); //provide host, default is localhost
properties.setProperty("mail.smtp.port", "25");        //provide port, default is 25
properties.setProperty("mail.smtp.auth", "true");      //indicate authentication is required or not, it's required by most of servers
 这些信息也可以存在一个Properties文件里,然后读取这个文件来获取山配置:
mail.smtp.host=smtp.sohu.com
mail.smtp.port=25
mail.smtp.auth=true
...

然后加载:

FileInputStream is = new FileInputStream("mail.properties");
properties.load(is);
is.close();

Session(会话)

接下来,就需要创建一个 Session, 一个邮件 Session 管理着配置选项和用来连接服务器以进行交互的用户认证信息,以下代码用来创建一个Session:

Session session = Session.getDefaultInstance(properties, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(properties.getProperty("username"), properties.getProperty("password"));
    }
});

 

需要提供用户名、密码和其他的一些配置信息(Setting一节中介绍了)来创建一个Session

发送文本

有了Session以后,就可以准备发送邮件了。在Java mail API里,每个邮件都由一个 javax.mail.Message 对象表示,然而 javax.mail.Message 是一个抽象类,因此需要转向它的一个具体实现,通常使用 javax.mail.internet.MimeMessage,下面代码展示了一个最简单的、用于发送文本邮件的方式:

MimeMessage message = new MimeMessage(session);
message.setText("Hello Java Mail Body");
message.setSubject("Hello Java Mail");
message.setFrom(new InternetAddress(properties.getProperty("from")));
message.addRecipient(RecipientType.TO, new InternetAddress(properties.getProperty("to")));
message.saveChanges();
 
Transport.send(message);

这里多了一个FromTo用来表示邮件的发送者和接收者,以上示例中,这两个值也来自properties文件。

Content-Type(内容类型)

当使用setText()方法设置邮件内容里,默认的Content-Type类型是 text/plain 。当发送邮件时,也可以指定期望的 Content-Type 值,方法之一就是使用 setDataHandler() 而不是 setText() 去设置邮件内容:

DataHandler dh = new DataHandler("<p style='color:red'>Html Mail Content</p>", "text/html");
message.setDataHandler(dh);

以上内容在邮件中展示后,类似于:

Html Mail Content

 

而如果把 Content-Type 从 "text/html" 变成 "text/plain",则结果大不一样了:

<p style='color:red'>Html Mail Content</p>

Multipart(复杂类型)

以上例子是一个简单,消息只包含单一类型的邮件内容,这个内容包装在一个 DataHandler 实例里(实际上,私底下所有的邮件内容都包装在一个 DataHandler 实例中,不管是通过 setText() 还是 setContent() 方法),以下是简单消息的一个结构图:

 

 

除了以上简单消息结构,消息也可以包含复杂类型的结构,这种情况下 DataHandler 对象包含的就是一个multipart 对象,而不是仅仅是一个单一的内容块。一个multipart 对象是一个 BodyPart 对象的容器,一个 BodyPart 对象的结构有点类似于 以上简单消息对象的结构,因为他们两都实现了 Part 接口。每一个 BodyPart 对象都包含了属性( attributes)和内容(content),但是 Bodypart 对象的属性只限定于定义在 Part 接口中的那些。一个重要的属性就是 content-type 。一个 BodyPart 对象的内容又是一个DataHandler 对象,它可以包含数据或者另一个 Multipart 对象,因此它是一个递归的结构:

 

下面是一个 multipart 的代码示例:

 

MimeMultipart mmp = new MimeMultipart();
 
// create textual content, and add it to the bodypart object
MimeBodyPart body1 = new MimeBodyPart();
body1.setContent("<h1>Mail HTML Body Content</h1>", "text/html");
mmp.addBodyPart(body1);
 
// Create a second body part object, set text to it, This
// second object holds xml data.
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("<a>Mail XML Content</a>", "application/xml");
 
mmp.addBodyPart(body2);
 
message.setContent(mmp);

 

第一个body对象会作为邮件内容,以HTML格式呈现,第二部分内容会作一个XML格式的附件发送,附件名不定。

附件

以上介绍了一个发送附件的变通方法,但不是通常的选择。这一节里将介绍怎么用Java Mail API发送含有一个或多个附件的邮件,将以上示例中的 body2 内容作为一个实际的附件,而是上示的奇怪的方式。

首先将内容存成一个xml文件,假设文件名为: 'attach.xml',然后用以下代码添加为附件发送:

 

        ...
        MimeBodyPart body2 = new MimeBodyPart();
         
        //old one
//      body2.setContent("<a>Mail XML Content</a>", "application/xml");
         
        //new one
        FileDataSource attachment = new FileDataSource("attach.xml");
        DataHandler dh = new DataHandler(attachment);
        body2.setDataHandler(dh);
        body2.setFileName("attach.xml");
         
        mmp.addBodyPart(body2);
        ...

 

然后接收端就可以收到一个命令文件名为 'attach.xml' 的附件的邮件了。

更多...

如果连接要求 SSL 配置,则更多的设置选项需要被指定,例如 GMail的连接:

 

Properties props = System.getProperties();
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.auth", "true");
 
//more configurations
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", "465");

 

怎样使用camel-mail组件

依赖

添加以下依赖:

 

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-mail</artifactId>
    <version>2.12.2</version>
</dependency>

URI 格式

 

smtp://[username@]host[:port][?options]
 

 

或者是带安全的连接:

smtps://[username@]host[:port][?options]

缺省 Ports

 

Protocol

Default Port Number

SMTP

25

SMTPS

465

选项

下面是一些基础选项,更多的可以看 http://camel.apache.org/mail.html :

Property

Default

Description

host

 

The host name or IP address to connect to.

port

See DefaultPorts

The TCP port number to connect on.

username

 

The user name on the email server.

password

null

The password on the email server.

contentType

text/plain

The mail message content type. Use text/html for HTML mails.

to

username@host

The TO recipients (the receivers of the mail). Separate multiple email addresses with a comma.

replyTo

alias@host

As of Camel 2.8.4, 2.9.1+, the Reply-To recipients (the receivers of the response mail). Separate multiple email addresses with a comma.

CC

null

The CC recipients (the receivers of the mail). Separate multiple email addresses with a comma.

BCC

null

The BCC recipients (the receivers of the mail). Separate multiple email addresses with a comma.

from

camel@localhost

The FROM email address.

subject

 

As of Camel 2.3, the Subject of the message being sent. Note: Setting the subject in the header takes precedence over this option.

connectionTimeout

30000

The connection timeout in milliseconds. Default is 30 seconds.

根据介绍,基本可以理解这些选项的意义和用法。

示例

下面是一些用camel-mail组件展示如何发送邮件的例子。

发送文本

 

from("timer:foo?repeatCount=1")
        .setBody(constant("MailBody")) //set mail body
        .to(
                "smtp:"      //protocol, required
                + "//"       
                + "host"    //host, required, change as your case
                + ":"
                + "port"    //port, has default value, change as your case
                + "?"
                + "from=from"     //from, default is camel@localhost, change as your case
                + "&"
                + "username=from" //username, required , change as your case
                + "&"
                + "password=password" //password, required , change as your case
                + "&"
                + "subject=MailSubject"  //mail subject
                + "&"
                + "to=to"             //to, required, change as your case
                );

 

邮件的内容来自camel route的exchange的body。

Content-Type

默认的 Content-Type 为 text/plain,因此接收到文件内容就是纯文本的,没有任何修饰的,例如<b>MailBody</b>,如果想把它变成一个 HTML 格式的,则需要指定 Content-Type 为 text/html,例如:

from("timer:foo?repeatCount=1")
        .setBody(constant("<b>MailBody</b>"))//set body
        .to(
                "smtp:"         //protocol, required
                + "//"       
                + "host"         //host, required, change as your case
                + ":"
                + "port"        //port, has default value, change as your case
                + "?"
                + "from=from"   //from, default is camel@localhost, change as your case
                + "&"
                + "username=username" //username, required , change as your case
                + "&"
                + "password=password"  //password, required , change as your case
                + "&"
                + "subject=MailSubject"               //mail subject
                + "&"
                + "to=to"             //to, required, change as your case
                + "&"
                + "contentType=text/html"         //specify content-type
                );

 

现在邮件内容会以HTML格式呈现:MailBody

附件

按我的了解,好像没有简单的选项可以指定附件,方法之一就是使用Bean或者是Processor去指定附件,例如:

from("timer:foo?repeatCount=1").process(new Processor() {
     public void process(Exchange exchange) throws Exception {
       exchange.getIn().setBody(constant("<h1>Mail HTML Body Content</h1>"));//set Body
               exchange.getIn().addAttachment("attach.xml", new DataHandler(new FileDataSource("attach.xml")));    //Add attachment
                                 
         }
}).to("smtp://...");
分享到:
评论

相关推荐

    camel-java-http

    "camel-java-http" 示例是关于如何使用Camel与Java进行HTTP通信的一个项目。 首先,我们来深入理解"camel-http"组件。Apache Camel 的 HTTP 组件允许你通过HTTP/HTTPS 协议发送请求到远程服务器,或者作为一个HTTP...

    ApacheCamel-JDBC

    通过学习和实践"Apache Camel-JDBC",开发者可以更好地利用Camel的灵活性和JDBC的数据库操作能力,构建出高效且可扩展的集成解决方案。提供的代码样例Demo将帮助我们理解如何在实际项目中应用这些概念,从而提升...

    camel-restlet-spring-web-app

    标题 "camel-restlet-spring-web-app" 暗示了一个基于Apache Camel、Restlet和Spring Web的应用程序示例,该示例使用Jetty作为嵌入式服务器。这个项目结合了这些技术来创建一个RESTful API服务。让我们深入探讨每个...

    apache-camel-2.10.0-src.zip

    这个"apache-camel-2.10.0-src.zip"文件是Apache Camel 2.10.0版本的源代码包,对于开发者来说,它是深入理解Camel工作原理、自定义组件或调试问题的重要资源。 1. **Apache Camel 概述**: Apache Camel 是基于...

    apache-camel-1.6.0.tar.gz

    在 "apache-camel-1.6.0" 这个压缩包中,你可能会找到以下组件和文件结构: 1. **bin**: 这个目录通常包含可执行脚本,用于启动和管理Camel上下文。这些脚本可以在不同的操作系统上运行,如Linux、Windows或Mac。 ...

    camel-core-2.13.2.jar

    camel-core-2.13.2 java 开发FTP上传下载时用到的工具类。

    apache-camel-1.6.3.tar.gz

    总结起来,"apache-camel-1.6.3.tar.gz"是一个包含Apache Camel 1.6.3版本源码、文档和依赖的压缩包,适用于集成和路由任务,提供了丰富的组件和强大的路由规则定义能力,为开发人员构建企业级应用提供了有力的支持...

    camel-manual-2.10.4.pdf

    它提供了一种灵活的方式来定义路由和调解规则,支持多种特定领域的语言,包括基于Java的Fluent API、Spring或Blueprint XML配置文件以及Scala DSL。这意味着无论是在Java、Scala还是XML编辑器中,都能在IDE中实现...

    apache-camel-1.3.0.tar.gz

    这使得开发者能够通过简单的DSL(领域特定语言)或者Java API来构建数据路由和转换逻辑。1.3.0版本可能包含以下特性: 1. **组件支持**:Camel提供了丰富的组件库,例如用于处理文件系统的File组件,处理HTTP请求的...

    camel-ftp-2.13.2.jar

    camel-ftp-2.13.2 java开发FTP上传下载的工具类

    apache-camel-2.7.5.zip

    此压缩包"apache-camel-2.7.5.zip"包含了Apache Camel 2.7.5版本的相关组件和资源。 Apache Camel 的核心概念是路由规则,这些规则定义了如何从一个源头获取数据,如何处理这些数据,以及如何将处理后的数据传递到...

    使用CXF和camel-cxf调用webservice

    Apache CXF和camel-cxf是两个流行的开源框架,它们可以帮助开发者轻松地创建、消费和集成Web服务。本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个...

    apache-camel-2.0-M2.tar.gz

    3. **camel-api**:定义了Camel的公共接口和类,供其他模块使用。 4. **camel-spring**:如果包含,这将支持Spring框架集成,使得在Spring应用中使用Camel变得简单。 5. **camel-test**:测试相关的类和API,帮助...

    05-ApacheCamel-CXF-WebService

    本项目"05-ApacheCamel-CXF-WebService"主要探讨了如何将Apache Camel与Apache CXF整合,以实现高效的服务消费和提供。 在项目中,"05-ApacheCamel-CXF-WebService-Client"这部分内容可能是客户端的应用,用于调用...

    camel-archetype-java-2.8.3.jar

    jar包,亲测可用

    camel-archetype-java-2.8.2.jar

    jar包,亲测可用

    camel-archetype-java-2.7.1.jar

    jar包,亲测可用

    apache-camel-2.6.0.zip

    3. **camel-api**: 提供了Camel的公共API,供开发者在自定义组件或与Camel交互时使用。 4. **camel-test**: 用于测试Camel路由的工具和支持库。 5. **docs**: 可能包含用户指南、API文档等,帮助开发者理解和使用...

    camel-hbase-2.10.0-sources.jar

    jar包,亲测可用

    apache-camel-2.7.3-src.tar.gz

    - `camel-core`:基础组件,包含路由引擎和核心 API。 - `camel-component`:各组件的实现,如 HTTP、JMS、FTP 等。 - `camel-test`:用于测试 Camel 路由的工具和类库。 - `camel-spring`:与 Spring 框架的...

Global site tag (gtag.js) - Google Analytics