当前位置: 首页 > news >正文

使用Exchange Web Services(EWS)API实现发送Outlook邮件

一、背景

  1、框架和语言:SpringMVC、Java

  2、使用的是Outlook邮箱服务器,由外地公司邮箱管理员管理(不好沟通)。

  3、需求:系统根据业务需求自动发邮件到员工邮箱。

二、走的弯路

    刚开始我直接用以前用过的org.springframework.mail.javamail.JavaMailSenderImpl实现,报错类似

Caused by: javax.mail.AuthenticationFailedException: 535 5.7.139 Authentication unsuccessful, SmtpClientAuthentication is disabled for the Tenant. Visit https://XXXX for more information. [HK2PR04CA0071.apcprd04.prod.outlook.com]
AI问了一通大概意思是需要邮箱管理员开启一下SMTP协议,使能够启用身份验证的客户SMTP提交(SMTP Auth)。

      找了管理员,他也找不到这个设置,没办法开启。又搜索+AI问了一通得知Outlook邮箱的安全验证问题,可以用 exchange协议解决。

三、核心代码

pom.xml添加ews包

  <dependency>
            <groupId>com.microsoft.ews-java-api</groupId>
            <artifactId>ews-java-api</artifactId>
            <version>2.0</version>
        </dependency>
package ...

import ....


@Component("eMailHandler")
public class EMailHandler {

    private static Logger logger = LoggerFactory.getLogger(EMailHandler.class);

    public boolean sendEMail(MailModel mailModel){
        try{
            ExchangeService service = new ExchangerServiceSSLVerify(ExchangeVersion.Exchange2010_SP2);
            ExchangeCredentials credentials = new WebCredentials(mailModel.getMailFrom(), mailModel.getMailPassword());
            service.setCredentials(credentials);
            service.setUrl(new URI("https://" + mailModel.getMailHost() + "/EWS/Exchange.asmx"));
        //        service.setTraceEnabled(true);  //是否启用ExchangeService的跟踪功能,用于调试
            EmailMessage msg = new EmailMessage(service);
            msg.setSubject(mailModel.getSubjectName());

            // 设置邮件内容并添加签名
            StringBuilder contentWithSignature = new StringBuilder(mailModel.getContent());
            contentWithSignature.append("<br/><br/>");
            contentWithSignature.append("------------------------------------<br/>");
            if (mailModel.getSigns() != null && mailModel.getSigns().length > 0) {
                for (String signText : mailModel.getSigns()) {
                    contentWithSignature.append(signText).append("<br/>");
                }
            }
            
         
       msg.setBody(MessageBody.getMessageBodyFromText(contentWithSignature.toString()));
            for (String mailTo : mailModel.getMailTo()){
                    msg.getToRecipients().add(mailTo);   //接受人邮箱
            }
 
            msg.sendAndSaveCopy();  //发送现有电子邮件并保存到已发送
        } catch (Exception e) {
            logger.error("******sendEMail邮件发送异常*******", e);
            return false;
        }
        return true;
    }

}
mailModel.getMailFrom() 负责发送邮件的邮箱地址
mailModel.getMailPassword()) 邮箱账号密码
mailModel.getMailHost() 邮箱服务器
mailModel.getSubjectName() 标题/主题
mailModel.getContent() 内容
mailModel.getSigns() 签名
mailModel.getMailTo() 邮件接收人邮箱地址数组

四、遇到的错误

在网上找到的代码,其中有一行在创建WebCredentials的时候使用的构造函数是三个参数的,最后一位是mailModel.getDomain()是邮箱服务器域名:

 ExchangeCredentials credentials = new WebCredentials(mailModel.getMailFrom(), mailModel.getMailPassword(),mailModel.getDomain());

报错如下:

可能域名配置得不对,也不清楚应该是多少,直接去掉这个参数就没问题了!

相关文章:

  • 《C#上位机开发从门外到门内》3-1:串口调试助手
  • 卷积神经网络 - 卷积的互相关
  • 用Lua脚本实现Redis原子操作
  • 【ARMv7汇编编程语言】
  • 用Scrum敏捷的视角看《哪吒2》的创作
  • 设计模式之组合模式:原理、实现与应用
  • Cursor+MCP,解锁AI更多可能!
  • 【eNSP实战】配置端口映射(NAT Server)
  • allWebPlugin中间件自动适应Web系统多层iframe嵌套
  • PostgreSQL技术内幕26:PG聚合算子实现分析
  • 【leetcode hot 100 101】对称二叉树
  • Vue开发者工具(VueDevtools)下载与安装
  • Huggingface科研代码学习(自定义模型开发)
  • SpringBoot 第一课(Ⅰ)--框架结构
  • 订单超时自动取消功能如何设计
  • 自然语言处理预训练模型的研究综述
  • C++——STL 常用的排序算法
  • C++使用ZeroMQ和MessagePack实现简单又轻量级的RPC框架
  • Spring是如何管理事务的
  • Blender-MCP服务源码2-依赖分析
  • 硅料收储挺价“小作文”发酵光伏板块罕见大涨,知情人士:确实在谈
  • 市场监管总局等五部门约谈外卖平台企业
  • 演员黄晓明、金世佳进入上海戏剧学院2025年博士研究生复试名单
  • 朝着解决问题的正确方向迈进——中美经贸高层会谈牵动世界目光
  • 深一度|在亚马尔的天才面前,姆巴佩戴上“帽子”又如何
  • 长沙潮宗街内“金丝楠木老屋文旅博物馆”起火:明火已扑灭,无伤亡