通过一段代码来说明如何发送一封带有附件的邮件,邮件正文为html并携带图片
注:通过学习传智播客张孝祥老师的视频掌握的。
首先引入javaMail相关的jar包:mailapi.jar、smtp.jar(其中mailapi.jar是开发使用到的,smtp.jar是运行时用到的)
public class JavaMailDemo{
public static void main(String []args){
Properties porps = new Properties();//创建Properties对象
props.setProperty("mail.smtp.auth","true");//设置需要认证
props.setProperty("mail.transport.protocol","smtp");//设置协议为smtp
props.setProperty("mail.host", "smtp.163.com");
//获得Session,两种方式:1 Session.getDefaultInstance(props) 2 Session.getInstance(props);两种方式的区别是,1中多次调用获得是相同的session对象,2中多次调用获得的是不同的对象。
Session session = Session.getDefaultInstance(props);
Message msg = new MimeMessage(session);//创建邮件
//发件人地址,解决中文乱码问题
msg.setFrom(new InternetAddress("/""+MimeUtility.encodeText("张三")+"/""+"<xxxxxx@163.com>")));
msg.setSubject("使用javaMail发送多媒体邮件");//设置邮件主题
msg.setRecipients(RecipientType.TO,InternetAddress.parse("MimeUtility.encodeText("王XX")+"<xxxxxxxx@126.com>,"
+MimeUtility.encodeText("张XX")+"<xxxxxxxx@163.com>""));//多个收件人地址,并解决中文乱码问题
msg.setReplyTo(new Address[]{
new InternetAddress("xxxxx@163.com"),
new InternetAddress("xxxxx@qq.com"),
});//设置回复人地址
MimeBodyPart affix1 = new MimeBodyPart();//附件1
MimeBodyPart affix2 = new MimeBodyPart();//附件2
//----------------------------------------------------------------------//
DataSource ds1 = new FileDataSource( "E://附件1.txt");//创建一个文件数据源
DataHandler dh1 = new DataHandler(ds1);
affix1 .setDataHandler(dh1);
affix1 .setFileName(MimeUtility.encodeText("附件1.txt"));//给附件设置文件名
//----------------------------------------------------------------------//
DataSource ds2 = new FileDataSource( "D://附件2.pdf");//创建一个文件数据源
DataHandler dh2 = new DataHandler(ds2);
affix2 .setDataHandler(dh2);
affix2 .setFileName(MimeUtility.encodeText("附件2.pdf"));//给附件设置文件名
//-----------------------------------------------------------------------//
MimeMultipart bodyMultipart = new MimeMultipart();//html+gif
bodyMultipart.setSubType("related");//设置为关联型
MimeBodyPart html = new MimeBodyPart();
MimeBodyPart gif = new MimeBodyPart();
htmlPart.setContent( "使用javaMail发送邮件src='http://www.sjz.com.cn/logo.gif'></img>" ,"text/html;charset=utf-8");//设置邮件内容为html内嵌img图片
DataSource gsh = new FileDataSource("D://logo.gif");//获得图片的数据源
DataHandler gifDh = new DataHandler(gsh);
gif .setDataHandler(gifDh);
gif .setHeader("Content-Location", "http://www.sjz.com.cn/logo.gif");//设置html中引用图片的实际地址
bodyMultipart.addBodyPart(html);
bodyMultipart.addBodyPart(gif);
MimeBodyPart content = new MimeBodyPart(); //邮件内容
content.setContent(bodyMultipart);
//---------------------------------------------------------------//
MimeMultipart multipart= new MimeMultipart("mixed");//混合型
multipart.addBodyPart(content);//添加html+gif
multipart.addBodyPart(affix1 );//添加附件1
multipart.addBodyPart(affix2 );//添加附件2
msg.setContent(multipart);//将有件内容设置为html+gif+附件1 2
//1下面可以将文件存放在本地eml文件中,然后发送本地的文件;2也可以直接发送出去
/**1:将文件存放到本地demo.eml文件中
msg.saveChanges();//生成文本
OutputStream ous = new FileOutputStream("d://demo.eml");
msg.writeTo(ous);//写出到文件
ous.close();
//想送时,读取本地文件即可
MimeMessage msg1 = new MimeMessage(session,new FileInputStream("D://demo.eml"));
Transport.send(msg1,InternetAddress.parse("xxxxxx@126.com,xxxx@qq.com"));
*/
//2:直接发送
Transport transport = session.getTransport();
transport.connect("smtp.163.com", 25,"用户名","密码");
transport.sendMessage(msg, new Address[]{new InternetAddress("xxxx@163.com"),new InternetAddress("xxxx@qq.com")});
transport.close();
}
}
Transport的send和sendMessage方法:
send是静态的方法sendMessage是实例方法,send封装了连接邮件服务器、发送、关闭的操作,而sendMessage仅仅是发送,如果要连续法多封邮件,应该使用sendMessage效率高
send中如何连接邮件服务器:在session中封装用户名和密码
Session session = Session.getInstance(props,new Authenticator(){
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("用户名", "密码");
}
});