当前位置: 移动技术网 > IT编程>开发语言>Java > Java中使用JavaMail多发邮件及邮件的验证和附件实现

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

多发和用户验证
下面先来介绍如何实现将邮件发送给多个收件人和如何利用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); 
  } 
 
} 

 

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

201622384926751.jpg (418×451)

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

201622385027101.jpg (568×270)

alternative:选择关系。上面的纯文本和超文本之间就是一种选择关系。
        related:关联关系。假如上面的超文本正文是展示一幅图片,那么我们在发送邮件的时候必须要将这幅图片包含到邮件中,也就是所谓的内嵌资源,这个内嵌资源是给超文本用的。所以他们两者之间是一个关联关系。
        mixed:混合关系。在纯文本、超文本和内嵌资源组成一个整体和,他们与附件并列着,两者之间就是一个混合关系了。
 
        复合邮件组织结构的api:

201622385127929.jpg (612×458)

  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); 
  } 
 
} 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网