邮箱

tio-utils 内置了邮箱工具类 com.litongjava.tio.utils.email.EMailUtils 用于支持发送邮件

添加依赖

<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.5.0-b01</version>
</dependency>

or

<dependency>
  <groupId>com.sun.mail</groupId>
  <artifactId>javax.mail</artifactId>
  <version>1.6.2</version>
</dependency>

这两个依赖的区别在于它们所依赖的不同版本的 Java 邮件库,以及这些版本可能带来的改动或增强。具体如下:

1. javax.mail:mail:1.5.0-b01

  • 这是 Java 邮件 API (JavaMail) 的一个旧版本,归属于 javax.mail 组下。这个库原先是由 Sun Microsystems 维护的,后来转移到了 Oracle 旗下。
  • 版本 1.5.0 是较早的版本,某些新特性或者 bug 修复可能还没有包含在内。
  • 如果你使用这个版本,你的 Maven 配置依赖的是较旧的邮件 API 版本。

2. com.sun.mail:javax.mail:1.6.2

  • com.sun.mail 版本的依赖是 JavaMail 的较新版本,由 Oracle 分离出来并以开源的方式发布在 com.sun.mail 组下。
  • 这个库版本在 1.6.2 中做了大量的更新和 bug 修复。例如,它支持了更多的 SSL/TLS 配置选项,增强了对于非标准邮件协议的支持,并修复了一些长期存在的问题。
  • 这个版本提供了更好的稳定性和性能,也修复了一些 1.5.x 版本中的安全漏洞。

如何修改代码:

如果你切换到 com.sun.mail:javax.mail:1.6.2 依赖,代码可以基本保持不变,因为 API 本身没有大的改变。你只需要在 pom.xml 文件中替换依赖接口

总结:

  1. javax.mail:mail:1.5.0-b01 是旧的邮件库版本,功能较为基础,某些 bug 和安全问题可能没有得到修复。
  2. com.sun.mail:javax.mail:1.6.2 是较新的版本,提供更多的功能、增强的安全性和 bug 修复。

如果你需要更多的新特性、安全性,建议使用 com.sun.mail:javax.mail:1.6.2

发送邮件

使用网易 126 发送邮件

app.properties

mail.host=smtp.126.com
mail.protocol=smtp
mail.smpt.port=465
mail.user=litongjava_alarm@126.com
mail.password=g8NmXf6hcy9NexE
mail.from=litongjava_alarm

测试发送

String filename = "app.properties";
EnvUtils.load(filename);
EMailUtils.send("litongjava@qq.com", "验证码", "欢迎你登录XXX系统,你的验证码是 1234");

默认整合的邮箱是 网易 126 邮箱服务

使用 Gmail 发送邮件

app.properties

mail.host=smtp.gmail.com
mail.protocol=smtp
mail.smpt.port=465
mail.user=smtp_xxx@gmail.com
mail.password=xxxx xxxx xxxx xxxx
mail.from=smtp_alarm

import com.litongjava.tio.utils.email.EMailUtils;
import com.litongjava.tio.utils.email.GMailFactory;
import com.litongjava.tio.utils.environment.EnvUtils;

public class GmailTest {
  public static void main(String[] args) {
    EnvUtils.load("app.properties");
    EMailUtils.setEMailFactory(new GMailFactory());
    EMailUtils.send("litongjava001@gmail.com", "Adsgency AI Email Verification", "Your email verification code is 164403");
  }
}

获取 Gmail 授权码

步骤

  • 开启 google 两步验证
  • 获取授权码 不开启 google 两步验证的情况下,无法获取邮箱专用的授权码的,开启 google 两步验证需要绑定手机号

开启 google 两步验证

  1. 登录您的 Google 账户:

  2. 访问安全性设置:

    • 在 Google 账户主页上,点击左侧菜单的“安全性”选项。
  3. 找到“两步验证”: - 在“安全性”页面中,向下滚动直到您看到“登录到 Google”部分。 - 在那里,您会找到“两步验证”选项。点击“两步验证”。可能需要您输入密码再次确认身份。 https://myaccount.google.com/signinoptions/two-step-verification/enroll-welcome

  4. 开始设置两步验证:

    • 点击“开始”或“设置”开始两步验证的设置过程。
  5. 添加您的电话号码:

    • 按照屏幕上的指示添加您的电话号码。您可以选择接收验证码的方式,通常是短信或电话呼叫。
    • 输入您收到的验证码以确认电话号码的正确性。
  6. 完成设置:

    • 按照屏幕上的指示完成剩余的步骤。一旦设置成功,您将看到一个确认屏幕。
  7. (可选)添加备用验证选项:

    • 在设置了基本的电话验证之后,您还可以添加备用验证方法,例如备用电话号码、Google 提示信息、或使用 Google Authenticator 等应用生成的验证码。
  8. 生成应用程序专用密码:

    • 在您开启两步验证之后,如果您要在邮件客户端等应用中使用 Gmail,您可能需要生成一个应用程序专用的密码。这可以在您的 Google 账户的安全性部分找到,通常在“密码与登录方式”或“应用程序专用密码”部分。
    • 选择“管理应用程序专用密码”或类似选项,然后按照指示生成一个密码。这个密码将在生成时显示一次,不会再次显示,所以请在使用时确保复制并保存好。
  9. 访问 Google 账户设置:

  10. 进入安全性设置:

    • 在 Google 账户主页上,点击左侧菜单的“安全性”选项。
  11. 找到“应用程序专用密码”部分:

    • 在“安全性”页面中,向下滚动直到您看到“登录到 Google”部分。
    • 找到“应用程序专用密码”或类似的选项(这个选项只有在您已经开启两步验证后才会出现)。
  12. 生成应用程序专用密码:

    • 点击“应用程序专用密码”或类似选项。
    • 您可能需要再次输入您的账户密码进行确认。
    • 在显示的界面中,选择“选择应用”和“选择设备”来指定您要使用授权码的应用程序和设备。
    • 点击“生成”按钮,系统将为您生成一个 16 位数的授权码。
  13. 使用授权码:

    • 将生成的授权码复制下来。请注意,授权码只显示一次,所以确保在关闭窗口前复制它。
    • 在需要输入密码的地方,如邮件客户端或其他应用程序的登录界面,输入这个授权码代替您的 Google 账户密码。

获取授权码

  1. 访问 Google 账户设置:

  2. 进入安全性设置:

    • 在 Google 账户主页上,点击左侧菜单的“安全性”选项。
  3. 找到“应用程序专用密码”部分:

    • 在“安全性”页面中,向下滚动直到您看到“登录到 Google”部分。
    • 找到“应用程序专用密码”或类似的选项(这个选项只有在您已经开启两步验证后才会出现)。
  4. 生成应用程序专用密码:

    • 点击“应用程序专用密码”或类似选项。https://myaccount.google.com/signinoptions/two-step-verification
    • 您可能需要再次输入您的账户密码进行确认。
    • 在显示的界面中,选择“选择应用”和“选择设备”来指定您要使用授权码的应用程序和设备。
    • 点击“生成”按钮,系统将为您生成一个 16 位数的授权码。
  5. 使用授权码:

    • 将生成的授权码复制下来。请注意,授权码只显示一次,所以确保在关闭窗口前复制它。
    • 在需要输入密码的地方,如邮件客户端或其他应用程序的登录界面,输入这个授权码代替您的 Google 账户密码。

使用自定义邮箱

    1. 实现类 com.litongjava.tio.utils.email.EMail 重写 send 方法
  • 2.实现类 com.litongjava.tio.utils.email.IEMailFactory 重写 getMail 方法 返回 Mail
    1. 调用 com.litongjava.tio.utils.email.EMailUtils.setEMailFactory(IEMailFactory) 设置实现类
package com.litongjava.tio.utils.email;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.litongjava.tio.utils.IoUtils;
import com.litongjava.tio.utils.environment.EnvUtils;

public class Wangyi126Mail implements EMail {

  /**
   * 发送邮件
   * @param to 收件人
   * @param subject 主题
   * @param content 内容
   * @paaram isDebug 是否开启debug模式
   */
  public void send(String to, String subject, String content, boolean isDebug) {
    String mailHost = EnvUtils.get("mail.host");
    String mailTransportProtocol = EnvUtils.get("mail.protocol");

    Integer smtpPort = EnvUtils.getInt("mail.smpt.port");
    String user = EnvUtils.get("mail.user");
    String password = EnvUtils.get("mail.password");
    String from = EnvUtils.get("mail.from");
    ....

  }
}

package com.litongjava.tio.utils.email;

public class Wangyi126MailFactory implements IEMailFactory {

  @Override
  public EMail getMail() {
    return new Wangyi126Mail();
  }
}

邮件地址日志

DEBUG: setDebug: JavaMail version 1.6.2
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL false
220 smtp.gmail.com ESMTP d9443c01a7336-20c138c9934sm7985785ad.63 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
EHLO Ping-Windows
250-smtp.gmail.com at your service, [66.75.89.81]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "SMTPUTF8", arg ""
DEBUG SMTP: protocolConnect login, host=smtp.gmail.com, user=no-reply@withkimi.app, password=<non-null>
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<no-reply>
250 2.1.0 OK d9443c01a7336-20c138c9934sm7985785ad.63 - gsmtp
RCPT TO:<litonglinux@gmail.com>
250 2.1.5 OK d9443c01a7336-20c138c9934sm7985785ad.63 - gsmtp
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   litonglinux@gmail.com
DATA
354  Go ahead d9443c01a7336-20c138c9934sm7985785ad.63 - gsmtp
Date: Fri, 4 Oct 2024 20:52:49 -1000 (HST)
From: no-reply
To: litonglinux@gmail.com
Message-ID: <375591241.0.1728111169768@smtp.gmail.com>
Subject: =?UTF-8?B?6aqM6K+B56CB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

5L2g55qE6aqM6K+B56CB5pivMTIzNDU2
.
250 2.0.0 OK  1728111248 d9443c01a7336-20c138c9934sm7985785ad.63 - gsmtp
DEBUG SMTP: message successfully delivered to mail server
QUIT
221 2.0.0 closing connection d9443c01a7336-20c138c9934sm7985785ad.63 - gsmtp