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

https://www.cnblogs.com/younldeace/p/5193103.html

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

需求很奇怪,图片和附件文件是放在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 = "[email protected]";// 发送者邮箱地址

    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("[email protected]", 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

原文地址:https://www.cnblogs.com/achengmu/p/10833671.html

时间: 2024-10-08 23:32:14

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

javamail发送二进制流附件的问题

最近做个邮件发送功能,要内嵌图片并有附件. 需求很奇怪,图片和附件文件是放在ftp服务器上的,查了下javamail的文档. 添加附件方法如下 MimeBodyPart messageBodyPart=new MimeBodyPart(); DataSource dataSource1=new FileDataSource("d:/xx.doc"); //DataSource dataSource1=new UrlDataSource("url"); 按照这个api

基于javaMail的邮件发送--excel作为附件

基于JavaMail的Java邮件发送 Author [email protected] Desc 简单邮件发送 Date 2017/12/8 项目中需要根据物料资质的状况实时给用户发送邮件,然后我就简单学习了SMTP. 电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP.其中邮件的创建和发送只需要用到 SMTP协议,所以本文也只会涉及到SMTP协议.SMTP 是 Simple Mail Transfer Protocol 的简称,即简单邮件

JavaMail入门第五篇 解析邮件

上一篇JavaMail入门第四篇 接收邮件中,控制台打印出的内容,我们无法阅读,其实,让我们自己来解析一封复杂的邮件是很不容易的,邮件里面格式.规范复杂得很.不过,我们所用的浏览器内置了解析各种数据类型的数据处理模块,我们只需要在把数据流传输给浏览器之前明确地指定该数据流属于哪种数据类型即可,之后一切的解析操作由浏览器自动帮我们完成.下面这张图可以很好的说明解析邮件的步骤 1.调用Message对象的getFrom.getSubject等方法,可以得到邮件的发件人和主题等信息,调用getCont

NFS 网络文件系统介绍

NFS网络文件系统介绍 什么是NFS系统? NFS是Network File System 的缩写,它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录.NFS服务器可以允许NFS客户端,将远端NFS服务器端的共享目录,挂载到本地NFS客户端中.(注NFS客户端一般为应用服务器如:web) NFS服务器端共享的目录就好像NFS客户端自己的磁盘分区和目录一样. 一般客户端挂载到本地目录的名字可以随便,但为方便管理,建议和服务器端一样比较好. NFS一般是用来存储共享视频.图片等静态数据

Android中获取网络数据时的分页加载

//此实在Fragment中实现的,黄色部分为自动加载,红色部分是需要注意的和手动加载,    蓝色部分是睡眠时间,自我感觉不用写  ,还有就是手动加载时,不知道为什么进去后显示的就是最后一行,求大神指教 public class Fragment1 extends Fragment{               //加载的第几页        private int index = 0;            private List<News> news=new ArrayList<

nfs网络文件系统服务介绍与实战第一部

1.NFS原理描述 什么是NFS?NFS是Network File System的缩写,它的主要功能是通过网络让不同的机器之间可以彼此共享文件或目录.NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂在到本地的NFS客户端中.在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样. NFS一般用来存储共享视频.图片等静态数据,是当前互联网系统架构中最常用的服务之一. 2.NFS挂载结构图 图解:NFS对外共享了video这个目录,下面有两台NFS客

Android 通过广播获取网络状态

Android系统网络连接状态的改变会发一个广播,注册一个广播接收者,实时动态的检测网络状态,及时提醒用户,优化用户体验. 本文仅提供WIFI 状态的检测作为参考,其他网络连接方式请对比WIFI连接作出调整. 首先写一个WifiStateBroadcast类继承BroadcastReceiver,重写onRecevie方法,获取网络连接状态管理器,通过管理器拿到对应的网络信息,得到网络状态,判断网络状态,作出相应的业务逻辑. 1 public class WifiStateBroadCast e

cocos2dx获取网络时间(一)

今天在公司的cocos2dx项目中遇到一个需求,需要获取网络时间和系统时间对比,目的是防止用户更改系统时间进行某些非法操作 . 那么cocos2dx怎么来获取网络时间呢 ?我整理的思路如下: (1)由一个web api可以返回当前的网络时间 (2)cocos2dx通过http请求该api获取数据到本地 (3)cocos2dx解析数据得到当前的网络时间 一:首先就需要一个web接口来提供网络时间的数据,我在这里自己搭建一个WCF服务返回需要的数据. 新建WCF服务应用程序 , 项目命名为NetTi

Android网络编程之获取网络上的XML

Android网络编程之获取网络上的XML 请尊重他人的劳动成果,转载请注明出处:Android网络编程之获取网络上的XML 为要获取网络上的XML所以需要服务器端提供的支持. 一.创建服务器端: 服务器端项目结构: 服务器端运行效果图: 第一步:创建业务所需的JavaBean package com.jph.server.model; import java.util.Date; /** * 新闻实体类 * @author jph * Date:2014.09.26 */ public cla