Java发送Mail总结

来源:互联网 发布:中世纪2优化9农业收入 编辑:程序博客网 时间:2024/06/05 06:57

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

一个简单的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的服务器上,图片地址为http://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!

0 0
原创粉丝点击