什么是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,作为代理来接收邮件时,需要提供以下信息:
- 协议 : SMTP 用于发送; POP3 或 IMAP 用于接收
- 主机 : 用于发送和接收邮件的服务器主机地址
- 端口 : 服务器主机上对应于上述协议的邮件收发端口
- 用户名: 用于访问以上邮件服务器的用户名
- 密码 : 用于访问以上邮件服务器的、对应于用户名的密码
同样的,当使用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);
这里多了一个From和To用来表示邮件的发送者和接收者,以上示例中,这两个值也来自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
|
|
|
|
|
|
选项
下面是一些基础选项,更多的可以看 http://camel.apache.org/mail.html :
|
Default |
Description |
|
|
The host name or IP address to connect to. |
|
See DefaultPorts |
The TCP port number to connect on. |
|
|
The user name on the email server. |
|
|
The password on the email server. |
|
|
The mail message content type. Use |
|
|
The TO recipients (the receivers of the mail). Separate multiple email addresses with a comma. |
|
|
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. |
|
|
The CC recipients (the receivers of the mail). Separate multiple email addresses with a comma. |
|
|
The BCC recipients (the receivers of the mail). Separate multiple email addresses with a comma. |
|
|
The FROM email address. |
|
|
As of Camel 2.3, the Subject of the message being sent. Note: Setting the subject in the header takes precedence over this option. |
|
|
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-http"组件。Apache Camel 的 HTTP 组件允许你通过HTTP/HTTPS 协议发送请求到远程服务器,或者作为一个HTTP...
通过学习和实践"Apache Camel-JDBC",开发者可以更好地利用Camel的灵活性和JDBC的数据库操作能力,构建出高效且可扩展的集成解决方案。提供的代码样例Demo将帮助我们理解如何在实际项目中应用这些概念,从而提升...
标题 "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版本的源代码包,对于开发者来说,它是深入理解Camel工作原理、自定义组件或调试问题的重要资源。 1. **Apache Camel 概述**: Apache Camel 是基于...
在 "apache-camel-1.6.0" 这个压缩包中,你可能会找到以下组件和文件结构: 1. **bin**: 这个目录通常包含可执行脚本,用于启动和管理Camel上下文。这些脚本可以在不同的操作系统上运行,如Linux、Windows或Mac。 ...
camel-core-2.13.2 java 开发FTP上传下载时用到的工具类。
总结起来,"apache-camel-1.6.3.tar.gz"是一个包含Apache Camel 1.6.3版本源码、文档和依赖的压缩包,适用于集成和路由任务,提供了丰富的组件和强大的路由规则定义能力,为开发人员构建企业级应用提供了有力的支持...
它提供了一种灵活的方式来定义路由和调解规则,支持多种特定领域的语言,包括基于Java的Fluent API、Spring或Blueprint XML配置文件以及Scala DSL。这意味着无论是在Java、Scala还是XML编辑器中,都能在IDE中实现...
这使得开发者能够通过简单的DSL(领域特定语言)或者Java API来构建数据路由和转换逻辑。1.3.0版本可能包含以下特性: 1. **组件支持**:Camel提供了丰富的组件库,例如用于处理文件系统的File组件,处理HTTP请求的...
camel-ftp-2.13.2 java开发FTP上传下载的工具类
此压缩包"apache-camel-2.7.5.zip"包含了Apache Camel 2.7.5版本的相关组件和资源。 Apache Camel 的核心概念是路由规则,这些规则定义了如何从一个源头获取数据,如何处理这些数据,以及如何将处理后的数据传递到...
Apache CXF和camel-cxf是两个流行的开源框架,它们可以帮助开发者轻松地创建、消费和集成Web服务。本篇文章将详细介绍如何使用CXF和camel-cxf调用Web服务,以及这两个工具的核心功能和使用场景。 Apache CXF是一个...
3. **camel-api**:定义了Camel的公共接口和类,供其他模块使用。 4. **camel-spring**:如果包含,这将支持Spring框架集成,使得在Spring应用中使用Camel变得简单。 5. **camel-test**:测试相关的类和API,帮助...
本项目"05-ApacheCamel-CXF-WebService"主要探讨了如何将Apache Camel与Apache CXF整合,以实现高效的服务消费和提供。 在项目中,"05-ApacheCamel-CXF-WebService-Client"这部分内容可能是客户端的应用,用于调用...
jar包,亲测可用
jar包,亲测可用
jar包,亲测可用
3. **camel-api**: 提供了Camel的公共API,供开发者在自定义组件或与Camel交互时使用。 4. **camel-test**: 用于测试Camel路由的工具和支持库。 5. **docs**: 可能包含用户指南、API文档等,帮助开发者理解和使用...
jar包,亲测可用
- `camel-core`:基础组件,包含路由引擎和核心 API。 - `camel-component`:各组件的实现,如 HTTP、JMS、FTP 等。 - `camel-test`:用于测试 Camel 路由的工具和类库。 - `camel-spring`:与 Spring 框架的...