`

用javamail发送附件

 
阅读更多
REF:http://coolshell.cn/articles/4261.html 有人封装了另一包,功能强大易用,不仅仅只能用来发送附件、html邮件,参考:http://jodd.org/doc/email.html
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Arrays;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
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;

/*
 * from:    http://www.blogjava.net/rocky/archive/2005/11/03/18001.html
 * from:    http://blog.csdn.net/sunyujia/article/details/2528696
 * 邮件头(参见RFC822,RFC2047)只能包含US-ASCII字符。
邮件头中任何包含非US-ASCII字符的部分必须进行编码,使其只包含US-ASCII字符。
但是java mail可以根据JVM发送中文邮件自行编码,,用它自带的MimeUtility类的encodeText方法对中文信息进行编码也可以。
邮件正文必须有charset=gb2312否则为
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit
打开邮件为乱码,设置charset=gb2312后
Content-Type: text/html;charset=gb2312
Content-Transfer-Encoding: quoted-printable
它不能用MimeUtility里的方法来编码。
邮件正文的编码方式的信息是要放在Content-Transfer-Encoding这个邮件头参数中的,
而MimeUtility里面的方法是将编码方式的信息放在编码后的正文内容中。
所以如果你对正文也用MimeUtility进行处理,那么其他邮件程序就不会正常显示你编码的邮件,
因为其他邮件软件如outlook,foxmail只会根据Content-Transfer-Encoding这个里面的信息来对邮件正文进行解码。*/

/**
 * <P>
 * Title:用java发送邮件的例子
 * </P>
 *
 * <P>
 * Description:发送图片附件并在html中使用该图片
 * </P>
 *
 * <P>
 * Copyright: Copyright (c) 2007
 * </P>
 *
 * @author 孙钰佳
 * @blog http://blog.csdn.net/sunyujia/
 * @main sunyujia@yahoo.cn
 * @date Jun 10, 2008 12:35:26 AM
 */
public class SendMail {
    private static String username = "ooxx@qq.com";
    private static String password = "ooxx";
    private static String smtpServer = "smtp.qq.com";
    private static String fromMailAddress = "ooxx@qq.com";
    private static String toMailAddress = "ooxx@qq.com";

    public static void main(String[] args) throws Exception {
        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.host", smtpServer);
        // 获得邮件会话对象
        Session session = Session.getDefaultInstance(props,
                new SmtpAuthenticator(username, password));
        /** *************************************************** */
        // 创建MIME邮件对象
        MimeMessage mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress(fromMailAddress));// 发件人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(
                toMailAddress));// 收件人
        mimeMessage.setSubject("主题");
        mimeMessage.setSentDate(new Date());// 发送日期
        Multipart mp = new MimeMultipart("related");// related意味着可以发送html格式的邮件
        /** *************************************************** */
        BodyPart bodyPart = new MimeBodyPart();// 正文
        bodyPart.setDataHandler(new DataHandler("测<img src=\"cid:IMG1\" />试",
                "text/html;charset=GBK"));// 网页格式
        /** *************************************************** */
        BodyPart attachBodyPart = new MimeBodyPart();// 普通附件
        FileDataSource fds = new FileDataSource("C:\\Users\\desktop.ini");
        attachBodyPart.setDataHandler(new DataHandler(fds));
        attachBodyPart.setFileName("=?GBK?B?"
                + new sun.misc.BASE64Encoder().encode(fds.getName().getBytes())
                + "?=");// 解决附件名中文乱码
        mp.addBodyPart(attachBodyPart);
        /** *************************************************** */
        MimeBodyPart imgBodyPart = new MimeBodyPart(); // 附件图标
        byte[] bytes = readFile("C:\\Users\\decli\\Desktop\\button.gif");
        ByteArrayDataSource fileds = new ByteArrayDataSource(bytes,
                "application/octet-stream");
        imgBodyPart.setDataHandler(new DataHandler(fileds));
        imgBodyPart.setFileName("button.gif");
        imgBodyPart.setHeader("Content-ID", "<IMG1></IMG1>");// 在html中使用该图片方法src="cid:IMG1"
        mp.addBodyPart(imgBodyPart);
        /** *************************************************** */
        mp.addBodyPart(bodyPart);
        mimeMessage.setContent(mp);// 设置邮件内容对象
        Transport.send(mimeMessage);// 发送邮件

    }

    /**
     * 读取文件
     *
     * @param file
     *            文件路径
     * @return 返回二进制数组
     */
    public static byte[] readFile(String file) {
        FileInputStream fis = null;
        ByteArrayOutputStream bos = null;
        try {
            fis = new FileInputStream(file);
            bos = new ByteArrayOutputStream();
            int bytesRead;
            byte buffer[] = new byte[1024 * 1024];
            while ((bytesRead = fis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);
                Arrays.fill(buffer, (byte) 0);
            }
        } catch (IOException e1) {
            e1.printStackTrace();
        } finally {
            try {
                if (bos != null)
                    bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bos.toByteArray();
    }
}

/**
 * Smtp认证
 */
class SmtpAuthenticator extends Authenticator {
    String username = null;
    String password = null;

    // SMTP身份验证
    public SmtpAuthenticator(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(this.username, this.password);
    }

}
class ByteArrayDataSource implements DataSource {

    private final String contentType;
    private final byte[] buf;
    private final int len;

    public ByteArrayDataSource(byte[] buf, String contentType) {
        this(buf, buf.length, contentType);
    }

    public ByteArrayDataSource(byte[] buf, int length, String contentType) {
        this.buf = buf;
        this.len = length;
        this.contentType = contentType;
    }

    public String getContentType() {
        if (contentType == null)
            return "application/octet-stream";
        return contentType;
    }

    public InputStream getInputStream() {
        return new ByteArrayInputStream(buf, 0, len);
    }

    public String getName() {
        return null;
    }

    public OutputStream getOutputStream() {
        throw new UnsupportedOperationException();
    }
}


分享到:
评论

相关推荐

    Gmail邮件通过JavaMail发送(不带附件与带一个附件)

    如果需要发送附件,可以使用`MimeMultipart`来组合文本内容和附件。创建一个新的`MimeBodyPart`,设置附件内容,并将其添加到`MimeMultipart`中。 ```java MimeBodyPart attachmentPart = new MimeBodyPart(); ...

    javaMail 用三种方式实现发送附件

    javaMail 用附件路径,文件流 byte[] 或 base64 字符串 实现发送附件功能

    JavaMail发送邮件(文本、html、附件)

    这个标题"JavaMail发送邮件(文本、html、附件)"涵盖了使用JavaMail API发送不同格式邮件的核心功能。下面将详细介绍如何利用JavaMail发送文本、HTML和包含附件的邮件,以及在实际应用中需要注意的配置步骤。 1. *...

    06 使用JavaMail发送带附件的邮件.exe

    06 使用JavaMail发送带附件的邮件.exe06 使用JavaMail发送带附件的邮件.exe

    JavaMail发送给多人,添加多个附件

    javaMail

    JavaMail(3)——发送带附件的邮件.docx

    以上就是使用JavaMail发送带有附件的邮件的基本步骤。这个过程需要正确配置邮件服务器的属性,如SMTP服务器地址、端口、用户名和密码(如果需要身份验证)。`MailSenderInfo` 类通常会封装这些配置信息。 总的来说...

    用javaMail发送邮件

    以上就是使用JavaMail发送邮件的基本过程。在实际开发中,可能还需要处理更多复杂情况,如SSL/TLS加密、HTML邮件、多部分消息等。JavaMail API提供了丰富的功能来应对这些需求,让开发者能够灵活地构建邮件系统。 ...

    JavaMail发送带附件的邮件

    以上就是使用JavaMail发送带附件的邮件的基本流程。需要注意的是,实际应用中可能需要处理更多复杂情况,例如错误处理、SSL/TLS加密连接、多部分邮件(包含HTML内容和文本内容)等。同时,确保你有正确的SMTP服务器...

    javamail发送邮件.zip

    这个“javamail发送邮件.zip”压缩包显然包含了一个示例项目,演示如何使用JavaMail API发送包含正文文本、图片以及附件的邮件。以下是对这个主题的详细解释: 1. **JavaMail API**: JavaMail API 是一组接口和类...

    javaMail发送邮件 发送成功 收不到邮件 或收到邮件无主题无收件人乱码

    ### JavaMail发送邮件时遇到的问题及解决方法 在使用JavaMail进行邮件发送的过程中,可能会遇到以下几种常见问题:发送成功但收件方未收到邮件、邮件收到后无主题或无收件人信息以及邮件内容出现乱码等情况。本文将...

    Android 使用javamail发送邮件

    总的来说,"Android使用javamail发送邮件"这个主题涵盖了Android平台上利用JavaMail API实现邮件发送的基本流程和注意事项,包括设置SMTP服务器、构建邮件消息、处理附件以及可能的安全性和用户体验优化。...

    JAVAMAIL集合发送图片,附件,内容,HTML等得JAVAMAIL代码

    本资源是一个集合发送图片,附件,内容,HTML等得JAVAMAIL代码,并且可以同时发送多个附件多个图片,只需填充VO类,即可直接调用并发送邮件,例子已经写好,只要填充上必要值即可,经163,qq,sina测试没有问题,有...

    JavaMail发送邮件的例子

    下面我们将深入探讨JavaMail的基本概念、如何使用JavaMail发送邮件以及在Struts2框架中的实现方式。 JavaMail API主要包括以下组件: 1. `javax.mail.Session`:是JavaMail的核心,负责配置邮件服务器的信息,如...

    james和javamail实现邮件收发(带发送附件)

    3. **添加附件**:如果需要发送附件,可以使用`MimeBodyPart`类创建一个包含附件的新部分,并将其添加到`Multipart`对象中。`MimeMultipart`类允许我们组合多个邮件部分,包括文本和附件。 4. **处理中文内容**:...

    Android使用Javamail发送Email群发加附件

    本篇文章将详细介绍如何使用JavaMail API在Android中发送带有附件并进行群发的电子邮件。首先,我们需要理解JavaMail API的工作原理以及如何将其集成到Android项目中。 1. **集成JavaMail库** 在Android项目中,...

    jsp/servlet javamail 发送邮件 可发送多个附件

    2. **SMTP服务器配置**: 在使用JavaMail发送邮件时,首先需要配置SMTP服务器的相关信息,包括主机地址、端口号、用户名和密码。这些信息通常在应用的配置文件中定义,以便在程序运行时加载。 3. **MIME消息**: ...

    javamail发送邮件(带附件)

    这个资源提供了一个具体的示例,展示了如何使用JavaMail API 来发送带有附件的邮件。以下是对这个主题的详细解释: 首先,你需要理解JavaMail的核心组件。`javax.mail` 和 `javax.mail.internet` 包含了发送邮件所...

    javamail实现邮件发送(支持多接收人、多附件)

    本教程将详细讲解如何使用 JavaMail 实现邮件发送功能,包括支持多个接收人、抄送人以及添加多个附件。 首先,确保你已经添加了 JavaMail 的依赖库到你的项目中。如果是 Maven 项目,可以在 pom.xml 文件中添加以下...

    使用javaMail发送邮件

    在本篇文章中,我们将深入探讨如何使用JavaMail API来实现邮件的发送功能。 首先,我们需要引入JavaMail所需的依赖库。在提供的文件列表中,我们看到有以下jar文件: 1. mail.jar:这是JavaMail的核心库,包含了...

    JavaMail邮箱发送,activation.jar包

    在JavaWeb应用中,使用JavaMail发送邮件通常涉及以下步骤: 1. **引入依赖**:首先,你需要将`javamail.jar`和`activation.jar`添加到项目的类路径中。在Maven项目中,可以在`pom.xml`中添加依赖项,或者在非Maven...

Global site tag (gtag.js) - Google Analytics