Anschluss_zeit
本帖最后由 MinecraftE_D 于 2021-8-20 15:05 编辑

我使用JavaMail来写恢复密码的时候,遇到了一个问题  就是这样子的  插件是1.16.4 PaperSpigot的  
  1. [14:53:19 WARN]: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 465;
  2. [14:53:19 WARN]:   nested exception is:
  3. [14:53:19 WARN]:        javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
  4. [14:53:19 WARN]:        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)
  5. [14:53:19 WARN]:        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
  6. [14:53:19 WARN]:        at javax.mail.Service.connect(Service.java:317)
  7. [14:53:19 WARN]:        at javax.mail.Service.connect(Service.java:176)
  8. [14:53:19 WARN]:        at javax.mail.Service.connect(Service.java:125)
  9. [14:53:19 WARN]:        at javax.mail.Transport.send0(Transport.java:253)
  10. [14:53:19 WARN]:        at javax.mail.Transport.send(Transport.java:124)
  11. [14:53:19 WARN]:        at plugins.wnplugin.util.TestUtil.send(TestUtil.java:52)
  12. [14:53:19 WARN]:        at plugins.wnplugin.Mail.run(Mail.java:16)
  13. [14:53:19 WARN]:        at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftTask.run(CraftTask.java:100)
  14. [14:53:19 WARN]:        at org.bukkit.craftbukkit.v1_16_R3.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:54)
  15. [14:53:19 WARN]:        at com.destroystokyo.paper.ServerSchedulerReportingWrapper.run(ServerSchedulerReportingWrapper.java:22)
  16. [14:53:19 WARN]:        at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
  17. [14:53:19 WARN]:        at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
  18. [14:53:19 WARN]:        at java.lang.Thread.run(Unknown Source)
  19. [14:53:19 WARN]: Caused by: javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
  20. [14:53:19 WARN]:        at sun.security.ssl.HandshakeContext.<init>(Unknown Source)
  21. [14:53:19 WARN]:        at sun.security.ssl.ClientHandshakeContext.<init>(Unknown Source)
  22. [14:53:19 WARN]:        at sun.security.ssl.TransportContext.kickstart(Unknown Source)
  23. [14:53:19 WARN]:        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
  24. [14:53:19 WARN]:        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
  25. [14:53:19 WARN]:        at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:527)
  26. [14:53:19 WARN]:        at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:332)
  27. [14:53:19 WARN]:        at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:208)
  28. [14:53:19 WARN]:        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)
  29. [14:53:19 WARN]:        ... 14 more
复制代码
我换了很多种写法都不行  
还尝试了网上的删除SSLv3的那种方法,也不行  
在本地是telnet得通的  
防火墙也放行了465端口  
不是多线程原因,已经试过了  
代码附在下面,求大神指点  

MailUtil.java  
  1. package plugins.wnplugin.util;

  2. import org.bukkit.ChatColor;
  3. import plugins.wnplugin.WnPlugin;
  4. import plugins.wnplugin.config.MailConfig;

  5. import java.io.UnsupportedEncodingException;
  6. import java.util.Date;
  7. import java.util.Properties;

  8. import javax.mail.*;
  9. import javax.mail.internet.InternetAddress;
  10. import javax.mail.internet.MimeMessage;

  11. public class MailUtil {
  12.     public static boolean sendMail(String receiveMailAccount, String subject, String content) {
  13.         MailConfig.reload();
  14.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "reload!");
  15.         Properties props = new Properties();
  16.         props.setProperty("mail.transport.protocol", "smtp");
  17.         props.setProperty("mail.smtp.host", MailConfig.getMailHost());
  18.         props.setProperty("mail.smtp.auth", "true");
  19.         String smtpPort = MailConfig.getEmailSmtpPort();
  20.         props.setProperty("mail.smtp.port", smtpPort);
  21.         if (MailConfig.getSslAuthVerify()) {
  22.             props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  23.             props.setProperty("mail.smtp.socketFactory.fallback", "false");
  24.             props.setProperty("mail.smtp.socketFactory.port", smtpPort);
  25.             props.setProperty("mail.smtp.ssl.enable", "true");
  26.         }
  27.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "1 no");
  28.         String emailAccount = MailConfig.getEmailAccount();
  29.         String emailPassword = MailConfig.getEmailPwd();
  30.         Session session = Session.getInstance(props);
  31.         session.setDebug(MailConfig.getEnableDebug());
  32.         MimeMessage message = new MimeMessage(session);

  33.         try {
  34.             message.setFrom(new InternetAddress(emailAccount,MailConfig.getEmailTheme(), "UTF-8"));
  35.         } catch (MessagingException | UnsupportedEncodingException e) {
  36.             e.printStackTrace();
  37.             return false;
  38.         }
  39.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "2 no");
  40.         try {
  41.             message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMailAccount, "", "UTF-8"));
  42.         } catch (MessagingException | UnsupportedEncodingException e) {
  43.             e.printStackTrace();
  44.             return false;
  45.         }
  46.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "3 no");
  47.         try {
  48.             message.setSubject(subject, "UTF-8");
  49.         } catch (MessagingException e) {
  50.             e.printStackTrace();
  51.             return false;
  52.         }
  53.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "4 no");
  54.         try {
  55.             message.setContent(content, "text/html; charset=UTF-8");
  56.         } catch (MessagingException e) {
  57.             e.printStackTrace();
  58.             return false;
  59.         }
  60.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "5 no");
  61.         try {
  62.             message.setSentDate(new Date());
  63.         } catch (MessagingException e) {
  64.             e.printStackTrace();
  65.             return false;
  66.         }
  67.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "6 no");
  68.         try {
  69.             message.saveChanges();
  70.         } catch (MessagingException e) {
  71.             e.printStackTrace();
  72.             return false;
  73.         }
  74.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "7 no");
  75.         Transport transport;
  76.         try {
  77.             transport = session.getTransport();
  78.         } catch (NoSuchProviderException e) {
  79.             e.printStackTrace();
  80.             return false;
  81.         }
  82.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "8 no");
  83.         try {
  84.             if (transport != null) {
  85.                 transport.connect(emailAccount, emailPassword);
  86.                 return false;
  87.             }
  88.         } catch (MessagingException e) {
  89.             e.printStackTrace();
  90.             return false;
  91.         }
  92.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "9 no");
  93.         try {
  94.             if (transport != null) {
  95.                 transport.sendMessage(message, message.getAllRecipients());
  96.             }
  97.         } catch (MessagingException e) {
  98.             e.printStackTrace();
  99.             return false;
  100.         }
  101.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "10 no");
  102.         try {
  103.             if (transport != null) {
  104.                 transport.close();
  105.                 return false;
  106.             }
  107.         } catch (MessagingException e) {
  108.             e.printStackTrace();
  109.             return false;
  110.         }
  111.         WnPlugin.instance.getLogger().info(ChatColor.BLUE + "11 no");
  112.         return true;
  113.     }
  114. }
复制代码
MailConfig.java  
  1. package plugins.wnplugin.config;

  2. import org.bukkit.ChatColor;
  3. import org.bukkit.configuration.file.FileConfiguration;
  4. import org.bukkit.configuration.file.YamlConfiguration;
  5. import org.bukkit.plugin.Plugin;
  6. import plugins.wnplugin.WnPlugin;

  7. import java.io.File;

  8. public class MailConfig {
  9.     private static Plugin plugin = WnPlugin.getPlugin(WnPlugin.class);
  10.     private static FileConfiguration config;
  11.     private static String emailAccount;
  12.     private static String emailPwd;
  13.     private static String mailHost;
  14.     private static String emailSmtpPort;
  15.     private static Boolean sslAuthVerify;
  16.     private static Boolean enableDebug;
  17.     private static String emailTheme;
  18.     private static String emailTitle;
  19.     private static String emailContent;

  20.     public static String getMailHost() {
  21.         return mailHost;
  22.     }

  23.     public static String getEmailAccount() {
  24.         return emailAccount;
  25.     }

  26.     public static String getEmailPwd() {
  27.         return emailPwd;
  28.     }

  29.     public static String getEmailSmtpPort() {
  30.         return emailSmtpPort;
  31.     }

  32.     public static Boolean getSslAuthVerify() {
  33.         return sslAuthVerify;
  34.     }

  35.     public static Boolean getEnableDebug() {
  36.         return enableDebug;
  37.     }

  38.     public static String getEmailTheme() {
  39.         return emailTheme;
  40.     }

  41.     public static String getEmailTitle() {
  42.         return emailTitle;
  43.     }

  44.     public static String getEmailContent() {
  45.         return emailContent;
  46.     }

  47.     public static void reload() {
  48.         plugin.reloadConfig();
  49.         config = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder(), "mail.yml"));
  50.         emailAccount = config.getString("email");
  51.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + emailAccount);
  52.         emailPwd = config.getString("password");
  53.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + emailPwd);
  54.         mailHost = config.getString("smtp_host");
  55.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + mailHost);
  56.         emailSmtpPort = config.getString("port");
  57.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + emailSmtpPort);
  58.         sslAuthVerify = config.getBoolean("enable_ssl");
  59.         enableDebug = config.getBoolean("debug");
  60.         emailTheme = config.getString("theme");
  61.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + emailTheme);
  62.         emailTitle = config.getString("title");
  63.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + emailTitle);
  64.         emailContent = config.getString("content");
  65.         WnPlugin.instance.getLogger().info(ChatColor.LIGHT_PURPLE + emailContent);
  66.     }

  67.     static {
  68.         config = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder(), "mail.yml"));
  69.         emailAccount = config.getString("email");
  70.         emailPwd = config.getString("password");
  71.         mailHost = config.getString("smtp_host");
  72.         emailSmtpPort = config.getString("emailSmtpPort");
  73.         sslAuthVerify = config.getBoolean("enable_ssl");
  74.         enableDebug = config.getBoolean("debug");
  75.         emailTheme = config.getString("theme");
  76.         emailTitle = config.getString("title");
  77.         emailContent = config.getString("content");
  78.     }
  79. }
复制代码
Mail.java  
  1. package plugins.wnplugin;

  2. import org.bukkit.scheduler.BukkitRunnable;
  3. import plugins.wnplugin.config.MailConfig;
  4. import plugins.wnplugin.util.MailUtil;

  5. public class Mail extends BukkitRunnable {
  6.     @Override
  7.     public void run(){
  8.         MailUtil.sendMail("[email protected]", MailConfig.getEmailTitle(),MailConfig.getEmailContent());
  9.     }
  10. }
复制代码
最后启动线程在这里  
  1. BukkitTask task = new Mail().runTaskAsynchronously(this);
复制代码




结冰的离季
本帖最后由 结冰的离季 于 2021-8-20 15:24 编辑

jdk的ssl权限开了吗,有人是换jdk解决的有人是开ssl解决的
报错行的代码呢
https://blog.csdn.net/weixin_44729221/article/details/117783087

java - javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate - Stack Overflow
TLSv1/v1.1 No longer works after upgrade, "No appropriate protocol" error – Azul Systems






Anschluss_zeit
结冰的离季 发表于 2021-8-20 15:17
jdk的ssl权限开了吗,有人是换jdk解决的有人是开ssl解决的
报错行的代码呢
https://blog.csdn.net/weixin_4 ...

更改过后不再报错,但是出现了以下DEBUG信息,并且未收到邮件  
  1. [15:38:30 INFO]: 220 newxmesmtplogicsvrszb6.qq.com XMail Esmtp QQ Mail Server.
  2. [15:38:30 INFO]: DEBUG SMTP: connected to host "smtp.qq.com", port: 465
  3. [15:38:30 INFO]:
  4. [15:38:35 INFO]: EHLO Minecraft-GCB
  5. [15:38:35 INFO]: 250-newxmesmtplogicsvrszb6.qq.com
  6. [15:38:35 INFO]: 250-PIPELINING
  7. [15:38:35 INFO]: 250-SIZE 73400320
  8. [15:38:35 INFO]: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
  9. [15:38:35 INFO]: 250-AUTH=LOGIN
  10. [15:38:35 INFO]: 250-MAILCOMPRESS
  11. [15:38:35 INFO]: 250 8BITMIME
  12. [15:38:35 INFO]: DEBUG SMTP: Found extension "PIPELINING", arg ""
  13. [15:38:35 INFO]: DEBUG SMTP: Found extension "SIZE", arg "73400320"
  14. [15:38:35 INFO]: DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2"
  15. [15:38:35 INFO]: DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
  16. [15:38:35 INFO]: DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
  17. [15:38:35 INFO]: DEBUG SMTP: Found extension "8BITMIME", arg ""
  18. [15:38:35 INFO]: DEBUG SMTP: STARTTLS requested but already using SSL
  19. [15:38:35 INFO]: DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
  20. [15:38:35 INFO]: DEBUG SMTP: AUTH LOGIN command trace suppressed
  21. [15:38:35 INFO]: DEBUG SMTP: AUTH LOGIN succeeded
复制代码

Anschluss_zeit
结冰的离季 发表于 2021-8-20 15:17
jdk的ssl权限开了吗,有人是换jdk解决的有人是开ssl解决的
报错行的代码呢
https://blog.csdn.net/weixin_4 ...

并且我用了别的插件进行测试,保证授权码,邮箱,发送对象均无误

结冰的离季
MinecraftE_D 发表于 2021-8-20 15:43
并且我用了别的插件进行测试,保证授权码,邮箱,发送对象均无误

翻他代码=V=

Anschluss_zeit

好家伙,它的代码我复制出来跑着报错,和最上面一样

结冰的离季
本帖最后由 结冰的离季 于 2021-8-20 16:08 编辑
MinecraftE_D 发表于 2021-8-20 15:59
好家伙,它的代码我复制出来跑着报错,和最上面一样

你是不是少了一些信息
  1. // 创建Properties 类用于记录邮箱的一些属性
  2. Properties props = new Properties();
  3. // 表示SMTP发送邮件,必须进行身份验证
  4. props.put("mail.smtp.auth", "true");
  5. //此处填写SMTP服务器
  6. props.put("mail.smtp.host", "smtp.qq.com");
  7. //端口号,QQ邮箱端口587
  8. props.put("mail.smtp.port", "587");
  9. // 此处填写,写信人的账号
  10. props.put("mail.user", "[email protected]");
  11. // 此处填写16位STMP口令
  12. props.put("mail.password", "xxxxxxxx");
复制代码

枫叶随风飘
看不懂,呜呜呜