首页>>后端>>SpringBoot->Java Email邮件阿里云发不了怎么处理?

Java Email邮件阿里云发不了怎么处理?

时间:2023-11-30 本站 点击:1

最近升级了一下SpringBoot的版本,结果发现之前工作的好好的邮件突然罢工了,罢工的原因还不止一个,接下来记录一下解决方案

1. Couldn't connect to host, port: smtp.163.com, 25; timeout -1

这个异常提示就有点搞人了,连接超时,之前可以现在居然不行,感觉是被针对了啊

上面这个问题,主要原因在于端口号的限制,如果项目中是使用SpringBoot封装的email客户端,可以调整一下配置参数

spring:#邮箱配置mail:host:smtp.163.comfrom:xhhuiblog@163.com#使用自己的发送方用户名+授权码填充username:password:default-encoding:UTF-8port:465properties:mail:smtp:socketFactory:port:465class:javax.net.ssl.SSLSocketFactoryfallback:falseauth:truestarttls:enable:truerequired:true

重点注意几个新增的配置

spring:mail:port:465properties:mail:smtp:socketFactory:port:465class:javax.net.ssl.SSLSocketFactoryfallback:false

2. JavaMailSender no object DCH for MIME type multipart/mixed

从堆栈信息上来看,主要问题貌似是MIME不合法,从网上检索来的结果来看,大概是因为版本的问题,导致META-INF下的数据加载异常

参考 https://stackoverflow.com/questions/21856211/javax-activation-unsupporteddatatypeexception-no-object-dch-for-mime-type-multi 这个问答里的解决方案

方案一:设置MailcapCommandMap

在具体的发送之前,添加下面这段代码

//OriginalanswerfromSom:MailcapCommandMapmc=(MailcapCommandMap)CommandMap.getDefaultCommandMap();mc.addMailcap("text/html;;x-java-content-handler=com.sun.mail.handlers.text_html");mc.addMailcap("text/xml;;x-java-content-handler=com.sun.mail.handlers.text_xml");mc.addMailcap("text/plain;;x-java-content-handler=com.sun.mail.handlers.text_plain");mc.addMailcap("multipart/*;;x-java-content-handler=com.sun.mail.handlers.multipart_mixed");mc.addMailcap("message/rfc822;;x-java-content-handler=com.sun.mail.handlers.message_rfc822");//AdditionalelementstomakeDSNworkmc.addMailcap("multipart/report;;x-java-content-handler=com.sun.mail.dsn.multipart_report");mc.addMailcap("message/delivery-status;;x-java-content-handler=com.sun.mail.dsn.message_deliverystatus");mc.addMailcap("message/disposition-notification;;x-java-content-handler=com.sun.mail.dsn.message_dispositionnotification");mc.addMailcap("text/rfc822-headers;;x-java-content-handler=com.sun.mail.dsn.text_rfc822headers");

实测结果:依然没有解决问题

方案二: 指定activation版本

<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.1</version></dependency><dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version></dependency>

基于上面这种方案,要求我们使用的客户端是javax.mail,然而SpringBoot-Email封装是jakarta,.mail它做的

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>

放弃了使用这种姿势进行尝试

方案三:setContextClassLoader

这种方式比较简单,在执行邮件发送前,添加下面这一行代码

Thread.currentThread().setContextClassLoader(javax.mail.Message.class.getClassLoader());

实测结果:可行

根据描述结果来看,主要是通过这一个声明来允许加载META-INF/mailcap

allow javax.activation bundle to load the "META-INF/mailcap" resource from the javax.mail bundle

微信公众号:一灰灰blog


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/SpringBoot/4355.html