Commons-Email 收发邮件 已翻译 100%

Sunshine007 投递于 2013/08/06 14:34 (共 8 段, 翻译完成于 08-09)
阅读 7306
收藏 8
2
加载中

一个简单的纯文本邮件

咱第一个例子是创建一个简单的email,并通过Google Mail(GMail)账号把发给"John Doe"。

Email email = new SimpleEmail();
email.setHostName("smtp.googlemail.com");
email.setSmtpPort(465);
email.setAuthenticator(new DefaultAuthenticator("username", "password"));
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();
setHostName("mail.myserver.com")是设置SMTP服务器。如果不设置,默认是"mail.host".
yale8848
翻译于 2013/08/08 22:55
2

发送带附件的邮件

得用MultiPartEmail 类来给邮件添加附件。除过覆盖attach()方法来给邮件添加附件外,这个类就和SimpleEmail类差不多。对于内联或是加入附件的个数是没有限制的。但附件必须是MIME编码。

最简单的添加附件的方式是用 EmailAttachment类。

下面的例子是将图片作为邮件的附件,并发送出去。

import org.apache.commons.mail.*;
...

  // Create the attachment
  EmailAttachment attachment = new EmailAttachment();
  attachment.setPath("mypictures/john.jpg");
  attachment.setDisposition(EmailAttachment.ATTACHMENT);
  attachment.setDescription("Picture of John");
  attachment.setName("John");

  // Create the email message
  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 picture");
  email.setMsg("Here is the picture you wanted");

  // add the attachment
  email.attach(attachment);

  // send the email
  email.send();

如果你没有本地文件,你可以用 EmailAttachment 添加任何可用的URL。当邮件发送后,文件会自动加载并加入到邮件内容。

下面的例子是将Apache logo图片发给John。

import org.apache.commons.mail.*;
...

  // Create the attachment
  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");

  // Create the email message
  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");
  
  // add the attachment
  email.attach(attachment);

  // send the email
  email.send();
yale8848
翻译于 2013/08/08 23:09
2

发送带HTML格式的邮件

发送HTML格式的邮件可用很成熟的HtmlEmail类。这个类和MultiPartEmail差不多,就是增加了设置HTML内容的方法,对于不兼容THML文本和内联图片的邮件,它会将HTML转化为文本。

下面的例子就是发送带内联图片HTML格式的邮件。

import org.apache.commons.mail.HtmlEmail;
...

  // Create the email message
  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");
  
  // embed the image and get the content id
  URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
  String cid = email.embed(url, "Apache logo");
  
  // set the html message
  email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>");

  // set the alternative message
  email.setTextMsg("Your email client does not support HTML messages");

  // send the email
  email.send();

请注意, embed方法返回的是字串。这个字串是随机生成的标识,将来用到图片标签里。

接下来没有调用HtmlEmail类的setMsg方法,因为如果HTML内容里有内联图片的话,这个方法是不能用的。这样我们可以用setHtmlMsg和setTextMsg方法。

yale8848
翻译于 2013/08/08 23:22
1

发送带嵌入图片的HTML文本

前面讲过如何创建带嵌入图片的HTML邮件,但是你得知道用HTML邮件模板来处理图片是很麻烦的。ImageHtmlEmail类能解决这个问题,它能很方便的让你将所有外部图片转化为内联图片。

import org.apache.commons.mail.HtmlEmail;
...

  // load your HTML email template
  String htmlEmailTemplate = ....

  // define you base URL to resolve relative resource locations
  URL url = new URL("http://www.apache.org");

  // create the email message
  HtmlEmail email = new ImageHtmlEmail();
  email.setDataSourceResolver(new DataSourceResolverImpl(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");
  
  // set the html message
  email.setHtmlMsg(htmlEmailTemplate);

  // set the alternative message
  email.setTextMsg("Your email client does not support HTML messages");

  // send the email
  email.send();
首先我们创建了带图片的HTML邮件模板。所有涉及的图片都会在当前目录里自动转化为内联图片。
yale8848
翻译于 2013/08/08 23:29
1

调试

JavaMail API支持调试选项,通过调用setDebug(true)来开启调试。调试信息会通过System.out打印出来。

有时你会关心commons-email的安全设置的特性。可以用EmailLiveTest和EmailConfiguration类在真正的SMTP服务器上测试commons-email.

yale8848
翻译于 2013/08/08 23:35
1

认证

如果你要对SMTP服务器进行认证,可以在发邮件前调用setAuthentication(userName,password)方法测试。这将会在JavaMail API发送邮件时创建DefaultAuthenticator实例,要支持此方法得让你的服务器支持RFC255协议。

你可以用javax.mail.Authenticator的子类来完成更加复杂的认证,如弹出个对话框等。当你想收集并处理用户信息时,你必须覆盖getPasswordAuthentication()方法。用Email.setAuthenticator方法可以创建新的Authenticator类。

yale8848
翻译于 2013/08/08 23:43
2

安全

如今,在使用公共邮件服务器的时候你不应该使用普通的SMTP代理,但是可选项对大家来说还是有些不熟悉。

通常有以下两个可选项:

  • 通过25端口的STARTTLS方式
  • 通过465端口的SSL方式
下面是wiki百科上的定义:
  • STARTTLS一个纯文本通信协议,它提供了一个纯文本连接的方式来升级到一个加密TLS或SSL连接,而不是使用单独的端口进行加密通信扩展
  • 传输层安全性(TLS)和安全套接字层(SSL其前身是加密协议提供通信安全Internet.TLSSSL加密在传输层之上网络连接使用非对称加密密钥交换,对称加密隐私,消息完整性和消息认证
此外,你还可以强制进行以下的安全检查(默认情况下是禁用的)
  • 当使用安全的传输(STARTTLSSSL)时你可以通过设置Email.setSSLCheckServerIdentity(true)强制验证服务器的证书这在任何我测试过的服务器上好像都没有作用(GMAILGMX
  • 通过设置Email.setStartTLSRequired(true)强制使用STARTTLS。
bigtiger02
翻译于 2013/08/09 18:00
1

退回邮件处理

通常情况下,不能投递给收件者的邮件将会退回给发件人(从属性指定)。然而,在某些情况下,你会希望这些被发送到不同的地址。要做到这一点,只需调用setBounceAddress(emailAddressString)方法设置电子邮件地址,然后发送电子邮件。

技术说明:当SMTP服务器不能投递邮件时,它们根本不关心那些决定错误应该发送去哪的消息的内容。相反,他们使用是SMTP“信件发件人”中的值。JavaMail通过JavaMailSession的mail.smtp.from属性来设置这个值(普通邮件是使用System.getProperties()来初始化JavaMailSession 的)。如果这个值没有被设置,JavaMail将会使用“发件人”地址。如果你的邮件设置回退邮件地址属性集合,普通邮件将会使用这个值来覆盖Session初始化时的mail.smtp.from属性的值。

注意:这是控制处理退回邮件的唯一方式。具体来说,“Errors-to”这个SMTP头已经被废弃,不能被用来进行退回邮件处理。另外请注意,用一个不受信任的邮件地址发邮件也被认为是不好的做法,除非你还可以设置退回地址。如果你的应用允许用户输入一个地址用作发件人”地址,回退地址一定要设置一个已知好的邮件地址。

bigtiger02
翻译于 2013/08/09 18:18
1
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
加载中

评论(5)

大弟是也

引用来自“java我人生”的评论

你好我直接用HtmlEmail,亲自测试,QQ,新浪,搜狐等邮箱可以直接用src="http://www.ss."内联图片,只要用setMsgHtml()即可,反而用了ImageHtmlEmail这样就就不行了
其实无论发送的图片是本地还是网络的都是可以用ImageHtmlEmail一次发送的。http://blog.csdn.net/dadiyang/article/details/52352632 这里有教程。关键是email.setDataSourceResolver(); 里用哪个DataSourceResolver
java我人生
java我人生
你好我直接用HtmlEmail,亲自测试,QQ,新浪,搜狐等邮箱可以直接用src="http://www.ss."内联图片,只要用setMsgHtml()即可,反而用了ImageHtmlEmail这样就就不行了
Tom-Lin
Tom-Lin

引用来自“Tom-Lin”的评论

大家有没有试过,上面第“发送带嵌入图片的HTML文本”节中的第 12 行代码:email.setDataSourceResolver(new DataSourceResolverImpl(url));
根本无法通过编译。我下载了当前最新的 commons-email-1.3.2.jar,都编译通不过。

正确的需要把第 11、12 行的代码改为即可:
ImageHtmlEmail email = new ImageHtmlEmail();
email.setDataSourceResolver(new DataSourceUrlResolver(url));
Tom-Lin
Tom-Lin
标题应改为“使用 Commons-Email 发送邮件”,这个标题并不存在“收”的意思,只能发
@红薯
Tom-Lin
Tom-Lin
大家有没有试过,上面第“发送带嵌入图片的HTML文本”节中的第 12 行代码:email.setDataSourceResolver(new DataSourceResolverImpl(url));
根本无法通过编译。我下载了当前最新的 commons-email-1.3.2.jar,都编译通不过。
返回顶部
顶部