最近做个邮件发送功能,要内嵌图片并有附件。

需求很奇怪,图片和附件文件是放在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发送二进制流附件的问题的更多相关文章

  1. javamail: UrlDataSource获取网络文件作为邮件的附件|javamail发送二进制流附件的问题

    https://www.cnblogs.com/younldeace/p/5193103.html 最近做个邮件发送功能,要内嵌图片并有附件. 需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下 ...

  2. 使用JavaMail发送带附件的邮件

    所需jar包 链接:http://pan.baidu.com/s/1dFo4cDz 密码:akap 工具类: package com.javamail.utils; import java.util. ...

  3. JavaScript读二进制文件并用ajax传输二进制流

    综合网上多个教程,加上自己实践得出的方法,目前能够兼容谷歌.IE11.IE10. htmlbody里的内容,没什么特殊的. <div id="dConfirm"> &l ...

  4. Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话

    1.    前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...

  5. 【Mail】JavaMail发送带附件的邮件(二)

    上一篇讲了使用JavaMail发送普通邮件([Mail]JavaMail介绍及发送邮件(一)),本例讲发送复杂的邮件(带有附件的邮件) 生成一封复杂的邮件 新建一个JavaWeb的Maven工程,引入 ...

  6. 邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进 ...

  7. Jmeter入门13 jmeter发送application/octet-stream二进制流数据

    http接口请求header里面 content-type: application/octet-stream  (二进制流数据),如何用jmeter发送请求? 1 添加http请求头 2 http请 ...

  8. Java生成二进制文件与Postman以二进制流的形式发送请求

    业务描述: 模拟终端(智能家居)发送HTTP POST请求,请求参数为二进制流:而且,二进制流是加密后的数据,因此调试分两步: 1.Java代码生成加密后数据,并保存为二进制流文件 (电脑上的图片就是 ...

  9. (三)JavaMail发送附件

    代码如下: package cases; import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHand ...

随机推荐

  1. Android的MVC框架

    http://www.cnblogs.com/wanghafan/archive/2012/07/20/2600786.html MVC是当前比较流行的框架,随便Google下,就可以发现几乎所有的应 ...

  2. jsoup UnsupportedMimeTypeExceptio

    Exception in thread "main" <strong><span style="font-size:18px;">org ...

  3. vs2013 中HTML页 无法在设计窗口中查看的解决

    VS2013不支持HTML文件的解决办法: 1.将html文件重命名为aspx即可.不需要创建项目,直接拖进vs即可. 2.打开VS菜单->工具->选项->文本编辑器->文件扩 ...

  4. WinForm中快捷键与组合按键的设置方法

    每个窗体都有这样3个事件:KeyDown.KeyPress.KeyUp,KeyDown和KeyPress都是按键按下事件,但KeyDown用的是KeyCode跟键盘各个按键相对应,它对应Keys枚举, ...

  5. org.apache.solr.client.solrj.impl.HttpSolrServer$RemoteSolrException: Internal Server Error 错误

    Solr报错: { "responseHeader": { "status": 500, "QTime": 11 }, "erro ...

  6. linux杂记(七)linux档案与目录管理指令

    1.目录的相关操作:cd,pwd,mkdir,rmdir 路径(PATH): 绝对路径:路径的写法[一定由根目录/写起],例如/usr/share/doc这个目录 相对路径:路径的写法[不是由/写起] ...

  7. TJU 2944 Mussy Paper 最大权闭合子图

    传送门 给你一些东西,  每个东西有一个值,有正有负. 在给一些关系, 选了其中一个物品, 和他有关系的也必须全都选上, 关系是单向的. 问最后的最大价值是多少, 如果小于0输出“   **** ”( ...

  8. poj 2688 Cleaning Robot bfs+dfs

    题目链接 首先bfs, 求出两两之间的距离, 然后dfs就可以. #include <iostream> #include <cstdio> #include <algo ...

  9. junit的安装和使用

    一.junit的安装: junit-4.11.jar: http://www.java2s.com/Code/Jar/j/Downloadjunit411jar.htm hamcrest-core.j ...

  10. Windows Server 2012 R2 Standard序列号

    备用一个吧,免得用起来的时候找不到. NB4WH-BBBYV-3MPPC-9RCMV-46XCB