邮件–发送邮件
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已说明。 }