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

 更新时间:2016年02月23日 08:53:48   转载 作者:chenssy  
这篇文章主要介绍了Java中使用Java Mail多发邮件及邮件的验证和附件实现,包括在邮件中加入图片等功能的实现讲解,需要的朋友可以参考下

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

相关文章

  • Spring中@Scheduled和HttpClient的连环坑

    Spring中@Scheduled和HttpClient的连环坑

    这篇文章主要给大家介绍了关于Spring中@Scheduled和HttpClient的连环坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Java编程redisson实现分布式锁代码示例

    Java编程redisson实现分布式锁代码示例

    这篇文章主要介绍了Java编程redisson实现分布式锁代码示例,小编觉得还是比较不错的,这里给大家分享下,供需要的朋友参考。
    2017-10-10
  • Mybatis与Ibatis的区别

    Mybatis与Ibatis的区别

    这篇文章主要介绍了Mybatis与Ibatis的区别,需要的朋友可以参考下
    2016-05-05
  • JAVA中Collections工具类sort()排序方法

    JAVA中Collections工具类sort()排序方法

    这篇文章主要介绍了JAVA中Collections工具类sort()排序方法,非常具有实用价值,需要的朋友可以参考下。
    2016-11-11
  • Java中Date与String相互转换的方法

    Java中Date与String相互转换的方法

    这篇文章主要为大家详细介绍了Java中Date与String相互转换方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 深入学习Java 热部署的知识

    深入学习Java 热部署的知识

    对于Java应用程序来说,热部署就是在运行时更新Java类文件。在基于Java的应用服务器实现热部署的过程中,类装入器扮演着重要的角色。大多数基于Java的应用服务器,包括EJB服务器和Servlet容器,都支持热部署。,需要的朋友可以参考下
    2019-06-06
  • SpringMvc @RequestParam 使用推荐使用包装类型代替包装类型

    SpringMvc @RequestParam 使用推荐使用包装类型代替包装类型

    这篇文章主要介绍了SpringMvc @RequestParam 使用推荐使用包装类型代替包装类型,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • ibatis结合oracle批量插入三种方法的测评

    ibatis结合oracle批量插入三种方法的测评

    今天小编就为大家分享一篇关于ibatis结合oracle批量插入三种方法的测评,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • Maven工程搭建spring boot+spring mvc+JPA的示例

    Maven工程搭建spring boot+spring mvc+JPA的示例

    本篇文章主要介绍了Maven工程搭建spring boot+spring mvc+JPA的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • swing组件JScrollPane滚动条实例代码

    swing组件JScrollPane滚动条实例代码

    这篇文章主要介绍了swing组件JScrollPane滚动条实例代码,分享了两个相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02

最新评论