邮件–发送邮件
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" }; //字符串数组转成listList<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,9String 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.初始化propertiesProperties 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调试的模式,可以打印出发送的logsession.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已说明。
}