java邮件发送--JavaMail

时间:2023-01-11 19:02:37

最近在做一个邮件发送的功能,以前知道Javamail可以实现Java的邮件发送功能,可是只是知道而已,还没有过自己实践过,今天正好要开发这个功能,所以就实现了一下这个功能。

JavaMail简介

JavaMail是由Sun定义的一套收发电子邮件的api,不同的厂商可以提供自己实现类。
厂商提供的JavaMail服务可以由选择的实现某些邮件的协议,而常见的邮件协议则SMTP,POP3,IMAP
1. SMTP 发送邮件的协议,用来发送电子邮件
2. POP3 用于接收邮件的协议。
3. IMAP POPS的一个替代品
而这三种协议都有对应的SSL加密方式,分别是SMTPS,POP3S,IMAPS。
除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。下图描述了JavaMail的体系结构。
mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;
activation.jar:此JAR文件包含JAF API和Sun的实现。

相关API

MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个Mime消息。
Mimemultipart类表示一个由多个Mime消息组合成的组合Mime消息。
java邮件发送--JavaMail

JavaMail API收发邮件

使用javaMail发送一封简单的邮件:
1.创建包含邮件服务器的网络连接信息的Session对象
2.创建代表邮件内容的Message对象
3.创建Transprot对象,连接服务器,发送message消息,并关闭连接。
java邮件发送--JavaMail

程序

下边的这个方法支持当个发送,也支持群发邮件,但是群发邮件的话,多个地址需要用“,”来连接起来。大家可以参照上边API收发邮件的步骤来看一下我们是如何发送邮件的。

public class MailUtils {
private static String host;
private static String username;
private static String password;
private static String from;
private static String nick;

static {
try {
// Test Data
host = "smtp.163.com"; //如果你用的不是163的话,自己上网找一下吧。
username = "****@163.com"; //用户名,一般就是咱们的邮箱地址
password = "****"; //登陆密码
//nick + from 组成邮箱的发件人信息
from = "****@163.com"; //邮箱账号
nick = "ermu测试邮件"; //发件人名称

} catch (Exception e) {
e.printStackTrace();
}
}

/**
* 发送邮件
*
* @param toSomeone
* 收件人列表,以","分割
* @param subject
* 标题
* @param body
* 内容
* @param filepath
* 附件列表,无附件传递null
* @return
* @throws MessagingException
* @throws AddressException
* @throws UnsupportedEncodingException
*/

public static boolean sendMail(String toSomeone, String subject, String body)
throws AddressException, MessagingException,
UnsupportedEncodingException {

// 创建Properties对象
Properties props = System.getProperties();
// 创建信件服务器
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true"); // 通过验证
// 得到默认的对话对象
Session session = Session.getDefaultInstance(props, null);
// 参数修饰
if (body == null) {
body = "";
}
if (subject == null) {
subject = "无主题";
}
// 创建一个消息,并初始化该消息的各项元素
MimeMessage msg = new MimeMessage(session);
nick = MimeUtility.encodeText(nick);
msg.setFrom(new InternetAddress(nick + "<" + from + ">"));
msg.setText(body, "UTF-8"); //设置格式,否则会出现乱码现象。
// 创建收件人列表
if (toSomeone != null && toSomeone.trim().length() > 0) {
String[] arr = to.split(",");
int receiverCount = arr.length;
if (receiverCount > 0) {
//创建收件人的数组,用来群发邮件
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
msg.addRecipients(Message.RecipientType.TO, address);
//设置主题
msg.setSubject(subject);
// 后面的BodyPart将加入到此处创建的Multipart中
Multipart mp = new MimeMultipart();
// 设置信件头的发送日期
msg.setSentDate(new Date());
msg.saveChanges();
// 发送信件
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(msg,
msg.getRecipients(Message.RecipientType.TO));
transport.close();
return true;
} else {
System.out.println("None receiver!");
return false;
}
} else {
System.out.println("None receiver!");
return false;
}
}

public static void main(String[] args) throws AddressException,
UnsupportedEncodingException, MessagingException {
List<String> filepath = new ArrayList<String>();
sendMail("***@qq.com,****@163.com", "实习验收", "实习验收,有附件<br>孟海滨");
}
}

效果如下:
java邮件发送--JavaMail

小结

这个JavaMail虽然很好用,而且功能也很完善,但是还由一个非常不好的地方,就是邮件的内容不能排版,而这个,就得HtmlMail来解决了,这个我们下片博客来讲一下吧。