让其折磨的够呛,何不彻底弄懂
一个简单的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!