邮件服务

邮件开发最终都推荐使用commons-email;

 

文档-javamail发送邮件

 

一个简单的纯文本邮件

咱第一个例子是创建一个简单的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".

发送带附件的邮件

得用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();

发送带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方法。

发送带嵌入图片的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邮件模板。所有涉及的图片都会在当前目录里自动转化为内联图片。

 

调试

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

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

 

认证

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

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

 

安全

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

通常有以下两个可选项:

  • 通过25端口的STARTTLS方式
  • 通过465端口的SSL方式

下面是wiki百科上的定义:

  • STARTTLS是一个纯文本的通信协议,它提供了一个纯文本连接的方式来升级到一个加密(TLS或SSL)连接,而不是使用单独的端口进行加密通信的扩展。
  • 传输层安全性(TLS)和安全套接字层(SSL),其前身是加密协议,提供通信安全的Internet.TLS和SSL加密,在传输层之上的网络连接段,使用非对称加密的密钥交换,对称加密隐私,消息完整性和消息认证码。

此外,你还可以强制进行以下的安全检查(默认情况下是禁用的)

  • 当使用安全的传输(STARTTLS或SSL)时,你可以通过设置Email.setSSLCheckServerIdentity(true)强制验证服务器的证书。但这在任何我测试过的服务器上好像都没有作用(GMAIL,GMX)。
  • 通过设置Email.setStartTLSRequired(true)强制使用STARTTLS。

退回邮件处理

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

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

 

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

1、自己搭建邮件服务器:

     1)、将压缩包解压到非中文无空格目录下

     2)、很多同学很报错;jdk1.7---1.8

               因为有一个jar包冲突;

               把jaxb-impl-2.1.3.jar复制在james的conf/lib目录下

 

     3)、不要关闭run以后的窗口

2、操作一些命令设置服务器

     (设置服务器的域名,给服务器中设置用户名密码)

     其实james服务器也是将所有数据存在数据库中,默认自带的;

     2.1)、可以让james将数据保存在mysql中;需要将mysql的驱动放在对应目录下

     有两个jar的lib目录;

          james/lib:存放james默认的jar

          james/conf/lib:存放我们自己导入的jar

     2.2)、修改james配置数据库的配置文件;james-database-template.properties

     2.3)、-template后缀的只是一个参照的配置模板

          

     2.4)、我们要让那个配置生效需要做一个没有-template的文件

 

 

几个问题;

1、james只能命令行添加用户?;

adduser。。。。

可以自己编写web界面来实现web注册;注册的用户保存到数据库中,注意:和james用同一个加密算法

联网状态下

2、163邮箱能给admin@atguigu.com发邮件吗?

3、admin@atguigu.com能给163发邮件吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值