Java发送Mail总结

本文详细介绍了使用Java进行邮件发送的方法,包括配置邮件属性、设置认证信息、构建邮件内容等步骤,并深入探讨了如何发送HTML格式邮件及包含图片的邮件。

让其折磨的够呛,何不彻底弄懂

一个简单的mail组成部分

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import junit.framework.TestCase;

public class MailTest extends TestCase {

    public void test_Mail() {
        // 收件人电子邮箱
        String to = "此处填收件人邮箱地址";

        // 发件人电子邮箱
        String from = "此处填写发件人邮箱地址";

        Properties props = new Properties();
        // 指定发送邮件的主机为 localhost
        props.put("mail.smtp.host", "此处填写邮箱服务器主机");
        props.put("mail.smtp.auth", "true");
        // 创建Session对象
        Session session = Session.getDefaultInstance(props
        // 以匿名内部类的形式创建登录服务器的认证对象
                , new Authenticator() {
                    public PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("你的邮箱用户名",
                                "你的邮箱密码");
                    }
                });

        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);

            // Set From: 头部头字段
            message.setFrom(new InternetAddress(from));

            // Set To: 头部头字段
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(
                    to));

            // Set Subject: 头部头字段
            message.setSubject("This is the Subject Line!");

            // 设置消息体
            message.setText("This is actual message");

            // 发送消息
            Transport.send(message);
            System.out.println("Sent message successfully....");
        } catch (MessagingException mex) {
            mex.printStackTrace();
        }
    }

}

测试成功:

这里写图片描述

现在来看看上面的邮件组成部分:

Properties

邮件属性设置,包括邮箱服务器的地址和认证。

Authenticator

存放用户名和密码

MimeMessage

邮件主体对象,可以设置邮件头部字段中收件人和发件人、邮件的标题、邮件的消息体。

其中如果想要发送多人,可以调用

addRecipients(Message.RecipientType type,
                   Address[] addresses)

type代表后面的地址是密送还是抄送还是收件人的区别。

Transport

邮件交换机,可以发送邮件。

HTML邮件

html格式的邮件只需要在上面的基础上加一句话就可以发送了?

// 发送 HTML 消息, 可以插入html标签
            message.setContent("<a href=\"http://www.baidu.com\">This is actual message</a>", "text/html");

将html文件的内容发送出去(非附件)

比如我们有一个html格式如下:

这里写图片描述

就是一个百度首页无图片版本。我想要把这些内容展示在邮件内容中,而不是发送附件,如何做到?

首先我们知道上面发送邮件内容的时候调用的是message.setContent 第一个参数就代表邮件内容,类型为String。那么我们把刚才的html文件转化为字符串是不是就可以显示了?所以我们用IO类来读写该html文件,找了一个方法如下:

public String readHTML(String spath) {

        InputStreamReader isReader = null;

        BufferedReader bufReader = null;

        StringBuffer buf = new StringBuffer();

        try {

            File file = new File(spath);

            isReader = new InputStreamReader(new FileInputStream(file), "utf-8");

            bufReader = new BufferedReader(isReader, 1);

            String data;

            while ((data = bufReader.readLine()) != null) {

                buf.append(data);

            }

        } catch (Exception e) {
            // TODO 处理异常
        } finally {

            // TODO 关闭流

            try {
                isReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                bufReader.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        return buf.toString();

    }

ok,现在我们将message.setContent更改如下:

// 发送 HTML 消息, 可以插入html标签
            message.setContent(readHTML("/Users/wuxian/Downloads/百度一下,你就知道.html"), "text/html");

执行后,查看邮箱:

这里写图片描述

可以看到乱码了?所以我们先解决乱码

邮件内容乱码解决办法

只需要在messag.setContent第二个参数后更改为"text/html; charset=utf-8" 就ok啦。

这里写图片描述

我们html的内容展示在了邮件内容中,但是排版有点问题,这个问题以后再说吧。

HTML带图片

这里写图片描述
这里写图片描述
上图中虽然看不太清楚,但是隐约能看得见百度的标,跟之前没有图片的图一对比就能看得出来。那么我们如何将这个图片发送到邮件内容中呢?
这里写图片描述

图片连接到远程地址

首先我们可以将图片放到网上,通过url去读取。比如我们将刚才的图片上传到CSDN的服务器上,图片地址为https://img-blog.csdn.net/20150420170423953 ,我们在html中引用这个地址。然后我们就可以在邮件的内容中看到这个图片:

这里写图片描述

附件形式

但是上面的缺陷是你必须连接网络,一旦断网了你就看不到了?据说可以用附件的形式去引用?但当然不是把将其当附件发送出去,效果还是要跟上面的一样,展示在邮件的内容中。如何做呢?为了做到这一点,我们将其分2块讲解

发送附件

要想发送附件,我们要将上面的代码改造一下,引入Multipart和MimeBodyPart的概念,这个两个类的引入是为了将邮件的主题部分分隔成多个小部分。Multipart含有多个MimeBodyPart对象。
将之前Message.setContent直接设置邮件内容的语句分割成如下代码:

            Multipart mp = new MimeMultipart();
            MimeBodyPart mbp = new MimeBodyPart();
            mbp.setText(readHTML("/Users/wuxian/Downloads/百度一下,你就知道.html"),
                    "utf-8", "html");

            // 将BodyPart添加到MultiPart中
            mp.addBodyPart(mbp);
            // 发送 HTML 消息, 可以插入html标签
            message.setContent(mp);

这个时候要注意的是设置邮件内容格式为html话以及支持中文,是需要在MimeBodyPart.setText中加参数设置的。上面的改变对邮件内容没有任何变化。邮件内容是一样的,我就不再截图了。

添加附件

//添加附件
            MimeBodyPart mbpAtt = new MimeBodyPart();
            // 以文件名创建FileDataSource对象
            FileDataSource fds = new FileDataSource("/Users/wuxian/Downloads/百度一下,你就知道_files/logo_white_ee663702.png");
            // 处理附件
            mbpAtt.setDataHandler(new DataHandler(fds));
            mbpAtt.setFileName(fds.getName());

            // 将BodyPart添加到MultiPart中
            mp.addBodyPart(mbpAtt);

添加附件的时候我们新建了一个MimeBodyPart对象,然后将该对象添加到Multipart中,我们会在附件栏中看到添加的附件。

这里写图片描述

引用附件中的内容

ok,附件我们已经准备好了,如何在邮件的html文件中引用它呢?首先我们给添加附件的MimeBodyPart设置一个Content-id:

mbpAtt.setContentID("logo");

然后我们在html文件源码中引用图片的地方加引用content-id为logo的图片

<img id="s_lg_img" src="cid:logo" height="129" width="270">

然后我们发送的邮件里面就能引用到这个图片啦!

这里写图片描述

Done!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值