package com.cs.mail;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.Message.RecipientType;
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;
import com.cs.utils.DateUtil;
/**
* 邮件的结构大概是这个样子的
* 整个邮件{
* 头部{....},
* 体部(MimeMultipart){
* 正文(MimeBodyPart){
* 分正文1(MimeMultipart){
* 文本(MimeBodyPart){..},
* 图片(MimeBodyPart){..},
* 超链接(MimeBodyPart){..} },
* 分正文2{
* 文本(MimeBodyPart){..},
* 图片(MimeBodyPart){..},
* 超链接(MimeBodyPart){..} }
* },
* 附件1(MimeBodyPart){},
* 附件2(MimeBodyPart){},
* .....
* }
* }
*
* @author Administrator
*
*/
public class MIMEMessageTest {
public static void main(String[] args) throws Exception {
//Session session = Session.getInstance(new Properties());//因为不发送出去,所以properties可以直接new,不用填数据
//为了能真正发送邮件出去,需要设置properties的相关内容
Properties props = new Properties();
props.put("mail.smtp.auth","true");//mail.smtp.auth属性设置为true,表示要做验证
props.put("mail.transport.protocal","smtp");
props.put("mail.smtp.host","smtp.126.com");
Session session = Session.getInstance(props,
/*创建一个匿名内部类,并且覆盖了父类的方法,这个模式叫做策略模式*/
new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("邮箱的用户名","密码");
}
}
);
//创建一个邮件
MimeMessage msg = new MimeMessage(session);//这个是整个邮件
msg.setSubject("复杂邮件标题信息-使用程序来生成邮件");//设置邮件的标题
msg.setFrom(new InternetAddress("a44@126.com"));//发件人
//下面设置收件人和抄送人。user1 <5944424@qq.com> 这样的格式,是为了给收件人取个名字,而不是直接显示为邮件地址
msg.setRecipients(RecipientType.TO,
InternetAddress.parse("user1 <334444@qq.com>,55566692@qq.com,te6n@ss6l.com")
);
msg.setRecipients(RecipientType.CC,
InternetAddress.parse("la434@126.com")
);
msg.setReplyTo(InternetAddress.parse("l44704@126.com"));//点击回复时,就会回复这里指定的人,而不是发件人了
/*下面是构造邮件的具体内容*/
//体部,是个复杂体,mix表示体部里的各部分的关系是混合型的.MimeMultipart还可以是复杂体中的复杂体
MimeMultipart multipart = new MimeMultipart("mix");//原先是写multipart/mix,其实不是这样写的,因为这个类本身就已经是multipart了,就写子类型就好了
msg.setContent(multipart);//把体部加入到邮件整体里面
//构建各个分部的对象
MimeBodyPart attachment1 = new MimeBodyPart();//附件1
MimeBodyPart attachment2 = new MimeBodyPart();//附件2
MimeBodyPart content = new MimeBodyPart();//正文,是个复杂体,可以包括文本,图片,超链接等资源,它里面还可以继续有MimeMultipart,MimeBodyPart等
//把各个分部对象,添加到体部里面
multipart.addBodyPart(attachment1);//把附件1添加到体部
multipart.addBodyPart(attachment2);//把附件2添加到体部
multipart.addBodyPart(content);//把正文添加到体部
//附件1的构建的准备
DataSource ds1 = new FileDataSource("d:\\Hello.txt");//把要的附件的地址传进来
DataHandler dh1 = new DataHandler(ds1);
//构造附件1的内容,使用策略模式,把处理的方法传递进来,如何处理,完全由调用者来定义
attachment1.setDataHandler(dh1);
attachment1.setFileName(MimeUtility.encodeText("Hello.txt"));//必须要设置附件的名字,否则就不是附件了
//附件2的构建的准备
DataSource ds2 = new FileDataSource("d:\\world.txt");//把要的附件的地址传进来
DataHandler dh2 = new DataHandler(ds2);
//构造附件2的内容,使用策略模式,把处理的方法传递进来,如何处理,完全由调用者来定义
attachment2.setDataHandler(dh2);
attachment2.setFileName("world.txt");//必须要设置附件的名字,否则就不是附件了
//下面开始构造正文部分的内容,需要构造MimeMultipart,MimeBodyPart等对象,也就是正文里的正文,称为分正文
MimeMultipart bodyMultipart = new MimeMultipart("related");//分正文的构建,里面的各个资源关系是关联关系,所以写related
content.setContent(bodyMultipart);//把分正文添加到正文里面
//构造分正文里的各个部分的内容,里面有文本,图片,超链接等
MimeBodyPart htmlPart = new MimeBodyPart();//html格式的文本内容
MimeBodyPart gifPart = new MimeBodyPart();//图片
bodyMultipart.addBodyPart(htmlPart);//文本添加到分正文里
bodyMultipart.addBodyPart(gifPart);//图片添加到分正文里
//图片的构建的准备
DataSource gifds = new FileDataSource("d:\\gif003.jpg");//把要的图片的地址传进来
DataHandler gifdh = new DataHandler(gifds);
//构造图片的内容,使用策略模式,把处理的方法传递进来,如何处理,完全由调用者来定义
gifPart.setDataHandler(gifdh);
gifPart.setFileName(MimeUtility.encodeText("图片"));//文件名中如果是中文,可以用MimeUtility.encodeText()转换一下
gifPart.addHeader("Content-Location","d:\\");//
//文本内容的构造比较简单,就是setContent方法即可
String context = "Dear XXXX,<br>你好,这封邮件是系统后台发送的邮件,请不要回复.<br>现在时间是:"+DateUtil.getNowDateString();
htmlPart.setContent(context,"text/html;charset=gbk");//注意charset不要写成chartset,否则中文会是乱码
//调用保存修改的方法,完成这份邮件的编写
msg.saveChanges();
//现在不发送出去,可以把邮件内容保存到某个地方去
File dir = new File("d:\\mail\\");
dir.mkdirs();
File file = new File(dir,"hello.eml");
file.createNewFile();
OutputStream os = new FileOutputStream(file);
msg.writeTo(os);
os.flush();
os.close();
session.setDebug(true);//设置debug为true时,表示要在控制台打印出发送邮件时的相关信息
Transport.send(msg);//这个静态方法内部做了连接,发送,关闭动作,如果使用实例变量的sendMessage(....)方法,则要自己去连接,发送,关闭.
}
}
javamail发送邮件的代码例子-复杂类型的邮件
最新推荐文章于 2021-02-17 11:35:04 发布