目录
一、引言
二、封装建立相关session的工具类
三、发送电子邮件
在电子邮件之前,人们发邮件通常是通过将信件投放到邮筒或交给邮递员然后经过交通运输到达收件人手里。
电子邮件出现之后,类似的也是模仿这个原理,不过不是具体的纸质信件而是通过从发送方用户的电脑端的邮件软件,发送到邮件服务器上,经过若干个邮件服务器的中转,到达接收方用户的电脑端软件,接收方通过登录相关的Email软件来查看邮件内容。
MUA:Mail User Agent(电子邮件用户代理),我们将其作为发送方邮件代理。
MTA:Mail Transfer Agent(电子邮件中转代理),邮件中转服务器代理。
MDA:Mail Delivery Agent(电子邮件接收方代理),接收方邮件代理。
我们Java程序所需要模拟的是一个类似发(MUA)的行为,将邮件发送给中转服务器(MTA)。
这里就需要了解一个网络编程的协议,SMTP协议,简单邮件传输协议。MUA向MTA发送邮件就是基于该协议的,SMTP是建立在TCP协议的基础上的。
常见邮件服务商的SMTP信息:
邮箱类型 | 服务器IP | 端口 |
QQ邮箱 | smtp.qq.com | 465/587 |
163邮箱 | smtp.163.com | 465 |
Gmail邮箱 | smtp.gmail.com | 465/587 |
我们还需要做的准备工作:在所建的项目中的lib目录下,导入所需要的jar包。
可以去对应的Maven仓库下载。
进入正题:我们模拟的是一个用户发送邮件,从客户端到服务器端进行通信,需创建一个session对象,保证整个程序操作的顺利进行。
所需信息有邮箱账户信息(用户名、密码等),以及SMTP服务器连接信息。
以网易邮箱为例:
// 邮箱账户信息
String username = "[email protected]";//用户名
String password = "QHJIxxxxxxxCENVR";//登录口令
// SMTP服务器连接信息
Properties p = new Properties();
p.put("mail.smtp.host", "smtp.163.com");//服务器主机名
p.put("mail.smtp.port", "25");//端口号
p.put("mail.smtp.auth", "true");//需要用户认证
p.put("mail.smtp.starttls.enable", "true");//启用TLS加密
SMTP连接信息通过创建一个Properties对象(采用键值对来封装配置信息)来配置相关的主机名、端口号等信息。
通过Session的getInstance()方法创建session实例,传入保存SMTP配置信息的Properties对象p,以及创建一个新的Authenticator对象用于服务器的认证(传入用户名和密码)。
//获取session实例
Session session = Session.getInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
转念一想,我们何不将创建的有关发送邮件的session会话对象封装成一个工具类,以便之后进行邮件相关操作能多次利用。
于是便有了JavaEmailUtils工具类:
public class JavaEmailUtils {
private JavaEmailUtils() {// 无参构造方法
}
public static Session createSession() {//创建session方法
// 邮箱账户信息
String username = "[email protected]";
String password = "QHJIxxxxxxxCENVR";
// SMTP服务器连接信息
Properties p = new Properties();
p.put("mail.smtp.host", "smtp.163.com");//主机名
p.put("mail.smtp.port", "25");//端口号
p.put("mail.smtp.auth", "true");//需用户认证
p.put("mail.smtp.starttls.enable", "true");//启用TLS加密
//创建session实例
//用过Session的getInstance方法创建
//因为需用户认证,所以所传参数中创建了Authenticator对象用于在会话中注册(通过用户名和密码完成)
Session session = Session.getInstance(p, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
return session;//返回所创建的会话对象
}
}
这个工具类不需要实例化,我们直接拿来用即可,所以将无参构造方法设置成私有的。
利用封装好的JavaEmailUtils工具类创建session对象:
//创建session对象
Session s=JavaEmailUtils.createSession();
创建好session会话以后,我们实现发送邮件功能还需要一个类,MimeMessage邮件对象类。
//创建邮件对象
MimeMessage message=new MimeMessage(s);//s为本次会话对象
//编写邮件
message.setSubject("123");//设置文章标题
message.setText("噜啦噜啦嘞绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿绿","utf-8","html");//设置正文内容
//设置邮件发送方
message.setFrom(new InternetAddress("[email protected]"));
//设置邮件接收方
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
//还可以在发送的同时,抄送给多个接收方
message.setRecipients(RecipientType.CC,new InternetAddress[] {new InternetAddress("[email protected]")});
最后,利用Transport的send()方法发送邮件:
Transport.send(message);//发送
这里值的一提的是,遍历发送正文时,可以加上html中的标签以达到对文本内容中部分内容的特殊操作,例如xxx 实现加粗操作,但此时应在后面设置字符编码集"utf-8”和文本子类型“html”。