Skip to content

Latest commit

 

History

History
109 lines (78 loc) · 5.94 KB

4-3.md

File metadata and controls

109 lines (78 loc) · 5.94 KB

4-3 JavaMail

邮件的作用

插件需要邮件做什么呢?似乎没什么用(笑)。

其实还是有的,有时候服务端可能会想通过邮件发送通知,邮件还可以用于重设密码等等。

不过对于大多数现代服务器的组织方式,邮件似乎已经是个「老古董」了,尽管如此,邮件看起来比较正式,因此我们还是介绍一下。如果只需要学习一点点内容就可以让服务器多一项功能,那为什么不这样做呢?

JavaMail

纯粹的 Java 发送邮件,可能需要和 SMTP 服务器(发件服务器)进行很多次数据沟通,这很麻烦,不过幸运的是(又来了),Sun(Java 的开发公司)为我们提供了 JavaMail 类库,用于方便地进行邮件收发(其实主要是发送,对于插件而言)。这又是一个好轮子

我们可以在 JavaMail 发行页面 下载 JavaMail 的类库,下载 javax.mail.jar 即可。下载后同样保存到一个找到的的地方。

邮箱配置

一般的插件都只使用发件功能,因此我们也只介绍发件,收件功能其实和发件差不多。

发送邮件时,我们只需要把邮件送达 SMTP 服务器就可以了。SMTP 就是发件服务器,相当于现实生活的邮局。

我们需要从服主那里获得 SMTP 服务器(哪个邮件服务商),用户名,授权码等内容。其中授权码是一个比较有趣的部分。

?> 到底怎么回事
最早的时候,SMTP 服务器的密码就是注册邮件服务商时候用的密码。
但是,随着对邮件的依赖减少,SMTP 这项功能被逐渐削弱,取而代之的是各个服务商自己实现的方法。
在像 QQ 邮箱一类的邮箱中,你的登录密码并不是 SMTP 密码,这些邮件服务商使用一种被称为授权码的东西来连接,这个授权码才是 SMTP 的密码。
授权码需要在你的邮箱设置中获取。由于不同邮件服务商的 SMTP 开启和获得授权码的方法不一致,我们在这里就不做介绍了,有需要可以自行搜索。

不管怎样,这不是我们应该关心的内容,那是服主要管的事情~只要上面那些信息都集齐了就可以了。

发送一封邮件

发送一封邮件有几个步骤。

获得与邮件服务器的对话

这相当于登录,客户端与 SMTP 进行握手,确认身份信息,准备发送邮件。

首先我们要从服主那里取得连接信息。

final String SMTP_HOST = "smtp-mail.outlook.com"; // SMTP 服务器地址
final String PORT = "25"; // SMTP 端口
final String TIMEOUT = "1000"; // 超时设置
final String USERNAME = "[email protected]"; // 使用的邮箱
final String PASSWORD = "********"; // 授权码或密码

然后进行连接:

Properties properties = new Properties(); // Properties 收集信息
properties.setProperty("mail.transport.protocol", "SMTP"); // 为了使用 SMTP
properties.setProperty("mail.smtp.host", SMTP_HOST); // 设置服务器
properties.setProperty("mail.smtp.port", PORT); // 设置端口
properties.setProperty("mail.smtp.auth", "true"); // 不会现在还有哪个邮件服务商不需要验证的吧?
properties.setProperty("mail.smtp.timeout", TIMEOUT); // 避免超时
Authenticator authenticator = new Authenticator() { // 以下代码是进行验证的标准代码,从此开始
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(USERNAME, PASSWORD);
    }
}; // 到此结束
Session session = Session.getInstance(properties, authenticator); // 建立连接

!> 当心
和上一章一样,虽然服务端的执行很快,但邮件服务器的响应没有那么快,我们需要使用 BukkitRunnable 进行异步处理以免出现卡服现象。

编写和发送

这相当于我们平时写邮件时填写各种信息。这部分可以从服主那里获取以按照服务器的规范发送邮件,也可以自己决定。

try {
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(USERNAME));
    // 发件人,如果和登录用的地址不一样,有些 SMTP 服务器不发(认为是盗用)
    final String PLAYER_MAIL = "[email protected]";
    // 收件人,一般是玩家邮箱
    final String MAIL_HTML = "<!DOCTYPE html><html>HTML 文本内容</html>";
    // 邮件正文,应当从配置读取
    final String SUBJECT = "主题内容";
    // 主题,建议不要为空,否则有些 IMAP 服务器不收这种邮件(会视为垃圾邮件丢掉)
    msg.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(PLAYER_MAIL));
    // 设置收件人
    msg.setSubject(SUBJECT);
    msg.setContent(MAIL_HTML, "text/html;charset=utf-8");
    // 你甚至可以把本站通过 HTML 发给客户!但大多数邮件客户端都禁止邮件使用 JavaScript(不会执行)
    msg.saveChanges(); // 保存一下
    Transport.send(msg); // 无连接发送
} catch (MessagingException e) {
    e.printStackTrace();
}

有注释说明,应该很简单。唯一要注意的是邮件客户端可能不能完整地支持 HTML 文本。

如果不会 HTML,不要强求,使用纯文本也是可以的。

另外有几个类和 java.net 中的类同名,别导入错了!以下是应该导入的类:

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

?> 到底怎么回事
邮件客户端没有统一的标准,虽然大多数都实现了浏览器的功能,但 HTML 可能无法被完整地支持。因此建议除了 HTML 以外,将纯文本内容也附在邮件中,这可以减少因 HTML 未能渲染而导致的阅读困难。
另外,在邮件中使用 JavaScript 绝对不是个好主意(你自己试试看不就知道了)!

这样,一封邮件就发出去了。很简单吧?