SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。可增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。
//SMTP服务器连接信息
Properties props=new Properties();
props.put("mail.smtp.host", "smtp.163.com"); //SMTP主机名
props.put("mail.smtp.port", "25"); //主机端口号
props.put("mail.smtp.auth", "true"); //是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); //启动TLS加密
当发送邮件时,我们每次都要先创建Session,再输入邮箱的账号密码,建立连接信息,过于繁琐,所以我们可以在这里创建一个JavaMailUtils类,每次创建连接时,只需要调用JavaMailUtils类里的createsession()方法即可,大大减少了代码的冗余。
public final class JavaMailUtils {
public JavaMailUtils() {}
public static Session createSession() {
// 邮箱账号信息
String userName = "151********@163.com"; // 邮箱发送账号
String password = "********"; // 账号授权密码
// SMTP服务器连接信息
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.163.com"); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启动TLS加密
// 创建Session会话
// 参数1:smtp服务器连接参数u
// 参数2:账号和密码的授权认证对象
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
return session;
}
}
// 1.创建Session会话
Session session = JavaMailUtils.createSession();
// 2.创建邮件对象
try {
MimeMessage message = new MimeMessage(session);
//设置发送方
message.setFrom(new InternetAddress("151********@163.com"));
//设置接收方(1个)
message.setRecipient(RecipientType.TO, new InternetAddress("********@qq.com"));
//当接收方是多个时抄送,设置成数组类型
message.setRecipients(RecipientType.CC, new InternetAddress[] { new InternetAddress("*********@qq.com"),new InternetAddress("**********@qq.com") });
//设置标题
message.setSubject("测试邮件!!!");
//发送内容,邮件正文内容包含html内容
message.setText("我好饿啊!", "utf-8", "html");
//发送
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
当发送带有附件的邮件时需要创建邮件内容"复合"对象,Multipart类的MimeMultipart实现类,然后再创建BodyPart类的MimeBodyPart实现类。
textPart用于存储正文内容,调用setContent()方法,参数1为正文内容,参数2为内容类型;字符编码集。
filePart用于存储附件,先调用setFileName()方法设置附件文件的显示名称(显示名称可以与原名不一致)。再调用setDataHandler(),其中添加一个DataHandler()方法,使用Files工具类的readAllBytes()方法,可以把文件读取成字节数据, 最后,通过setContent()把Multipart添加到Message中,即可发送邮件。
application/octet-stream:浏览器在请求资源时,会通过http返回头中的content-type决定如何显示/处理将要加载的数据,Content-Type: application/octet-stream,告知浏览器这是一个字节流,浏览器处理字节流的默认方式就是下载。
// 正文
BodyPart textPart = new MimeBodyPart();
textPart.setContent("我从山中来,带着兰花草!", "text/html;charset=utf-8");
// 附件
BodyPart filePart = new MimeBodyPart();
filePart.setFileName("测试文件");
// 上传附件文件
filePart.setDataHandler(new DataHandler(new
ByteArrayDataSource(Files.readAllBytes(Paths.get("D:\\test\\maomao\\mao.jpg")),
"application/octet-stream")));
// 将正文+附件组装成Multipart对象
Multipart multipart=new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(filePart);
//放入邮件
message.setContent(multipart);
//发送邮件
Transport.send(message);
与发送带有附件的邮件类似,也是两部分。一部分是textPart,一部分是图片内容imagePart。
imagePart用于存储图片,先调用setFileName()方法设置图片的显示名称。再调用setDataHandler(),其中添加一个DataHandler()方法,使用Files工具类的readAllBytes()方法,可以把文件读取成字节数据。
这里通过StringBuilder定义了一个字符串,将文字内容和图片内容通过字符串的拼接形成一个整体。邮件正文部分中用,附件名通过.setHeader(“Content-ID”, “<别名>”)的方法设置。
// 创建Session会话
Session session = JavaMailUtils.createSession();
try {
// 创建邮件对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("151********@163.com"));
message.setRecipient(RecipientType.TO, new InternetAddress("*********@qq.com"));
message.setSubject("测试邮件!!!");
// 邮件正文
BodyPart textPart = new MimeBodyPart();
StringBuilder contentText = new StringBuilder();
contentText.append("哈吉咪
");
contentText.append("hhhhhhhhhhhh
");
// 通过内容ID引用附件图片
contentText.append("");
textPart.setContent(contentText.toString(), "text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("测试图片");
//上传图片文件
imagePart.setDataHandler(new DataHandler(new ByteArrayDataSource(
Files.readAllBytes(Paths.get("D:\\test\\maomao\\mao.jpg")), "application/octet-stream")));
//图片的内容id
imagePart.setHeader("Content-ID", "cbkj");
//将正文+附件组装成Multipart对象
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(imagePart);
// 放入邮件
message.setContent(multipart);
// 发送邮件
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}