本文章主要介绍了Java程序中使用JavaMail发送带图片和附件的邮件,JavaMail是专门用来处理邮件的Java API,需要的朋友可以参考下
我们常常在邮件中添加附件,以达到传输较大文件的目的。而上一篇文章只是将本机的一张图片内嵌到邮件的 HTML 格式的正文当中,这样的邮件显得不够丰富多彩。我们想要一封正文部分图文并茂,而游客附带若干附件的邮件。
下面是代码结构中3个重要的方法:
MimeBodyPart createAttachment(String fileName) 方法用于创建附件并返回;
MimeBodyPart createContent(String body, String fileName) 方法用于创建正文部分并返回;
MimeMessage createMessage(Session session) 方法用于调用上面的两个方法生成邮件。
其实,创建一个内含附件的邮件与上一篇文章中创建正文中包含图片的邮件的原理,甚至代码都几乎相同。也就是使用 JAF 框架中的 FileDataSource 类和 DataHandler 类来获得给定路径的资源文件,JAF 框架中的这两个类共同协作可以获知文件所属的 MIME 类型,它们会正确地添加到邮件组织结构中的对应消息头中。
不同的是:在 HTML 格式的正文中内含图片是使用 MimeBody.setContentID() 方法设置对应的资源文件的唯一标识符,即 MIME 协议对于邮件的结构组织格式中的 Content-ID 头字段;
而在 MIME 邮件中添加附件是使用 MimeBodyPart.setFileName() 方法来关联 FileSourceData 对象指向的资源文件。
程序代码:
这个不同点在下面代码中会用橙色背景强调指出,代码如下: 
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;  
public class AttchImgMail {  
    // JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.  
    public static void main(String[] args) throws Exception {  
        Properties properties = new Properties();  
        // properties.put("mail.smtp.host", "mailcas.chinapnr.com");// 设置smtp主机  
        properties.put("mail.smtp.host", "smtp.163.com");// 设置smtp主机  
        properties.put("mail.smtp.auth", "true");// 使用smtp身份验证  
        /* 
         * 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的 
         * getPasswordAuthentication() 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail 
         * 中的这种设计是使用了策略模式(Strategy 
         */  
        MimeMessage message = new MimeMessage(Session.getInstance(properties,  
                new Authenticator() {  
                    public PasswordAuthentication getPasswordAuthentication() {  
                        return new PasswordAuthentication(//设置发送帐号密码  
                                "帐号", "密码");  
                    }  
                }));  
        // 设置邮件的属性  
        // 设置邮件的发件人  
        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'><img src='cid:b'>",  
                "text/html;charset=gb2312");  
  
        // 点到点的发送  
        // 一对多发送只要改一个地方如下:  
          
        // // 构建一个群发地址数组  
        // InternetAddress[] adr=new InternetAddress[toMore.length];  
        // for(int i=0;i<toMore.length;i++){ adr[i]=new  
        // InternetAddress(toMore[i]); }  
        // // Message的setRecipients方法支持群发。。注意:setRecipients方法是复数和点 到点不一样  
        // message.setRecipients(Message.RecipientType.TO,adr);  
           
  
        // 创建图片  
        MimeBodyPart img = new MimeBodyPart();  
        /* 
         * JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分. 
         * 除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的. JavaMail 
         * API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法. 
         */  
        DataHandler dh = new DataHandler(new FileDataSource("www.itxm.net/templets/style/html/images/qr1.jpg"));//图片路径  
        img.setDataHandler(dh);  
        // 创建图片的一个表示用于显示在邮件中显示  
        img.setContentID("a");  
  
        MimeBodyPart img2 = new MimeBodyPart();  
        DataHandler dh2 = new DataHandler(new FileDataSource("www.itxm.net/templets/style/html/images/qr2.jpg"));//第二张图片路径  
        img2.setDataHandler(dh2);  
        img2.setContentID("b");  
        // 创建附件  
        // MimeBodyPart attch = new MimeBodyPart();  
        // DataHandler dh1 = new DataHandler(new FileDataSource("www.itxm.net/templets/style/html/images/qr1.jpg"));  
        // 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(img2);  
        mm2.setSubType("mixed");// 设置正文与附件之间的关系  
  
        message.setContent(mm2);  
        message.saveChanges(); // 保存修改  
  
        Transport.send(message);// 发送邮件  
        System.out.println("邮件发送成功");  
    } 
}  
Java发送带图片的邮件,代码为发生2张图片的邮件关联方式,注释中有发送带附件、带多人发生解析的代码,可以自行调整。
重要部分已经指出来了,有兴趣的可以深入了解一下 MIME 协议对邮件结构组织的规范格式。

转载请注明来源网站:www.itxm.cn谢谢!

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

java实现网络爬虫程序demo详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。