使用EWS Java API添加邮件附件时出现StackOverflowError问题求助
解决EWS添加邮件附件时出现StackOverflowError的问题
嘿,我来帮你搞定这个栈溢出的问题!你遇到的StackOverflowError大概率是因为直接把从已发送文件夹获取的EmailMessage对象(也就是你说的emailToAttach)作为附件挂载到新邮件时,触发了递归的属性引用或上下文循环。EWS的EmailMessage对象会绑定Exchange服务的上下文和自身的属性树,直接把它当附件加进去的话,在设置新邮件主题(setSubject)这类操作中,可能会不断递归加载关联的属性,最后把栈给撑爆了。
正确的做法:不要直接复用原邮件对象
你得换个思路,别直接用原邮件对象当附件,而是创建一个独立的邮件附件,把原邮件的关键属性复制过去,这样就能切断不必要的上下文关联了。具体步骤如下:
示例代码
// 1. 先从已发送文件夹获取原邮件,只加载咱们需要的属性(别加载全量,减少关联) EmailMessage emailToAttach = EmailMessage.bind( exchangeService, itemId, new PropertySet( BasePropertySet.IdOnly, EmailMessageSchema.Subject, EmailMessageSchema.Body, EmailMessageSchema.ToRecipients ) ); // 2. 创建新的父邮件 EmailMessage parentEmailMessage = new EmailMessage(exchangeService); parentEmailMessage.setSubject("这是带邮件附件的新邮件"); // 现在这里不会再触发栈溢出啦 // 3. 给父邮件添加一个邮件类型的附件 ItemAttachment<EmailMessage> attachment = parentEmailMessage.getAttachments().addItemAttachment(EmailMessage.class); EmailMessage attachedEmail = attachment.getItem(); // 4. 把原邮件的属性复制到附件邮件里 attachedEmail.setSubject(emailToAttach.getSubject()); attachedEmail.setBody(emailToAttach.getBody()); attachedEmail.getToRecipients().addAll(emailToAttach.getToRecipients()); // 要是需要的话,还可以复制抄送、发送时间这些其他属性 // 5. 最后搞定父邮件的其他设置,发送就行 parentEmailMessage.getToRecipients().add("收件人邮箱@example.com"); parentEmailMessage.send();
额外要注意的点
- 别用
BasePropertySet.FirstClassProperties加载原邮件的全量属性,只加载你需要的字段,这样能降低上下文关联的复杂度 - 如果原邮件本身还有附件,你可能需要递归复制这些附件,但一定要注意别搞出循环引用(比如原邮件不能是父邮件自己)
- 确保原邮件对象和父邮件对象的上下文是独立的,别共享不必要的引用
内容的提问来源于stack exchange,提问作者user5497505
相关产品推荐
相关产品推荐

