微软 EWS 邮件开发:Spring 框架下 Java 发送附件与抄送的实现

在 Spring 框架下,使用 Java 通过微软 Exchange Web Services (EWS) 发送邮件(包括附件和抄送功能)需要依赖 EWS Java API 库。下面我将逐步指导您完成实现过程。整个过程分为四个步骤:添加依赖、配置 EWS 服务、构建邮件消息(含附件和抄送)、发送邮件。代码示例基于 Spring Boot 环境,确保真实可靠。

步骤 1: 添加 Maven 依赖

首先,在您的 pom.xml 文件中添加 EWS Java API 库的依赖。EWS API 提供了与 Exchange Server 交互的核心功能。

<dependencies>
    <!-- Spring Boot Starter Mail 用于基础邮件支持(可选,但推荐) -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <!-- EWS Java API -->
    <dependency>
        <groupId>com.microsoft.ews-java-api</groupId>
        <artifactId>ews-java-api</artifactId>
        <version>2.0</version> <!-- 使用最新稳定版 -->
    </dependency>
</dependencies>

步骤 2: 配置 EWS 服务

在 Spring 中创建一个服务类,用于初始化 EWS 客户端。需要提供 Exchange 服务器的 URL、用户名和密码(建议从配置文件读取,避免硬编码)。

import com.microsoft.exchange.webservices.data.core.ExchangeService;
import com.microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import com.microsoft.exchange.webservices.data.credential.WebCredentials;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.net.URI;

@Service
public class EwsService {

    @Value("${ews.url}") // 从 application.properties 读取配置
    private String ewsUrl;

    @Value("${ews.username}")
    private String username;

    @Value("${ews.password}")
    private String password;

    public ExchangeService createExchangeService() throws Exception {
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
        service.setCredentials(new WebCredentials(username, password));
        service.setUrl(new URI(ewsUrl)); // 示例: https://outlook.office365.com/EWS/Exchange.asmx
        return service;
    }
}

application.properties 文件中添加配置:

ews.url=https://your-exchange-server/EWS/Exchange.asmx
ews.username=your-username
ews.password=your-password

步骤 3: 构建邮件消息(含附件和抄送)

创建一个邮件服务类,处理邮件构建逻辑。包括设置收件人、抄送人、主题、正文和附件。

import com.microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import com.microsoft.exchange.webservices.data.misc.FileAttachment;
import com.microsoft.exchange.webservices.data.property.complex.EmailAddress;
import com.microsoft.exchange.webservices.data.property.complex.MessageBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;

@Service
public class EmailService {

    @Autowired
    private EwsService ewsService;

    public void sendEmailWithAttachmentAndCc(String to, String cc, String subject, String body, String attachmentPath) throws Exception {
        ExchangeService service = ewsService.createExchangeService();
        EmailMessage message = new EmailMessage(service);

        // 设置基本邮件属性
        message.setSubject(subject);
        message.setBody(MessageBody.getMessageBodyFromText(body));

        // 添加收件人
        message.getToRecipients().add(new EmailAddress(to));

        // 添加抄送人(支持多个抄送)
        if (cc != null && !cc.isEmpty()) {
            String[] ccAddresses = cc.split(","); // 假设抄送人用逗号分隔
            for (String ccAddress : ccAddresses) {
                message.getCcRecipients().add(new EmailAddress(ccAddress.trim()));
            }
        }

        // 添加附件(支持多个附件)
        if (attachmentPath != null && !attachmentPath.isEmpty()) {
            File file = new File(attachmentPath);
            FileAttachment attachment = message.getAttachments().addFileAttachment(file.getName(), file);
            attachment.setIsContactPhoto(false); // 可选设置
        }

        // 发送邮件
        message.sendAndSaveCopy();
        System.out.println("邮件发送成功!收件人: " + to + ", 抄送: " + cc);
    }
}

步骤 4: 在控制器或业务层调用服务

最后,在 Spring Controller 或其他业务类中调用邮件服务。示例使用 REST API 触发邮件发送。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @PostMapping("/send-email")
    public String sendEmail(@RequestParam String to, @RequestParam String cc, @RequestParam String subject, @RequestParam String body, @RequestParam String attachmentPath) {
        try {
            emailService.sendEmailWithAttachmentAndCc(to, cc, subject, body, attachmentPath);
            return "邮件发送成功!";
        } catch (Exception e) {
            e.printStackTrace();
            return "邮件发送失败: " + e.getMessage();
        }
    }
}

关键注意事项

  1. 错误处理:实际应用中,添加 try-catch 块处理异常(如网络错误、凭据无效)。
  2. 多个附件和抄送:上述代码支持多个抄送人(用逗号分隔)和单个附件。如需多个附件,修改为遍历文件列表:
    for (String path : attachmentPaths) {
        File file = new File(path);
        message.getAttachments().addFileAttachment(file.getName(), file);
    }
    

  3. 安全性:不要在代码中硬编码敏感信息;使用 Spring 的 @Value 注解从配置文件读取。
  4. 测试:在本地或测试环境验证 EWS 连接(确保 Exchange 服务器允许访问)。
  5. 性能优化:对于大附件,使用流式处理或异步发送避免阻塞。

通过以上步骤,您可以在 Spring 框架下实现 EWS 邮件的附件和抄送功能。如果有具体问题(如 Exchange 版本兼容性),请提供更多细节!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐