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

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

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


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



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

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


spring:
  #邮箱配置
  mail:
    host: smtp.163.com
    from: xhhuiblog@163.com
    # 使用自己的发送方用户名 + 授权码填充
    username: 
    password: 
    default-encoding: UTF-8
    port: 465
    properties:
      mail:
        smtp:
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory
            fallback: false
          auth: true
          starttls:
            enable: true
            required: true
复制代码


重点注意几个新增的配置

spring:
  mail:
    port: 465
    properties:
      mail:
        smtp:
          socketFactory:
                        port: 465
                        class: javax.net.ssl.SSLSocketFactory
                        fallback: false
复制代码


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



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


参考 stackoverflow.com/questions/2… 这个问答里的解决方案


方案一:设置MailcapCommandMap


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

// Original answer from Som:
MailcapCommandMap mc = (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");
// Additional elements to make DSN work 
mc.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



相关文章
|
6月前
|
Java 关系型数据库 应用服务中间件
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
阿里云RDS购买Linux完整过程——安装java环境并跑起来tomcat
97 0
|
6月前
|
弹性计算 前端开发 小程序
微信小程序上传文件至阿里云OSS直传(java后端签名+前端直传)
当前的通用文件上传方式是通过前端上传到服务器,再由服务器转存至对象存储。这种方式在处理小文件时效率尚可,但大文件上传因受限于服务器带宽,速度较慢。例如,一个100MB的文件在5Mbps带宽的阿里云ECS上上传至服务器需160秒。为解决此问题,可以采用后端签名的方式,使微信小程序直接上传文件到阿里云OSS,绕过服务器中转。具体操作包括在JAVA后端引入相关依赖,生成签名,并在微信小程序前端使用这个签名进行文件上传,注意设置正确的请求头和formData参数。这样能提高大文件上传的速度。
1109 1
|
2月前
|
存储 SQL 分布式计算
Java连接阿里云MaxCompute例
要使用Java连接阿里云MaxCompute数据库,首先需在项目中添加MaxCompute JDBC驱动依赖,推荐通过Maven管理。避免在代码中直接写入AccessKey,应使用环境变量或配置文件安全存储。示例代码展示了如何注册驱动、建立连接及执行SQL查询。建议使用RAM用户提升安全性,并根据需要配置时区和公网访问权限。具体步骤和注意事项请参考阿里云官方文档。
消息中间件 缓存 监控
116 0
|
3月前
|
Java 开发工具
通过Java SDK调用阿里云模型服务
在阿里云平台上,可以通过创建应用并使用模型服务完成特定任务,如生成文章内容。本示例展示了一段简化的Java代码,演示了如何调用阿里云模型服务生成关于“春秋战国经济与文化”的简短文章。示例代码通过设置系统角色为历史学家,并提出文章生成需求,最终处理并输出生成的文章内容。在实际部署前,请确保正确配置环境变量中的密钥和ID,并根据需要调整SDK导入语句及类名。更多详情和示例,请参考相关链接。
|
3月前
|
机器学习/深度学习 存储 缓存
Java本地高性能缓存实践问题之阿里云机器学习团队开源社区的问题如何解决
Java本地高性能缓存实践问题之阿里云机器学习团队开源社区的问题如何解决
|
6月前
|
Java
使用java底层实现邮件的发送(含测试,源码)
使用java底层实现邮件的发送(含测试,源码)
|
5月前
|
Java 对象存储
java对接阿里云OSS上传
java对接阿里云OSS上传
377 2
|
4月前
|
Java API Maven
如何在Java中实现邮件发送功能?
如何在Java中实现邮件发送功能?
|
5月前
|
Java 对象存储
阿里云OSS上传下载文件java
阿里云OSS上传下载文件java
350 0