检查邮件服务器 SMTPUTF8 支持

Check for mail server SMTPUTF8 support

我有一个系统,(注册)用户可以添加他们自己的 SMTP 服务器来发送邮件。因此我事先不知道用户可能添加什么服务器以及这个服务器是否支持 SMTPUTF8。现在从 JavaMail 1.6 support 开始添加了 SMTPUTF8。 为某些服务器启用此功能后,以下行将打印到日志中:

mail.mime.allowutf8 set but server doesn't advertise SMTPUTF8 support

这对于该服务器是正确的,但是我如何检测服务器是否支持它?我看到两种可能性:

  1. 以某种方式检测邮件服务器是否支持 SMTPUTF8 - 如果可能的话?
  2. 向 stmp 配置添加另一个参数,然后由用户决定(在大多数情况下他们并不真正知道我猜)

那么有没有办法检测服务器是否支持SMTPUTF8?

我检查了实现,com.sun.mail.SMTPTransport 似乎提供了这样的查询可能性。

public boolean supportsExtension(String ext)

所以打电话

SMTPTransport transport = new SMTPTransport(...);
boolean smtputf8 = transport.supportsExtension("SMTPUTF8");

应该可以。它在连接到服务器时使用 EHLO command(在 rfc1869 中定义)。但是在我的实现中我只是调用

...
Transport.send(Message msg);

所以我没有直接访问SMTPTransport。应该不会直接访问 com.sun 包吧?

通过 EHLO 命令使用 ESMTP 可以查询 smtp 服务器以获取支持的扩展。 mail.smtp.ehlo=true; 必须启用。

boolean detectUTF8(String smtpServerHost, int smtpServerPort,  String smtpUserName, String smtpUserAccessToken) {
    
    Transport transport = null;
    try {
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props);
        //session.setDebug(true);

        transport = session.getTransport();
        transport.connect(smtpServerHost, smtpServerPort, smtpUserName, smtpUserAccessToken);
            
        if(transport instanceof SMTPTransport || transport instanceof SMTPSSLTransport) {
            return ((SMTPTransport)transport).supportsExtension("SMTPUTF8");
        }
        return false;
    } 
    catch (Exception ex) {
        //Proper loggin & exception handling!!!
        //return false;
    }
    finally {
        if(transport!=null) {
            try {
                transport.close();
            }
            catch (MessagingException e) {
            }
        }
    }
}

如果 supportsExtension(...) 方法能够进入 Transport 界面,以便可以使用 javax.mail 就好了。