[置顶] 【java】javamail发送带附件的邮件

时间:2021-01-31 18:09:02

一、前言

      很多我们都使用过邮件,通过邮件的附件发送一些东西,达到传送的目的,这个目的还是不错的。但是各位知道我们是如何添加附件呢?如何通过代码完成的呢?

二、附件是什么?

      我们发送的邮件除了邮件的主题内容,可以添加一些其他类型的文件,发送过出去。这些文件可以是图片、文档、视频等。很像是在我们写信一样把信写好后放进信封,同样我们也可以在信封中放一些其他的东西,比如钥匙,钱等。附件就等同于这个。

三、如何操作

      我们可以通过如下的操作达到目的:

      通过程序把我们要整理的邮件生成模板,保存在本地,生成* .eml文件,然后通过发送 *.eml文件,达到附件邮件发送的目的。

      关于环境搭配,朋友们可以借鉴小编先前的《【java】javamail简介以及发送邮件》

      生成带附件的邮件:

      这里小编在E盘下面建立了两个txt文件以及一张图片作为附件,然后把这些添加到邮件中,生成复杂的邮件。

package com.dmsd.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
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;

public class EmailWithAttch {
public static void main(String[] args) throws Exception {
//环境
Session session = Session.getInstance(new Properties());

//邮件
MimeMessage msg = new MimeMessage(session);
//发件人,注意中文的处理
msg.setFrom(new InternetAddress("\"" + MimeUtility.encodeText("东方不败") + "\" <18333602097@163.com>"));
//设置主题
msg.setSubject("越来越棒!");
//设置邮件回复人
msg.setReplyTo(new Address[]{new InternetAddress("lili@126.com")});
//收件人
msg.setRecipients(RecipientType.TO,InternetAddress.parse(MimeUtility.encodeText("Ares") + " <1102716752@qq.com>," + MimeUtility.encodeText("王雷") + " <18333602097@163.com>"));

//整封邮件的MINE消息体
MimeMultipart msgMultipart = new MimeMultipart("mixed");//混合的组合关系
//设置邮件的MINE消息体
msg.setContent(msgMultipart);

//附件1
MimeBodyPart attch1 = new MimeBodyPart();
//附件2
MimeBodyPart attch2 = new MimeBodyPart();
//正文内容
MimeBodyPart content = new MimeBodyPart();

//把内容,附件1,附件2加入到 MINE消息体中
msgMultipart.addBodyPart(attch1);
msgMultipart.addBodyPart(attch2);
msgMultipart.addBodyPart(content);

//把文件,添加到附件1中
//数据源
DataSource ds1 = new FileDataSource(
new File("E:/1.txt")
);
//数据处理器
DataHandler dh1 = new DataHandler(ds1 );
//设置第一个附件的数据
attch1.setDataHandler(dh1);
//设置第一个附件的文件名
attch1.setFileName(
MimeUtility.encodeText("我是第一个文件.txt")
);

//把文件,添加到附件2中
DataSource ds2 = new FileDataSource(
new File("E:/2.txt")
);
DataHandler dh2 = new DataHandler(ds2 );
attch2.setDataHandler(dh2);
attch2.setFileName(MimeUtility.encodeText("我是第二个文件.txt"));

//正文(图片和文字部分)
MimeMultipart bodyMultipart = new MimeMultipart("related");
//设置内容为正文
content.setContent(bodyMultipart);
//html代码部分
MimeBodyPart htmlPart = new MimeBodyPart();
//html中嵌套的图片部分
MimeBodyPart gifPart = new MimeBodyPart();
//正文添加图片和html代码
bodyMultipart.addBodyPart(htmlPart);
bodyMultipart.addBodyPart(gifPart);

//把文件,添加到图片中
DataSource gifds = new FileDataSource(
new File("E:/小熊猫.jpg")
);
DataHandler gifdh = new DataHandler(gifds);
gifPart.setDataHandler(gifdh);
//说明html中的img标签的src,引用的是此图片
gifPart.setHeader("Content-Location", "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2703288617,3613848102&fm=23&gp=0.jpg");

//html代码
htmlPart.setContent("马蓉出轨王宝强的经纪人的事情其实根本曾经划上了句号。加上前段时间的白百何出轨小鲜肉的事情,把文娱圈的潘金莲的丑闻推上了一个新的阶段。时间就是一个沙漏,马蓉和王宝强的离婚事情,也慢慢被人们淡忘。<img src='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1495797374&di=537ebbbc19d917e7c425475e867069ca&imgtype=jpg&er=1&src=http%3A%2F%2Fimgsrc.baidu.com%2Fforum%2Fpic%2Fitem%2Fcf594910b912c8fc2c8ed308fc039245d48821cc.jpg'>", "text/html;charset=utf-8");

//生成文件邮件
msg.saveChanges();

//输出
OutputStream ips = new FileOutputStream("E:/demo3.eml");
msg.writeTo(ips);
ips.close();
}
}

      发送生成的*.eml文件:

package com.dmsd.mail;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {

/**
* @param args
* @throws MessagingException
* @throws FileNotFoundException
*/

public static void main(String[] args) throws FileNotFoundException, MessagingException {
// 属性对象
Properties properties = new Properties();
// 开启debug调试 ,打印信息
properties.setProperty("mail.debug", "true");
// 发送服务器需要身份验证
properties.setProperty("mail.smtp.auth", "true");
// 发送服务器端口,可以不设置,默认是25
properties.setProperty("mail.smtp.port", "25");
// 发送邮件协议名称
properties.setProperty("mail.transport.protocol", "smtp");
// 设置邮件服务器主机名
properties.setProperty("mail.host", "smtp.163.com");
// 环境信息
Session session = Session.getInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 在session中设置账户信息,Transport发送邮件时会使用
return new PasswordAuthentication( "xxxxxxx", "xxxxxxxx");
}
});


//读取本地邮件
Message message = new MimeMessage(session, new FileInputStream(new File("E:/11.html")));

//发送邮件
Transport.send(message, InternetAddress.parse("18333612586@163.com,15732626015@163.com,18333602097@163.com,15732622312@163.com,15732534138@163.com") );

}

}

      在生成的邮件中,就可以看到发送的人,以及附件的详细信息,邮件的主体内容。等等

[置顶]        【java】javamail发送带附件的邮件

四、小结

      通过学习javamail对邮件的研究更加深入了,可以自己通过代码搭建一个邮件服务器,使用也比较方便,自己搭建的就可以照顾到跟多的方面,管理也就比较方便了,当使用邮件进行消息推送的时候也就可以很快的实现了。

      下一篇博客将向大家带来一个新的技术freemarker,在javamail+freemarker生成邮件模板,并发送邮件。