java代码生成的带图片和附件的邮件发送实例

创建邮件—— MIME协议
MIME协议是对RFC822文档的升级和补充,它描述了如何生成一封复杂邮件。通常我们把MIME协议描述的邮件称之为MIME邮件MIME协议描述的数据称之为MIME消息
对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。(
 
         Content-type:字段
     数据类型 
         主类型/子类型的形式出现,主类型有textimageaudiovideoapplicationmessage等,分别表示文本、图片、音频、视频、应用程序、组合结构、消息等。每个主类型下面都有多个子类型,例如text主类型包含plainhtmlxmlcss等子类型。
     数据的关系
         multipart/mixedmultipart/relatedmultipart/alternative
         Content-Disposition头字段
     Content-Disposition头字段用于指定邮件阅读程序处理数据内容的方式,有inlineattachment两种标准方式,inline表示直接处理,而attachment表示当作附件处理。如果将Content-Disposition设置为attachment,在其后还可以指定filename属性,如下所示:
   
Content-Disposition: attachment; filename=“1.bmp”
上面的MIME头字段表示MIME消息体的内容为邮件附件,附件名“1.bmp”
         Content-ID头字段
     Content-ID头字段用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。例如,假设将一个表示内嵌图片的MIME消息的Content-ID头字段设置为如下形式:
    Content-ID: it315logo_gif
那么,在HTML正文中就需要使用如下HTML语句来引用该图片资源:
    <img src="cid:it315logo_gif">
注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
 
Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。Session对象根据这些信息构建用于邮件收发的TransportStore对象,以及为客户端创建Message对象时提供信息支持。
 
 
  带一个附件和一个图片的关系原理如上图所示 : 首先把正文和图片以 MimeMultipart 中 related 的关系相联,然后把他们这个整体存入 MimeBodyPart 中当作正文再次和附件以 MimeMultipart 中 mixed 的关系相联.
 
下面是一个可运行的实例:
 
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
publicclass AttchAndImgMail {
    //JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.
    publicstaticvoid main(String[] args) throws Exception{
        Properties properties = new Properties(); 
        properties.put("mail.smtp.host", "smtp.qq.com");// 设置smtp主机
        properties.put("mail.smtp.auth", "true");// 使用smtp身份验证
        /*
     * 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的 getPasswordAuthentication()
     * 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 中的这种设计是使用了策略模式(Strategy
     * */ 
       MimeMessage message = new MimeMessage(Session.getInstance(properties,newAuthenticator() {
              public PasswordAuthentication getPasswordAuthentication() {
                  returnnew PasswordAuthentication("发件人的QQ邮箱的帐号", "发件人的QQ邮箱密码");
                 }
               }));
       //设置邮件的属性
       //设置邮件的发件人
       message.setFrom(new InternetAddress("收件人的邮箱"));
       //设置邮件的收件人   cc表示抄送   bcc 表示暗送
       message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱"));
       //设置邮件的主题
       message.setSubject("世界上最复杂的邮件有附件和图片");      
       //创建邮件的正文
       MimeBodyPart text = new MimeBodyPart();
       // setContent(“邮件的正文内容”,”设置邮件内容的编码方式”)
       text.setContent("世界上最复杂的邮件<img src='cid:a'>","text/html;charset=gb2312");
       //创建图片
       MimeBodyPart img = new MimeBodyPart();
       /*JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.
        * 除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.
        * JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.*/
       DataHandler dh = new DataHandler(new FileDataSource("src//.jpg"));
       img.setDataHandler(dh);
       //创建图片的一个表示用于显示在邮件中显示
       img.setContentID("a");
      
       //创建附件
       MimeBodyPart attch = new MimeBodyPart();
       DataHandler dh1 = new DataHandler(new FileDataSource("src//大海.mp3"));
       attch.setDataHandler(dh1);
       String filename1 = dh1.getName();
        // MimeUtility 是一个工具类,encodeText()用于处理附件字,防止中文乱码问题
       attch.setFileName(MimeUtility.encodeText(filename1));
       //关系   正文和图片的
       MimeMultipart mm = new MimeMultipart();
       mm.addBodyPart(text);
       mm.addBodyPart(img);
       mm.setSubType("related");//设置正文与图片之间的关系
       //图班与正文的 body
       MimeBodyPart all = new MimeBodyPart();
       all.setContent(mm);
       //附件与正文(text img)的关系
       MimeMultipart mm2 = new MimeMultipart();
       mm2.addBodyPart(all);
       mm2.addBodyPart(attch);
       mm2.setSubType("mixed");//设置正文与附件之间的关系
      
       message.setContent(mm2);
       message.saveChanges(); //保存修改
       Transport.send(message);//发送邮件
      
    }
}
阅读更多
个人分类: 其他
上一篇利用Oracle的row_number() over函数消除重复的记录
下一篇oracle数据库cpu100%处理
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭