邮件发送工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | package com.td.util; import java.util.Date; import java.util.Properties; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import org.apache.log4j.chainsaw.Main; import com.td.bean.AjaxJson; public class SendEmail { // 发件人的 邮箱 和 密码(替换为自己的邮箱和密码) // PS: 某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置了独立密码(有的邮箱称为“授权码”), // 对于开启了独立密码的邮箱, 这里的邮箱密码必需使用这个独立密码(授权码)。 public static String myEmailAccount = "13138315770@163.com" ; public static String myEmailPassword = "qaz123456" ; // 发件人邮箱的 SMTP 服务器地址, 必须准确, 不同邮件服务器地址不同, 一般(只是一般, 绝非绝对)格式为: smtp.xxx.com // 网易163邮箱的 SMTP 服务器地址为: smtp.163.com // public static String myEmailSMTPHost = "smtp.126.com"; public static String myEmailSMTPHost = "smtp.163.com" ; // // 收件人邮箱(替换为自己知道的有效邮箱) // public static String receiveMailAccount = "1048471134@qq.com"; // public static void main(String[] args) throws Exception { // send("946828339@qq.com","1","as5as1a5sf5asf5af65a65f"); // } /** * 发送邮件 * @param receiveMailAccount * @throws Exception */ public static void sendEmail(String receiveMailAccount,String id,String code) throws Exception{ send(receiveMailAccount,id,code); } public static void send(String receiveMailAccount,String id,String code) throws Exception { // 1. 创建参数配置, 用于连接邮件服务器的参数配置 Properties props = new Properties(); // 参数配置 props.setProperty( "mail.transport.protocol" , "smtp" ); // 使用的协议(JavaMail规范要求) props.setProperty( "mail.smtp.host" , myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址 props.setProperty( "mail.smtp.auth" , "true" ); // 需要请求认证 // PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启), // 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误, // 打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。 // SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接, // 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助, // QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看) final String smtpPort = "465" ; props.setProperty( "mail.smtp.port" , smtpPort); props.setProperty( "mail.smtp.socketFactory.class" , "javax.net.ssl.SSLSocketFactory" ); props.setProperty( "mail.smtp.socketFactory.fallback" , "false" ); props.setProperty( "mail.smtp.socketFactory.port" , smtpPort); // 2. 根据配置创建会话对象, 用于和邮件服务器交互 Session session = Session.getDefaultInstance(props); session.setDebug( true ); // 设置为debug模式, 可以查看详细的发送 log // 3. 创建一封邮件 MimeMessage message = createMimeMessage(session, myEmailAccount, receiveMailAccount,id,code); // 4. 根据 Session 获取邮件传输对象 Transport transport = session.getTransport(); // 5. 使用 邮箱账号 和 密码 连接邮件服务器, 这里认证的邮箱必须与 message 中的发件人邮箱一致, 否则报错 // // PS_01: 成败的判断关键在此一句, 如果连接服务器失败, 都会在控制台输出相应失败原因的 log, // 仔细查看失败原因, 有些邮箱服务器会返回错误码或查看错误类型的链接, 根据给出的错误 // 类型到对应邮件服务器的帮助网站上查看具体失败原因。 // // PS_02: 连接失败的原因通常为以下几点, 仔细检查代码: // (1) 邮箱没有开启 SMTP 服务; // (2) 邮箱密码错误, 例如某些邮箱开启了独立密码; // (3) 邮箱服务器要求必须要使用 SSL 安全连接; // (4) 请求过于频繁或其他原因, 被邮件服务器拒绝服务; // (5) 如果以上几点都确定无误, 到邮件服务器网站查找帮助。 // // PS_03: 仔细看log, 认真看log, 看懂log, 错误原因都在log已说明。 transport.connect(myEmailSMTPHost, 465 , myEmailAccount, myEmailPassword); // 6. 发送邮件, 发到所有的收件地址, message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人 transport.sendMessage(message, message.getAllRecipients()); // 7. 关闭连接 transport.close(); } /** * 创建一封只包含文本的简单邮件 * * @param session 和服务器交互的会话 * @param sendMail 发件人邮箱 * @param receiveMail 收件人邮箱 * @param id 收件人id * @param code 收件人激活码 * @return * @throws Exception */ public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail,String id,String code) throws Exception { // 1. 创建一封邮件 MimeMessage message = new MimeMessage(session); // 2. From: 发件人 message.setFrom( new InternetAddress(sendMail, "Trader" , "UTF-8" )); // 3. To: 收件人(可以增加多个收件人、抄送、密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, receiveMail, "UTF-8" )); // 4. Subject: 邮件主题 message.setSubject( "Trader邮箱验证码" , "UTF-8" ); // 5. Content: 邮件正文(可以使用html标签) message.setContent( "<h3>验证码为:" +code+ "</h3><h3>verification code :" +code+ "</h3>" , "text/html;charset=UTF-8" ); // 6. 设置发件时间 message.setSentDate( new Date()); // 7. 保存设置 message.saveChanges(); return message; } /** * 发送邮件 * @param email * @return */ public static AjaxJson sendEmail(String email){ AjaxJson ajaxJson= new AjaxJson(); Long time = System.currentTimeMillis(); String strTime = String.valueOf(time); //验证码 String code = strTime.substring(strTime.length() - 6 ); try { send(email, "0000" ,code); ajaxJson.setSuccess( true ); ajaxJson.setData( "操作成功" ); ajaxJson.setMsg(code); } catch (Exception e) { e.printStackTrace(); ajaxJson.setSuccess( false ); ajaxJson.setData( "邮件发送异常" ); ajaxJson.setMsg(code); } return ajaxJson; } /*public static void main(String[] args) throws Exception { Long time = System.currentTimeMillis(); String strTime = String.valueOf(time); String code = strTime.substring(strTime.length() - 6); send("1661605308@qq.com","0000",code); }*/ public static void main(String[] args) { System.out.println(sendEmail( "1661605308@qq.com" )); } } |
其中AjaxJson 类如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package com.td.bean; /** * AjaxJson请求结果实体类 * @author 16616 * */ public class AjaxJson { //消息 private String msg; //是否成功 private boolean success; //数据实体 private Object data; public String getMsg() { return msg; } public void setMsg(String msg) { this .msg = msg; } public boolean isSuccess() { return success; } public void setSuccess( boolean success) { this .success = success; } public Object getData() { return data; } public void setData(Object data) { this .data = data; } @Override public String toString() { return "AjaxJson [msg=" + msg + ", success=" + success + ", data=" + data + "]" ; } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决