使用EWS Java API 2.0转发邮件时原始邮件时区异常求助
问题描述
用Java结合ews-java-api 2.0实现Outlook邮件转发功能时,转发邮件里附带的原始邮件发送时间一直显示UTC时区,不是本地的UTC+8时区。试过在初始化ExchangeService前设置Java默认时区为UTC+8,甚至改了电脑系统时区为UTC,都没效果。
pom.xml依赖配置
<dependency> <groupId>com.microsoft.ews-java-api</groupId> <artifactId>ews-java-api</artifactId> <version>2.0</version> </dependency>
核心业务代码
EmailMessage message = EmailMessage.bind(exchangeService, new ItemId(this.messageId)); ResponseMessage responseMessage = null; responseMessage = message.createForward(); MessageBody messageBody = new MessageBody(); messageBody.setBodyType(BodyType.HTML); messageBody.setText(html); responseMessage.setSubject(this.subject); responseMessage.setBodyPrefix(messageBody); setResponseMessageRecipients(responseMessage); responseMessage.sendAndSaveCopy();
已尝试的无效操作
TimeZone tz = TimeZone.getTimeZone("GMT+8"); TimeZone.setDefault(tz);
解决方案
问题出在你只改了Java虚拟机的默认时区,没给EWS的ExchangeService实例指定时区。EWS服务默认用UTC处理时间,必须显式给服务实例设置目标时区才行。
具体修改:
- 初始化
ExchangeService的时候,直接指定UTC+8对应的标准时区(推荐用Asia/Shanghai,避免GMT偏移的夏令时问题) - 这个设置要在绑定邮件、创建转发操作之前完成
修改后的初始化示例代码:
// 初始化ExchangeService并指定时区 ExchangeService exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP2); // 设置为上海时区(对应UTC+8,无夏令时调整) TimeZoneInfo tzInfo = TimeZoneInfo.getTimeZone("Asia/Shanghai"); exchangeService.setTimeZone(tzInfo); // 后续的认证、服务地址配置保持原有逻辑 exchangeService.setCredentials(new WebCredentials("你的账号", "你的密码")); exchangeService.setUrl(new URI("https://outlook.office365.com/EWS/Exchange.asmx"));
原理:EWS的ExchangeService实例的时区设置会直接影响从Exchange服务器获取的所有时间字段的本地化显示,包括邮件发送时间。Java默认时区的设置不会作用于EWS服务的时间处理逻辑,必须单独配置服务实例的时区参数。
内容的提问来源于stack exchange,提问作者user zz
相关产品推荐
相关产品推荐

