javamail发送二进制流附件的问题
最近做个邮件发送功能,要内嵌图片并有附件。
需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下javamail的文档。
添加附件方法如下
MimeBodyPart messageBodyPart=new MimeBodyPart();
DataSource dataSource1=new FileDataSource("d:/xx.doc");
//DataSource dataSource1=new UrlDataSource("url");
按照这个api,只能先把ftp文件下载到本地,然后再读,多次一句,还额外增加了读写的成本。为什么这个api不直接提供个二进制流的DataSource呢。
百度了很久也没找到。后来google了一下,马上找到解决方案。
就是ByteArrayDataSource,这是javamail util包里的一个api。
附上完整的内嵌图片, 另发附件的javamail代码。
package com.allianture.core.sendEmail.util; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.Security;
import java.util.Date;
import java.util.Properties; import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.URLDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
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.util.ByteArrayDataSource; import com.allianture.platform.common.api.config.FtpConfig;
import com.allianture.platform.common.api.util.FtpUtils;
import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility; public class TestMail {
// static int port = 587; static String server = "smtp.exmail.qq.com";// 邮件服务器mail.cpip.net.cn static String from = "AA";// 发送者,显示的发件人名字 static String user = "aa@aa.com";// 发送者邮箱地址 static String password = "aaaa";// 密码 public static void sendEmail() throws UnsupportedEncodingException {
try {
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties props = new Properties();
props.setProperty("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.store.protocol", "smtp");
props.setProperty("mail.smtp.host", "smtp.exmail.qq.com");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
});
MimeMessage msg = new MimeMessage(session);
String nick=javax.mail.internet.MimeUtility.encodeText("aaa");
msg.setFrom(new InternetAddress(user, nick));
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("11@qq.com", false));
msg.setSubject("testest");
msg.setSentDate(new Date()); MimeMultipart multipart = new MimeMultipart("mixed");
// 邮件内容,采用HTML格式
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.removeHeader("Content-Type");
messageBodyPart.removeHeader("Content-Transfer-Encoding");
messageBodyPart.addHeader("Content-Type", "text/html; charset=gbk");
messageBodyPart.addHeader("Content-Transfer-Encoding", "base64");
messageBodyPart.setContent(getHtml(), "text/html;charset=GBK"); multipart.addBodyPart(messageBodyPart);
//内嵌图片
messageBodyPart=new MimeBodyPart();
//DataSource dataSource=new FileDataSource("d:/1.png");
URL url;
try {
url = new URL("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png");
DataSource dataSource=new URLDataSource(url);
DataHandler dataHandler=new DataHandler(dataSource);
messageBodyPart.setDataHandler(dataHandler);
messageBodyPart.setContentID("testi"); multipart.addBodyPart(messageBodyPart); //添加附件
// messageBodyPart=new MimeBodyPart();
// DataSource dataSource1=new FileDataSource("d:/aa.doc");
// dataHandler=new DataHandler(dataSource1);
// messageBodyPart.setDataHandler(dataHandler);
// messageBodyPart.setFileName(MimeUtility.encodeText(dataSource1.getName())); messageBodyPart=new MimeBodyPart();
InputStream is=downloadFtp();
//DataSource dataSource1=new FileDataSource("d:/aa.doc");
DataSource dataSource1=new ByteArrayDataSource(is, "application/png");
dataHandler=new DataHandler(dataSource1);
messageBodyPart.setDataHandler(dataHandler);
messageBodyPart.setFileName(MimeUtility.encodeText("aa.doc")); multipart.addBodyPart(messageBodyPart);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} msg.setContent(multipart);
msg.saveChanges(); Transport.send(msg); } catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
} public static String getHtml(){
InputStream is;
try {
is = new FileInputStream("d:/测试.html");
byte[] b = new byte[1024];
int size = is.read(b);
return new String(b,0,size);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null; }
public static void main(String args[]) throws UnsupportedEncodingException { sendEmail();// 收件人
//System.out.println(getHtml());
//downloadFtp();
System.out.println("ok");
} public static InputStream downloadFtp(){
try {
FtpUtils ftpUtils = new FtpUtils();
FtpConfig config = new FtpConfig();
config.setEncode("GBK");// 设置编码
config.setServer("101.31.116.513");// 设置服务
config.setPort(21);// 设置端口
config.setUsername("weblogic");// 设置用户名
config.setPassword("weblogic");// 设置密码
config.setLocation("/home/weblogic/ebiz/mailtest");
boolean flag = ftpUtils.connectServer(config);
System.out.println(flag);
System.out.println(ftpUtils.getFileList());
InputStream is=ftpUtils.getFtpClient().retrieveFileStream("aa.doc");
ftpUtils.closeServer();
return is;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null; }
}
测试.html
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
<link rel="stylesheet" type="text/css" href="css/style.css">
<title>e</title>
<style>
</style>
</head> <body>
<h1>dusen</h1>
<span style="color:red">this is a test email</span>
<div><img src="cid:testi"></div>
<div><img src="cid:testi2"></div>
</body>
</html>
还有一点,qq的企业邮箱要加ssl
javamail发送二进制流附件的问题的更多相关文章
- javamail: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题
https://www.cnblogs.com/younldeace/p/5193103.html 最近做个邮件发送功能,要内嵌图片并有附件. 需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下 ...
- 使用JavaMail发送带附件的邮件
所需jar包 链接:http://pan.baidu.com/s/1dFo4cDz 密码:akap 工具类: package com.javamail.utils; import java.util. ...
- JavaScript读二进制文件并用ajax传输二进制流
综合网上多个教程,加上自己实践得出的方法,目前能够兼容谷歌.IE11.IE10. htmlbody里的内容,没什么特殊的. <div id="dConfirm"> &l ...
- Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话
1. 前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...
- 【Mail】JavaMail发送带附件的邮件(二)
上一篇讲了使用JavaMail发送普通邮件([Mail]JavaMail介绍及发送邮件(一)),本例讲发送复杂的邮件(带有附件的邮件) 生成一封复杂的邮件 新建一个JavaWeb的Maven工程,引入 ...
- 邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件
好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进 ...
- Jmeter入门13 jmeter发送application/octet-stream二进制流数据
http接口请求header里面 content-type: application/octet-stream (二进制流数据),如何用jmeter发送请求? 1 添加http请求头 2 http请 ...
- Java生成二进制文件与Postman以二进制流的形式发送请求
业务描述: 模拟终端(智能家居)发送HTTP POST请求,请求参数为二进制流:而且,二进制流是加密后的数据,因此调试分两步: 1.Java代码生成加密后数据,并保存为二进制流文件 (电脑上的图片就是 ...
- (三)JavaMail发送附件
代码如下: package cases; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHand ...
随机推荐
- Kali linux安装漏洞扫描工具Nessus指南
引子:Nessus是著名信息安全服务公司tenable推出的一款漏洞扫描与分析软件,号称是"世界上最流行的漏洞扫描程序,全世界超过75,000个组织在使用它".虽然这个扫描程序能够 ...
- 通过案例练习掌握SSH 的整合
1. SSH整合_方案01 ** 整合方案01 Struts2框架 Spring框架 在Spring框架中整合了Hibernate(JDBC亦可) 一些业务组件(Service组件)也可以放入 ...
- 快照(Snapshot)
一.定义: SNIA(存储网络行业协会)对快照(Snapshot)的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像.快照可以是其所表示的数据的一个 ...
- tomcat 产生heapdump文件配置
连接地址:http://www.blogjava.net/zhanglongsr/articles/396607.html
- 设计模式- 主动对象(Active Object)
译者注:1.对象分为主动对象和被动对象,主动对象内部包含一个线程,可以自动完成动作或改变状态,而一般的被动对象只能通过被其他对象调用才有所作为.在多线程程序中,经常把一个线程封装到主动对象里面.2.在 ...
- js 模拟java 中 的map
//js模拟map Map = { obj : {}, put : function(key , value){ this.obj[key] = value; }, get : function(ke ...
- NOPI导出Excel 自定义列名
NOPI 做Excel 导出确实很方便 ,但是一直在用没好好研究. 在网上没找到自定义Columns的方法 ,于是乎自己就在原来的方法上简单地改改. 想用的童鞋们可以直接拿去用! /// 数据大于65 ...
- 任务栏流量监测工具 NetSpeedMonitor 在Windows 8下的安装使用
这个是给不喜欢360等提供的桌面浮动网络监控的园友准备的,NetSpeedMonitor 是一个可以在任务栏监控流量的小工具,集成在任务栏上显示,可以手动设置单位.文字大小等.还支持监控日志,相比其他 ...
- 最近比较迷flash professional cc 做PPT,做一个flash做动态打字效果的教程
想做一个flash打字效果.网上的方法要不是太繁琐,要不然就是各种遗漏.在这边做一个行之有效的flash做打字效果教程. 首先我用的是最新版本的flash professional cc .但是应该和 ...
- 去掉iphone 的圆角样式
每次面对iphone这种丑丑的样式,我简直不能再愉快的写代码~~而且每次记不住那烦人的属性~~~必须记录下来~~ -webkit-appearance:none 为了下次不用再百度,终于背下来~~~