网上介绍利用spring boot通过POP3、IMAP、SMTP等协议来发送电子邮件的资料非常多,然而介绍利用Exchange邮件服务器来发邮件的资料却极少。下面来看看,如何在spring boot中用Exchange服务器来发邮件,以及需要注意的问题。
首先,你需要知道邮件服务器的地址,例如我下面的例子中服务器地址是https://webmail.XXXXX.com/EWS/Exchange.asmx(XXXX是公司域名,不便公开)。其次,要保证你能正确连接上这个邮件服务器,检验的方法是在浏览器中输入这个服务器地址,会返回一个xml文件。某些公司有安全设置,只能在内部网络中登录这个服务器,或者需要通过VPN才可以登录这个服务器。
如果上述的条件都满足了,那么就可以开始编写spring boot的代码了。
一、引入依赖ews-java-api
<dependency> <groupId>com.microsoft.ews-java-api</groupId> <artifactId>ews-java-api</artifactId> <version>2.0</version> </dependency>
二、新建一个邮件配置类:ExchangeMailUtils
import microsoft.exchange.webservices.data.core.ExchangeService; import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion; import microsoft.exchange.webservices.data.core.enumeration.property.BodyType; import microsoft.exchange.webservices.data.core.service.item.EmailMessage; import microsoft.exchange.webservices.data.credential.ExchangeCredentials; import microsoft.exchange.webservices.data.credential.WebCredentials; import microsoft.exchange.webservices.data.property.complex.MessageBody; import java.net.URI; import java.net.URISyntaxException; public class ExchangeMailUtils { private String mailServer; //邮件服务器地址 private String user; //登录用户名 private String password; //登录密码 private String domain; //域 public ExchangeMailUtils(String mailServer, String user, String password, String domain) { this.mailServer = mailServer; this.user = user; this.password = password; this.domain = domain; } /** * 创建邮件服务 * @return 邮件服务 */ private ExchangeService getExchangeService() { ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1); //用户认证信息 ExchangeCredentials credentials; if (domain == null) { credentials = new WebCredentials(user, password); } else { credentials = new WebCredentials(user, password, domain); } service.setCredentials(credentials); try { service.setUrl(new URI(mailServer)); } catch (URISyntaxException e) { e.printStackTrace(); } return service; } /** * 发送带附件的mail * @param subject 邮件标题 * @param to 收件人列表 * @param cc 抄送人列表 * @param bodyText 邮件内容 * @param attachmentPaths 附件地址列表 * @throws Exception */ public void send(String subject, String[] to, String[] cc, String bodyText, String[] attachmentPaths) throws Exception { ExchangeService service = getExchangeService(); EmailMessage msg = new EmailMessage(service); msg.setSubject(subject); MessageBody body = MessageBody.getMessageBodyFromText(bodyText); body.setBodyType(BodyType.HTML); msg.setBody(body); for (String toPerson : to) { msg.getToRecipients().add(toPerson); } if (cc != null) { for (String ccPerson : cc) { msg.getCcRecipients().add(ccPerson); } } if (attachmentPaths != null) { for (String attachmentPath : attachmentPaths) { msg.getAttachments().addFileAttachment(attachmentPath); } } msg.send(); } /** * 发送不带附件的mail * @param subject 邮件标题 * @param to 收件人列表 * @param cc 抄送人列表 * @param bodyText 邮件内容 * @throws Exception */ public void send(String subject, String[] to, String[] cc, String bodyText) throws Exception { send(subject, to, cc, bodyText, null); } }
三、控制类
@RestController public class SendEmail { @RequestMapping(value = {"/email"}, method = RequestMethod.GET, produces = "application/json;charset=UTF-8") public void sendemail( ) throws Exception { ExchangeMailUtils exchangeMailUtils=new ExchangeMailUtils("https://webmail.XXXXX.com/EWS/Exchange.asmx", "用户名", "密码","域"); String [] a={"收件人邮箱"}; String [] cc={}; exchangeMailUtils.send("主题",a,null,"本体"); } }
四、可能出现的错误:
1、The remote server returned an error: (403)Forbidden:出现这个错误可能是因为你不在内部网或者没有通过VPN连接服务器。
2、Cannot invoke "String.equalsIgnoreCase(String)" because "scheme" is null:出现这个错误是因为邮件服务器地址漏写了https: