简介
前一段时间因为在项目中要实现一个用java发送邮件的功能,针对具体的实现情况,包含有专门搭建邮件服务器和配置邮件发送信息以及模板组织等若干个步骤。整个的功能实现比较简单,不过对于怎么在工程中用好他们,还是有必要的好好总结一下。
邮件发送基础
在讨论发送具体邮件信息之前,我们先讨论一下邮件发送的一些基本概念。在很多情况下,我们发送邮件的时候,都是通过手动配置邮件客户端让它们连接到邮件服务器或者直接登录到一些网站查看邮件。实际上,他们无非是对应两种连接邮件服务器的客户端而已,一种是单机版的,一种是web版的。他们的本质还是所有发送的邮件消息提交给邮件服务器,再由邮件服务器转发到目的地。
结合我们发送邮件的步骤,我们连接到邮件服务器并发送邮件的过程无非是以下几个步骤:
1. 连接邮件服务器,身份验证。
2. 选择或者设置收件人,主题和邮件内容等。
3. 选择发送邮件,邮件服务器将内容转发。
另外一个就是,我们发送的邮件有多种协议,它们还分别对应不同的端口。比如如下是几个典型的邮件协议和对应的端口:
协议名 | 端口号 |
POP3 | 110 |
SMTP | 25 |
NNTP | 119 |
在实际的应用中,它们的端口可能会根据需要进行调整。
在我们的很多实际应用中,一般很少会需要直接配置邮件服务器,而是直接使用这些邮件服务器。尤其是对于许多免费的服务器来说,针对他们开放的端口和协议我们可以通过使用程序来实现和它们的交互,实现收发邮件。在讨论具体怎么配置邮件服务器之前,我们先讨论一下邮件发送的几种方式。
邮件发送的几种方式
我们需要发送邮件的程序一般引用了javax.mail.jar包,这个包可以在如下的链接里找到。常用的邮件发送方式主要有TLS, SSL和default这几种。他们的主要差别在于TLS和SSL都是通过加密的方式进行数据通信,而default的则是没有加密的。所以默认的方式在大多数情况下都被禁用了。
TLS
我们先看看一个TLS通信的简单示例,以gmail账户为例。假定我们有一个gmail的帐号,希望使用程序通过它发送邮件到一个指定的目的邮件地址。我们首先需要看一下gmail邮件服务器的相关设置信息:
配置项 | 具体值 |
mail.smtp.auth | true |
mail.smtp.starttls.enable | true |
mail.smtp.host | smtp.gmail.com |
mail.smtp.port | 587 |
有了前面这些配置的信息,我们可以通过它们来和gmail邮件服务器通信。首先一个前面的这些内容将作为一个配置项传入给gmail smtp server。在我们的具体实现里可以将这部分写到一个配置文件里,然后读取出来,也可以手动的设置。
手动设置的代码如下:
Properties props = new Properties(); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.host", "smtp.gmail.com"); props.put("mail.smtp.port", "587");
设置好这些属性之后下一步就是建立一个和邮件服务器连接的session了。采用这种方式需要提供用户名和密码信息。比如说我们已经有的gmail帐号为user@gmail.com, 密码为password。
那么建立session连接的代码如下:
Session session = Session.getInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } });
设置好session之后的下一步就是设置我们需要发送的邮件内容等信息:
Message message = new MimeMessage(session); message.setFrom(new InternetAddress(username)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("newuser@gmail.com")); message.setSubject("Testing Subject"); message.setText("Dear user," + "\n\n No spam to my email, please!"); Transport.send(message);
我们设定收件人的邮件地址为newuser@gmail.com,邮件的主题为Testing Subject。真正实现发送邮件的这部分代码是Transport.send(),它将最后组装成的邮件字符串发送出去。
SSL
SSL的发送方式其实和TLS大致相同,首先也是设置邮件发送的配置项,只是因为采用的协议和端口不一样,具体认证的方式也有差别。这里session的创建方式如下:
Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("abc@163.com","abc"); } });
其他的代码基本上都是一样的,具体细节可以看附件里代码的详细实现。
除了上述的两种方式,还有一种默认的邮件发送方式,因为它不是采用的通信加密,在一些本地局域网的测试环境里可能会用到。和前面的代码里主要的区别就在于它的创建session的方式很简单,一般不需要做任何身份验证,典型的代码实现如下:
Session session = Session.getDefaultInstance(props);
这里的props就是环境的基本配置项,典型的如下:
mail.smtp.auth=false mail.smtp.starttls.enable=false mail.smtp.port=25 mail.smtp.host=localhost username= password=
环境安装和配置
这里主要用到java邮件服务器james。其实我们可以使用的邮件服务器很多,比如postfix, sendmail。主要是james的安装配置比较简单。它的配置主要就以下几个步骤:
1. 安装jdk和jre
2. 安装james server并配置默认server名字等信息。
安装james server比较简单,直接到官网下载整个的zip包到本地,然后解压就可以了。
解压到本地之后,到本地目录的/james-2.3.2/apps/james/SAR-INF下面,打开config.xml文件。在这里配置邮箱的域名和服务器的名字。
<config> <James> <postmaster>support@abc.com</postmaster> <servernames autodetect="true" autodetectIP="true"> <servername>abc.com</servername> </servernames> <James> <config>
3. 配置环境变量JAVA_HOME
将java安装环境的变量配置好,这个部分不同的系统和平台不一样,都可以参考网上的流程。
4. 启动James server
在linux环境下启动james server的时候需要注意,因为考虑到发送邮件访问的权限。这里需要切换到具有管理员权限的帐号下然后再启动它们。
启动的命令如下:./bin/run.sh
启动后的界面如下图:
邮件内容组织
我们从前面的代码内容里可以看到,javamail里发送的最后都是字符串。可是在我们实际发送的邮件里,可以包含有文件各种格式定义,甚至很多html的元素,这是怎么做到的呢?实际上这些是和做web应用的思想很类似。我们常用的web框架强调的是各种关注点分离,所以才有了MVC的结构思想。在邮件内容的输出里,我们也可以实现一种分离。我们将邮件需要发送的内容和内容组织的形式进行分离。这样,我们只需要在代码里将要显示的内容发送给模板,而在模板的组织里具体实现怎么来显示这些内容。
同时,为了实现对我们定义的这种类型格式的支持,我们需要在发送的email message里设置一下:
message.setContent(content, "text/html")
我们常用的一个实现这种内容和组织形式的分离的工具就是velocity。我们可以在如下链接中下载它。
我们实现模板解析的代码如下:
public String prepareMessage(MessagePayload payload, String templatePath) { if(payload == null || StringUtil.isNullOrEmpty(templatePath)) { throw new IllegalArgumentException("Invalid payload or template path."); } VelocityEngine engine = new VelocityEngine(); engine.init(); VelocityContext context = new VelocityContext(); context.put("payload", payload); Template t = engine.getTemplate(templatePath); StringWriter writer = new StringWriter(); t.merge( context, writer ); return writer.toString(); }
大家可以看到,在这部分代码里,无非就是将我们传入的MessagePayload对象揉合到模板中,并返回最终的字符串。那么这些我们传入的对象是怎么在模板里被处理的呢?我们来看看模板里的具体内容:
<html> <head> <title>Order Candy Service</title> </head> <body> <p>User $payload.getUserId() has successfully requested to order the stuff: #set($mpcInstance = $payload.getInstancePayload()) #if(!$payload.isOrderForSelf()) for user: $payload.getCustName() #end with the following information:<p> Account Name: $payload.getAcctName() <br> Instance Name: $mpcInstance.getName() <br> #set($candyNumber = $mpcInstance.getCandies().size() / 10.0) Number of Candies: $candyNumber <br> <p>Best regards.<br> Candy Shop Team<br> </body> </html>
除了那些常用的html元素,我们看到了一些类似于常用编程语言的元素,比如#if, #set等。这些都是velocity里支持的模板语言。所以如果我们传入的是一个个的java对象,它也能够解析,就像我们使用普通的java对象一样。这样关于怎么判断和组织内容就通过这个模板语言解决了。如果使用过其他编程语言的web框架的,比如python之类的,对于这些东西应该就不会陌生了。
总结
一个发送邮件的功能一般包含有配置邮件发送的协议,端口,邮件的发件人,收件人以及邮件内容等。如果我们希望能够很好的组织起来每个部分,需要针对每个不同的需求选择最合适的工具,这样对于长期的管理和维护来说也省了很多事。
参考材料
http://james.apache.org/server/
http://www.ibm.com/developerworks/library/j-james1/
http://velocity.apache.org/
相关推荐
下面是一个简单的Java发送邮件的示例代码: ```java import javax.mail.*; import javax.mail.internet.*; public class EmailApp { public static void main(String[] args) { // 配置SMTP服务器属性 ...
首先,`java发送邮件示例`涉及到的主要技术是JavaMail API,这是一个开源的Java库,用于处理电子邮件。它允许开发者通过SMTP(简单邮件传输协议)或其他邮件传输协议发送邮件,同时也能处理接收邮件。JavaMail API...
java发送邮件示例源码,支持html格式邮件,接收人,邮件主题,邮件内容,附件路径 #邮件 spring.mail.default-encoding=utf-8 # 配置SMTP服务器地址 spring.mail.host=smtp.qq.com #发送方邮件名 spring.mail....
Java发送邮件是软件开发中的一个常见任务,尤其在企业级应用和自动化通知系统中非常普遍。下面我们将深入探讨如何使用Java来实现邮件的发送,并基于提供的"java发送邮件示例代码"这一标题和描述,结合"java 软件/...
下面是一个简单的Java发送邮件的示例代码: ```java import javax.mail.*; import javax.mail.internet.*; public class EmailSender { public static void main(String[] args) { String from = "your-email@...
本示例将详细介绍如何在Java中使用模板发送邮件,以及相关的知识点。 首先,你需要了解JavaMail API。这是一个开放源码的库,用于处理邮件协议,如SMTP(简单邮件传输协议)。要使用JavaMail,需要在项目中引入相应...
总之,Java发送邮件功能是Java开发中的一个实用技能,通过JavaMail API,开发者能够灵活地构建各种邮件功能,满足不同的业务需求。无论是简单的文本邮件还是包含附件的复杂邮件,都能轻松应对。
首先,Java邮件发送主要依赖于JavaMail API,它是一个开放源代码的API,允许开发者在Java应用程序中处理邮件。要使用JavaMail,你需要引入相关的jar文件,如`javax.mail.jar`和`activation.jar`。在现代项目中,通常...
在这个示例中,我们创建了一个`EmailSender`类,其中的`sendEmail`方法负责设置邮件属性并发送邮件。我们使用`Properties`对象配置SMTP服务器信息,如主机名、端口、是否需要身份验证以及是否启用TLS。`Session`对象...
Java发送邮件是软件开发中常见的需求,特别是在自动化通知、用户验证和客户服务等方面。在这个主题下,我们将探讨三种Java实现邮件发送的方式,以及如何通过提供的代码和参考资料进行实践。 首先,让我们了解一下...
首先,Java发送邮件主要依赖于JavaMail API,这是一个开源的Java库,它提供了标准的JavaMail API规范,允许开发者发送、接收和处理邮件。在发送Outlook邮件时,我们通常不是直接与Outlook交互,而是使用SMTP(Simple...
以下是一个简单的示例代码,展示如何使用Java发送邮件: ```java import javax.mail.*; import javax.mail.internet.*; public class EmailSender { public static void main(String[] args) throws Exception { ...
总结来说,Java发送邮件涉及以下关键知识点: 1. JavaMail API的使用,包括`javax.mail`和`javax.mail.internet`包。 2. 配置SMTP服务器的参数,如主机名、端口、安全协议等。 3. 使用`Session`进行会话初始化和...
这个"Java发送邮件_单附件_多附件_加抄送多人 _2个示例zip"的资源包含两个核心类:EmailManager.java和AnnexMailService.java,它们提供了一个强大的邮件发送功能,支持单个或多个附件,以及添加抄送人。下面将详细...
Java发送邮件是一个常见的任务,尤其在自动化通知、订阅服务或者数据传输中。在这个实例中,我们将探讨如何使用Java来发送电子邮件,重点在于SMTP(Simple Mail Transfer Protocol)服务的使用。 首先,我们需要...
下面是一个简单的Java邮件发送示例,展示如何使用JavaMail API发送邮件: ```java import javax.mail.*; import javax.mail.internet.*; public class SimpleJavaMail { public static void main(String[] args)...
myMailWeb.zip java邮件发送示例
这个【标题】"Java 通过代码发送邮件示例源码"指的是使用JavaMail API实现的邮件发送功能。现在我们将详细讨论如何利用JavaMail API发送邮件,并解释提供的`Main.java`文件可能包含的内容。 首先,为了使用JavaMail...
下面是一个简单的JavaMail发送邮件的示例代码,使用163邮箱作为发送方: ```java import javax.mail.*; import javax.mail.internet.*; public class EmailSender { public static void main(String[] args) { /...