目录
SMTP协议:应用层中的一种协议,在JavaMail中用来发邮件的一种协议,其基于传输层上的TCP协议。
使用Java代码进行邮件的发送的步骤:
一、给单人发送单一邮件
1、创建Session对象:
(1)、确定邮箱账号和授权密码。
授权密码获取方式如下:
首先点击设置中的
然后开启服务:
最后通过扫码发送短信即可获取到授权密码。
(2)、加载SMTP服务器连接信息
以键值对的方式将邮箱主机名、端口号等信息放入到properties对象当中(利用properties对象的put()方法)
Properties pro = new Properties();//创建properties对象
pro.put("mail.smtp.host", "smtp.163.com");//添加主机名
pro.put("mail.smtp.port", "25");//添加端口号
pro.put("mail.smtp.auth", "true");//是否需要用户认证
pro.put("mail.smtp.starttls.enable", "true");//启用TLS加密
(3)、创建会话
Session session = Session.getInstance(A,B);//通过Session的getInstance()
A:代表properties对象(连接信息)
B:需要传入Authenticator类型的对象,而Authenticator是一个抽象类,此抽象类用于数据校验(校验邮箱账号和授权密码),通过new Authenticator()的方式,在其中重写getPasswordAuthentication()方法,返回校验结果。
eg:
Session session = Session.getInstance(pro,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//username代表邮箱账号 password代表授权密码
return new PasswordAuthentication(username,password);
}
});
2、创建邮件对象
(1)、关键类:MimeMessage
MimeMessage message = new MimeMessage(session);//创建邮件对象
(2)、通过邮件对象添加发件地址、收件地址等信息并发送邮件
示例代码如下:
message.setSubject("岩王帝君来电");//设置邮件标题
message.setText("亲爱的旅行者你好");//设置邮件正文内容
message.setFrom(new InternetAddress("12345678@163.com"));//设置邮件发件人
message.setRecipient(RecipientType.TO, new InternetAddress("2234@qq.com"));//设置邮件收件人
Transport.send(message);//发送邮件
RecipientType.TO 代表发送收件人是单个收件人。RecipientType.CC:代表抄送
setFrom(A)==>A要求是Address类型的参数,而普通的"12345678@163.com"只是一个普通的字符串,所以要new InternetAddress()
二、给多个人发送/抄送/群发
抄送邮件与单发邮件相比,创建Session对象思路代码均一致,在创建邮件对象的过程中,只需要更改设置收件人邮箱账号的代码,示例如下:
message.setRecipient(RecipientType.TO, new InternetAddress("2522222@qq.com"));
将上述代码更改为:
message.setRecipients(RecipientType.CC, new InternetAddress[] { });
更改后的代码,设置收件人信息时,将TO(单个发送)改为CC(抄送),具体地址为数组中的每一个元素。
三、发送带有附件的邮件
带有附件的邮件在Java代码中,创建Session对象和会话的流程基本不变,在设置邮件内容时,将邮件内容分为了正文和附件两部分,而我们需要自行在代码中添加正文以及附件的内容,而这两部分部分内容在代码中都通过BdoyPart抽象类封装成对象,下面将正文和附件的内容设置分开介绍:
1、正文部分
注:设置邮件标题仍使用MimeMessage邮件对象设置(.setSubject(邮件标题))
正文内容如下代码所示:
//正文
BodyPart bodyPart = new MimeBodyPart();
bodyPart.setContent("邮件正文内容","text/html;charset=utf-8");//需编码集
2、附件部分
首先创建BodyPart对象,使用此对象设置文件的名字。
SetDataHandler(A)方法读取你要发送的文件。参数A要求传入DataHandler类型参数,而DataHandler(B),参数B要求传入byte[],所以最里面调用Files工具类的readAllBytes()方法。
BodyPart body = new MimeBodyPart();
body.setFileName("小舞.png");
body.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("XXX")),"application/octet-stream")));
3、最后用Multpart(抽象类)对象,用其子类MimeMultipart创建,将正文及附件放入此对象中:
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(bodyPart);
multipart.addBodyPart(body);
四、发送内嵌图片的邮件
带有内嵌图片的邮件,只需要附件部分的最后设置一个ID能够让正文部分调用即可。示例代码:
正文部分:
stringBuilder.append("<img src=\"cid:xw\"/>");
附件部分:
body.setHeader("Content-ID", "xw");