Java中使用JavaMail多发邮件及邮件的验证和附件实现

多发和用户验证

下面先来介绍如何实现将邮件发送给多个收件人和如何利用Authenticators对象实现用户验证。  

指定收件人的时候,我们可以有两种方法来指定。上篇博客是在发送邮件的时候临时指定收件人,其实还可以在Message对象中指定。

message.addRecipient(Message.RecipientType.TO,new InternetAddress(” 995812509@99.com ”));

         这个只是发送给一个收件人而言,但是有多个收件人如何处理?同样有两种方法来处理。

          1、在发送邮件时Transport的sendMessage()方法指定收件人时是使用数组来指定收件人的,这个时候我们只需要多添加收件人地址即可完成。

          2、在使用Message对象来添加收件人我们可以使用InternetAddress对象的parse(String string)方法,该方法返回的是InternetAddress数组,这样同样可以实现发送给多个收件人。

 

         我们知道在进行JavaMail开发时我们必须要进行授权校验,授权校验目的是阻止他人任意乱发邮件,减少垃圾邮件的产生。

我们可以在获取Session对象的时候进行校验。在Session对象中有这两个方法:

  • getDefaultInstance(prop,authenticator),
  • getInstance(prop,authenticator),

这两个方法都有一个共同的参数authenticator,该参数是一个Authenticator对象。Authenticator对象就是帮助用户进行信息验证的,完成授权校验。Authenticator对象中有getPasswordAuthentication()方法,该方法返回返回一个PasswordAuthentication对象,PasswordAuthentication对象中有两个方法:getPassword()、getUserName()也就说我们将password、userName封装在PasswordAuthentication对象,通过这两个方法就可以获取用户名和密码了。即可完成用户信息验证。

 实例如下:

public class JavaMail_02 {

public static void main(String[] args) throws Exception {

Properties props = new Properties();

props.setProperty("mail.smtp.auth", "true");

props.setProperty("mail.transport.protocol", "smtp");

props.setProperty("mail.host", "smtp.163.com");

Session session = Session.getInstance(props,

new Authenticator(){

protected PasswordAuthentication getPasswordAuthentication(){

return new PasswordAuthentication("********","*********");

}

});

session.setDebug(true);

Message msg = new MimeMessage(session);

msg.setFrom(new InternetAddress("chenssy995812509@163.com"));

msg.setSubject("JavaMail测试程序...");

msg.setContent("<span style='color:red'>这是我的第二个javaMail测试程序....</span>", "text/html;charset=gbk");

//msg.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("1111@@qq.com"),new InternetAddress("2222@qq.cpm")});

msg.setRecipients(RecipientType.TO, InternetAddress.parse("995812509@qq.com,1247723213@qq.com"));

Transport.send(msg);

}

}

 

带有图片和附件的邮件

在实际的电子邮件中我们一般都会涉及到更加复杂电子邮件结构,例如有附件、邮件正文里面包含图片、包含歌曲等等,在这个时候我们就必须要对邮件的结构有着很清晰的认识。在进行复合邮件开发之前需要对复合邮件的结构有一定的了解。

       上面这幅图片展示了一封复合邮件的整体结构,我们可以看出一封复杂的电子邮件由多个部分组成。它有一个头部和正文,但是正文并不是像以前那么简单了,而是由几个部分组成。头部需要起到一个指示的作用,它需要说明正文需要使用什么样的分隔符来分开,正文几个部分之间使用什么样的组合关系。对于上面电子邮件它由三个部分组成,每一部分都有自己头和体,第一部分也由两个部分组成。

 

         复合邮件的组合关系:

         正文部分之间有多种组合关系。组合关系如下图:

alternative:选择关系。上面的纯文本和超文本之间就是一种选择关系。

        related:关联关系。假如上面的超文本正文是展示一幅图片,那么我们在发送邮件的时候必须要将这幅图片包含到邮件中,也就是所谓的内嵌资源,这个内嵌资源是给超文本用的。所以他们两者之间是一个关联关系。

        mixed:混合关系。在纯文本、超文本和内嵌资源组成一个整体和,他们与附件并列着,两者之间就是一个混合关系了。

 

        复合邮件组织结构的API:

  MimeMessage类表示整封电子邮件。

        MimeBodyPart类表示邮件的一个MiME消息。

        MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。

 

        下面一个实例:该邮件里面包含两个附件、正文部分包括纯文本和超文本,超文本表示展示一张图片。源代码如下:

public class JavaMail_03 {

public static void main(String[] args) throws Exception {

Properties props = new Properties();

props.setProperty("mail.smtp.auth", "true");

props.setProperty("mail.transport.protocol", "smtp");

props.setProperty("mail.host", "smtp.163.com");

Session session = Session.getInstance(props,

new Authenticator(){

protected PasswordAuthentication getPasswordAuthentication(){

return new PasswordAuthentication("*****","******");

}

});

Message message = new MimeMessage(session);

message.setSubject("第三个JavaMail测试程序");

message.setFrom(new InternetAddress("\""+MimeUtility.encodeText("陈明")+"\"<chenssy995812509@163.com>"));

message.setRecipients(RecipientType.TO, new Address[]{new InternetAddress("995812509@qq.com")});

//邮件正文

MimeMultipart multipart = new MimeMultipart("mixed");

message.setContent(multipart);

/*

* 创建邮件的内容

* 包括一个邮件正文和两个附件

*/

MimeBodyPart content = new MimeBodyPart(); //邮件内容

MimeBodyPart attch1 = new MimeBodyPart(); //附件1

MimeBodyPart attch2 = new MimeBodyPart(); //附件2

//将邮件内容添加到multipart中

multipart.addBodyPart(content);

multipart.addBodyPart(attch1);

multipart.addBodyPart(attch2);

//设置附件1

DataSource ds1 = new FileDataSource("G:\\电子书\\oracle口令.txt");

DataHandler dh1 = new DataHandler(ds1);

attch1.setDataHandler(dh1);

attch1.setFileName("oracle.txt");

//设置附件2

DataSource ds2 = new FileDataSource("G:\\电子书\\账号.txt");

DataHandler dh2 = new DataHandler(ds2);

attch2.setDataHandler(dh2);

attch2.setFileName(MimeUtility.encodeText("账号.txt"));

/*

* 设置内容(正文)---是一个复杂体

* 包括HTML正文和显示一张图片

*/

MimeMultipart bodyMultipart = new MimeMultipart("related");

content.setContent(bodyMultipart);

//构造正文

MimeBodyPart htmlBody = new MimeBodyPart();

MimeBodyPart gifBody = new MimeBodyPart();

bodyMultipart.addBodyPart(htmlBody);

bodyMultipart.addBodyPart(gifBody);

//设置图片

DataSource gifds = new FileDataSource("F:\\图片\\图片\\4.jpg");

DataHandler gifdh = new DataHandler(gifds);

gifBody.setDataHandler(gifdh);

gifBody.setHeader("Content-ID", "<"+gifds.getName()+">");

//gifBody.setHeader("Content-Location", "http://www.itcast.cn/logo.gif");

//设置HTML正文

htmlBody.setContent("<span style='color:red;font-size:16px'>这是我的第三个JavaMail测试哦!包括了附件和图片,有点儿复杂...</span><br>" +

"显示的图片<img src='cid:4.jpg'/>", "text/html;charset=UTF-8");

message.saveChanges(); //生成邮件

Transport.send(message);

}

}

以上是 Java中使用JavaMail多发邮件及邮件的验证和附件实现 的全部内容, 来源链接: utcz.com/p/208381.html

回到顶部