spring boot调用Exchange邮件服务器发送电子邮件


         网上介绍利用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:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM