邮件–发送邮件
1.准备工作
1.1.生成查长度为4的验证码
package com.Li.bc;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.naming.spi.DirStateFactory.Result;
/**
* @desc 产生验证码的工具类
* @author Li Ya Hui
* @time 2021年6月17日 下午2:43:23
*/
public class CodeUtils {
public static void main(String[] args) {
createCode();
}
/**
* @desc 1.产生长度为4位的验证码
* @return
*/
public static String createCode()
{
//创建一个字符串数组
String beforeShuffle [] = new String[] { "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
//字符串数组转成list
List<String> list = Arrays.asList(beforeShuffle);
//创建一个线程安全字符串
StringBuilder sb = new StringBuilder();
//将一个list里的数据进行洗牌 也就是乱序
Collections.shuffle(list);
//遍历添加到字符串中
for (String s : list) {
sb.append(s);
}
//将stringbuilder字符串转字符
String afterShuffle = sb.toString();
//将字符串截取第6个到第9个 6,7,8,9
String result = afterShuffle.substring(5, 9);
System.out.println(result);
return result;
}
}
1.2.日期处理工具类
package com.Li.bc.dates;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* @desc 日期处理的工具类
* @author Li Ya Hui
* @time 2021年6月17日 下午3:42:12
*/
public class DateUtils {
public static void main(String[] args) throws ParseException {
//生日日期
String dateStr = "2019-12-11";
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr2 = format.format(now);
System.out.println(dateStr2);
System.out.println(dateStr);
int day = differentDaysByMillionSeconds(dateStr, dateStr2);
System.out.println(day);
}
public static int differentDaysByMillionSeconds(String dateStr , String dateStr2) throws ParseException
{
//1.初始化SimpleDateFormat 类
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//2.将传入的日期准备为日期类型
Date fDate = (Date) format.parse(dateStr);
Date oDate = (Date) format.parse(dateStr2);
//初始化日历工具类
Calendar calendar = Calendar.getInstance();
//4.计算两个日期相差的天数
calendar.setTime(fDate);
//计算出第一个日期的天数
int day1 = calendar.get(Calendar.DAY_OF_YEAR);
calendar.setTime(oDate);
//计算出第二个日期的天数
int day2 = calendar.get(Calendar.DAY_OF_YEAR);
return day2 - day1;
}
}
1.3.properties配置文件处理类
-
创建一个config文件夹,且该文件夹与src是平级的,且权限也是与src的级别一样(要构建权限级别),在该目录下创建mail.properties
-
在mail.properties写入一些数据
emailFrom=java01_plus@163.com
emialFromAuthorization=wyh2019
emailRole=XX管理系統
PS:在mail,properties中要对该文件设定编码集为UTF-8,且不要再里面有过多的空格和换行
package com.Li.utils;
/**
* @desc 解析属性配置文件的工具类
* @desc 解析属性配置文件(mail.properties)
* @author Li Ya Hui
* @time 2021年6月17日 下午4:27:08
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
public class PropertuUtils {
/*
* public static void main(String[] args) throws IOException {
*
* String propertyPath = "mail.properties"; Map<String, Object> map =
* getInfoFromProperties(propertyPath); System.out.println(map); }
*/
/**
* @throws IOException
* @desc 1.解析获取Mail.properties中的数据
*/
public static Map<String, Object> getInfoFromProperties( String propertyPath) throws IOException
{
//1.创建一个map用与装入解析获取到的数据
Map<String, Object> map = new HashMap<String, Object>();
//2.初始化properties
Properties props = new Properties();
//3.解析:将mail.properties文件转变为输入流对象 这个获取文件的区别在去可以去class路径里获取属性文件
InputStream inputStream = PropertuUtils.class.getClassLoader().getResourceAsStream(propertyPath);
//4.将流对象读取到缓冲区中
BufferedReader buffereReader = new BufferedReader(new InputStreamReader( inputStream , "utf-8"));
//5.加载缓存区读对象
props.load(buffereReader);
//6.读取并得到一个迭代器
Iterator<String> it = props.stringPropertyNames().iterator();
//7.将得到的值变为map形式
while (it.hasNext()) {
String key = (String) it.next();
map.put(key, props.getProperty(key));
}
return map;
}
}
1.4.可以执行简单发生邮件的 邮件工具类
package com.Li.bc.email;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
/**
* @desc 可以执行简单发生邮件的 邮件工具类
* @author Li Ya Hui
* @time 2021年6月17日 下午8:27:08
*/
public class EmailUtils {
//自己的邮箱
public static String sendEmailAccount = "liyahui0702@163.com" ;
//邮箱授权码
public static String sendEmailPwd = "CNMBLTOESPBQLZEM" ;
//收件人邮箱
public static String receiveMailAccount = "969607885@qq.com";//
public static void main(String[] args) throws UnsupportedEncodingException, MessagingException {
createMimeMessage( sendEmailAccount , receiveMailAccount );
}
/**
* @throws MessagingException
* @throws UnsupportedEncodingException
* @desc 1. 创建一封简单的邮件
*/
public static void createMimeMessage( String sendMail , String receviceMail ) throws MessagingException, UnsupportedEncodingException
{
//1.创建参数配置, 用于连接邮件服务器的参数配置
Properties props = new Properties();
props.setProperty("mail.transport.protocol","smtp");// 使用的协议(JavaMail规范要求)
props.setProperty("mail.smtp.host","smtp.163.com"); // 发件人的邮箱的 SMTP 服务器地址
props.setProperty("mail.smtp.auth", "true"); // 需要请求认证
//2.创建session会话对象 根据配置创建会话对象, 用于和邮件服务器交互
Session session = Session.getInstance(props);
//开启debug调试的模式,可以打印出发送的log
session.setDebug(true);
//3.创建一封邮件
MimeMessage message = new MimeMessage(session);
//4.设定发件人 //address 子类 发送者邮箱 发送者昵称 内容编码
message.setFrom( new InternetAddress(sendMail, "发送者的昵称", "utf-8"));
//5.设置收件人To: 收件人(可以增加多个收件人、抄送、密送) CC:抄送人 , BCC:密送
message.setRecipient(RecipientType.TO , new InternetAddress( receviceMail , "接收人" , "utf-8"));
//6. Subject: 邮件主题(标题有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改标题)
message.setSubject("这是我的第一封邮件");
//7.Content: 邮件正文(可以使用html标签)(内容有广告嫌疑,避免被邮件服务器误认为是滥发广告以至返回失败,请修改发送内容)
message.setContent("正文内容:Hello Email", "text/html;charset=utf-8");
//8.设置发件时间
message.setSentDate(new Date());
//9.保存设置
message.saveChanges();
//10.根据 Session 获取邮件传输对象
Transport transport = session.getTransport();
//11. 链接上SMTP邮件服务器 自己的邮箱 邮箱授权码
transport.connect(sendEmailAccount,sendEmailPwd);
//12.发送邮件 发送信息 发送人,所有收件人 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
transport.sendMessage(message, message.getAllRecipients());
System.out.println("发送成功");
//13.关闭连接
transport.close();
}
// 5. 使用//开启debug调试的模式,可以打印出发送的log
//session.setDebug(true);
//
// PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log,
// 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误
// 类型到对应邮件服务器的帮助网站上查看具体失败原因。
//
// PS_02: 连接失败的原因通常为以下几点, 仔细检查代码:
// (1) 邮箱没有开启 SMTP 服务;
// (2) 邮箱密码错误, 例如某些邮箱开启了独立密码;
// (3) 邮箱服务器要求必须要使用 SSL 安全连接;
// (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务;
// (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。
//
// PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。
}