Commons Email介绍
Commons Email是一个提供发送邮件的API。它是基于Java Mail API开发的项目,目的是为使用更加简单。
Commons Email官网地址:http://commons.apache.org/proper/commons-email/index.html
Commons Email下载地址:http://commons.apache.org/proper/commons-email/download_email.cgi
Commons Email当前的版本是1.4,Java5以上支持。
它根据邮件类型的不同主要提供如下几个邮件类:
- SimpleEmail - 这个类主要用于发送基本的文本内容的邮件。
- MultiPartEmail - 这个类允许你发送多部分消息的邮件。 这个类允许发送的文本消息携带内嵌的或者附加的附件内容。
- HtmlEmail - 这个类将被用于发送带有html内容的邮件.它拥有所有MultiPartEmail的功能同时允许附件能够容易的被添加。它也支持内嵌图片的内容。
- ImageHtmlEmail - 这个类将被用于发送带有html内容的邮件同时可以内嵌图片。它拥有所有HtmlEmail的功能,但变换图像为内联图像的引用。
- EmailAttachment - 它是一个简单的容器类允许非常容易的去处理附件。它被使用伴随着MultiPartEmail的HtmlEmail实例对象
发送邮件类型主要类的使用:
一个简单的文本邮件
这个例子将创建一个基本的邮件消息给“John Doe”并且发送邮件通过你的Google Mail (GMail) 账号。
Email email= newSimpleEmail();
//设置发送邮件的主机名称
email.setHostName("smtp.googlemail.com");
//设置发送邮件主机的端口号
email.setSmtpPort(465);
//设置发送邮件人的用户名和密码
email.setAuthenticator(newDefaultAuthenticator("username","password"));
//设置是否需要SSL安全连接
email.setSSLOnConnect(true);
//设置邮件发送人
email.setFrom("user@gmail.com");
//邮件主题
email.setSubject("TestMail");
//邮件内容
email.setMsg("This is a test mail ... :-)");
//设置收件人
email.addTo("foo@bar.com");
//执行邮件发送
email.send();
email.setHostName("smtp.googlemail.com");这种调用方式设置的SMTP服务器的地址被用于发送邮件使用。如何没有调用setHostName()方法,系统属性的"mail.host"将被使用。
import org.apache.commons.mail.*;
...
// 创建附件
EmailAttachment attachment= newEmailAttachment();
attachment.setPath("mypictures/john.jpg");
attachment.setDisposition(EmailAttachment.ATTACHMENT);
attachment.setDescription("Picture of John");
attachment.setName("John");
//创建邮件消息
MultiPartEmail email= newMultiPartEmail();
email.setHostName("mail.myserver.com");
email.addTo("jdoe@somewhere.org","John Doe");
email.setFrom("me@apache.org","Me");
email.setSubject("The picture");
email.setMsg("Here is the picture you wanted");
// 添加附件
email.attach(attachment);
// 发送邮件
email.send();
也可以使用EmailAttachment去引用任何一个有效的文件的URL而不使用本地文件。下面这个例子展示我们可以发送Apache Logo给某个人
import org.apache.commons.mail.*; ... // 创建网络连接文件的附件 EmailAttachment attachment = new EmailAttachment(); attachment.setURL(new URL("http://www.apache.org/images/asf_logo_wide.gif")); attachment.setDisposition(EmailAttachment.ATTACHMENT); attachment.setDescription("Apache logo"); attachment.setName("Apache logo"); // 创建邮件消息 MultiPartEmail email = new MultiPartEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@apache.org", "Me"); email.setSubject("The logo"); email.setMsg("Here is Apache's logo"); // 添加附件 email.attach(attachment); // 发送邮件 email.send();
发送HTML格式的邮件
发送Html格式的邮件是通过HtmlEmail类完成的。HtmlEmail类工作确切的像MultiPartEmail类伴随一些额外的方法去设置HTML内容,替代的文字内容如果收件人不支持HTML邮件,并添加图片。
import org.apache.commons.mail.HtmlEmail; ... // 创建邮件消息 HtmlEmail email = new HtmlEmail(); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@apache.org", "Me"); email.setSubject("Test email with inline image"); // 嵌入图片并获取内容ID URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif"); String cid = email.embed(url, "Apache logo"); // 设置HTML消息 email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>"); // 设置替代的文本内容 email.setTextMsg("Your email client does not support HTML messages"); // 发送邮件 email.send();
首先调用embed()方法返回一个字符串,这个字符串是一个随机生成的标识,这个标识必须被使用去引用在图片标签中的图片。
其次,在这个例子中没有调用setMsg()方法。这个方法可以在HTMLEmail类中调用,但是它不应该被使用如果你将正在使用嵌入图片功能。相反,setHtmlMsg()和setTextMsg()方法被使用。
发送嵌入图片的Html格式的邮件
上面的例子展示怎么去创建一个嵌入图片的HTML格式的邮件,但你需要知道所有的图像,当使用HTML电子邮件模板,这是不方便的。这个ImageHtmlEmail类将帮助你解决这个问题通过转换所有的外部图片变为内部图片。
import org.apache.commons.mail.HtmlEmail; ... // 加载HTML邮件模板 String htmlEmailTemplate = ".... <img src=\"http://www.apache.org/images/feather.gif\"> ...."; // 定义你的根URL去解决相对资源的位置问题 URL url = new URL("http://www.apache.org"); // 创建邮件消息 ImageHtmlEmail email = new ImageHtmlEmail(); email.setDataSourceResolver(new DataSourceUrlResolver(url)); email.setHostName("mail.myserver.com"); email.addTo("jdoe@somewhere.org", "John Doe"); email.setFrom("me@apache.org", "Me"); email.setSubject("Test email with inline image"); // 设置HTML消息 email.setHtmlMsg(htmlEmailTemplate); // 设置替换消息 email.setTextMsg("Your email client does not support HTML messages"); // 发送邮件 email.send();
首先我们创建一个引用一些图片的HTML邮件模板。所有的引用图片自动转变给内联图片通过指定DataSourceResolver。
调试
这个JavaMail API支持一些调试选项将是非常有用的,如果你运行出现一些问题。你能够激活调试在任何一个邮件类中,通过调用setDebug(true)。这个调试输出通过System.out输出。
有时你想尝试各种安全设置或共享电子邮件的功能。一个好的起点是测试类emaillivetest和emailconfiguration用以测试共享电子邮件与真正的SMTP服务器。
认证
如果你需要验证你的SMTP服务器,你可以调用setauthentication(用户名,密码)方法在发送电子邮件之前。这将创建一个实例的defaultauthenticator将由JavaMail API使用当电子邮件发送时。你的服务器必须支持rfc2554为了这个工作。
你可以做一个更复杂的认证方法,如显示一个对话框给用户通过创建一个javax.mail.authenticator它的子类。你将需要重写getpasswordauthentication()方法在你会处理收集用户的信息的地方。利用你的新的Authenticator类,使用email.setauthenticator方法。
现在使用公共SMTP服务器时不应该使用纯SMTP协议,但是这有一些混淆可用的选项。
两个通用的选项正在使用:
- STARTTLS on port 25
- SSL on port 465
STARTTLS是纯文本通信协议的扩展,从而提供了一种方法提升纯文本连接加密(TLS或SSL加密通信)而不是使用一个单独的端口为加密连接。
传输层安全(TLS)和它的前身,安全套接字层(SSL),是加密协议,提供通信安全的通过internet。tls和SSL加密网络连接的运输层以上的部分,使用非对称加密的密钥交换,对于隐私的对称加密、消息完整性和消息认证码。
额外的你能够强制设置安全核查:
使用一个安全的运输(STARTTLS或SSL)你可以强制通过调用电子邮件验证服务器的证书通过调用setsslcheckserveridentity(true)。
强制使用STARTTLS的电子邮件通过调用setstarttlsrequired(true)