封装发送Exchange邮箱的工具
package com.tbc.app.im.util;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.exception.service.local.ServiceLocalException;
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.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.*;
@Slf4j
@Data
public class ExchangeClient {
private final String hostname;
private final ExchangeVersion exchangeVersion;
private final String domain;
private final String username;
private final String password;
private final String subject;
private final String recipientTo;
private final List<String> recipientCc;
private final List<String> recipientBcc;
private final List<String> attachments;
private final List<UrlAttachments> urlAttachments;
private final String message;
private final String userid;
private final String corpCode;
public static class UrlAttachments {
private String fileName;
private String fileUrl;
public UrlAttachments(String fileName, String fileUrl) {
this.fileName = fileName;
this.fileUrl = fileUrl;
}
}
public ExchangeClient(ExchangeClientImplBuilder builder) {
this.hostname = builder.hostname;
this.exchangeVersion = builder.exchangeVersion;
this.domain = builder.domain;
this.username = builder.username;
this.password = builder.password;
this.subject = builder.subject;
this.recipientTo = builder.recipientTo;
this.recipientCc = builder.recipientCc;
this.recipientBcc = builder.recipientBcc;
this.attachments = builder.attachments;
this.message = builder.message;
this.urlAttachments = builder.urlAttachments;
this.userid = builder.userid;
this.corpCode = builder.corpCode;
}
public static class ExchangeClientImplBuilder {
private String hostname;
private String userid;
private String corpCode;
private ExchangeVersion exchangeVersion;
private String domain;
private String username;
private String password;
private String subject;
private String recipientTo;
private List<String> recipientCc;
private List<String> recipientBcc;
private List<String> attachments;
private String message;
private List<UrlAttachments> urlAttachments;
public ExchangeClientImplBuilder() {
this.userid = "";
this.corpCode = "";
this.exchangeVersion = ExchangeVersion.Exchange2010_SP1;
this.hostname = "";
this.username = "";
this.password = "";
this.subject = "";
this.recipientTo = "";
this.recipientCc = new ArrayList<>(0);
this.recipientBcc = new ArrayList<>(0);
this.attachments = new ArrayList<>(0);
this.message = "";
this.urlAttachments = new ArrayList<>(0);
}
public ExchangeClientImplBuilder hostname(String hostname) {
this.hostname = hostname;
return this;
}
public ExchangeClientImplBuilder exchangeVersion(ExchangeVersion exchangeVersion) {
this.exchangeVersion = exchangeVersion;
return this;
}
public ExchangeClientImplBuilder domain(String domain) {
this.domain = domain;
return this;
}
public ExchangeClientImplBuilder username(String username) {
this.username = username;
return this;
}
public ExchangeClientImplBuilder userid(String userId) {
this.userid = userId;
return this;
}
public ExchangeClientImplBuilder corpCode(String corpCode) {
this.corpCode = corpCode;
return this;
}
public ExchangeClientImplBuilder password(String password) {
this.password = password;
return this;
}
public ExchangeClientImplBuilder subject(String subject) {
this.subject = subject;
return this;
}
public ExchangeClientImplBuilder recipientTo(String recipientTo) {
this.recipientTo = recipientTo;
return this;
}
public ExchangeClientImplBuilder recipientCc(String recipientCc, String... recipientsCc) {
List<String> recipients = new ArrayList<>(1 + recipientsCc.length);
recipients.add(recipientCc);
recipients.addAll(Arrays.asList(recipientsCc));
this.recipientCc = recipients;
return this;
}
public ExchangeClientImplBuilder recipientCc(List<String> recipientCc) {
this.recipientCc = recipientCc;
return this;
}
public ExchangeClientImplBuilder recipientBcc(String recipientBcc, String... recipientsBcc) {
List<String> recipients = new ArrayList<>(1 + recipientsBcc.length);
recipients.add(recipientBcc);
recipients.addAll(Arrays.asList(recipientsBcc));
this.recipientBcc = recipients;
return this;
}
public ExchangeClientImplBuilder recipientBcc(List<String> recipientBcc) {
this.recipientBcc = recipientBcc;
return this;
}
public ExchangeClientImplBuilder attachments(String attachment, String... attachments) {
List<String> attachmentsToUse = new ArrayList<>(1 + attachments.length);
attachmentsToUse.add(attachment);
attachmentsToUse.addAll(Arrays.asList(attachments));
this.attachments = attachmentsToUse;
return this;
}
public ExchangeClientImplBuilder urlAttachments(List<UrlAttachments> urlAttachments) {
this.urlAttachments = urlAttachments;
return this;
}
public ExchangeClientImplBuilder attachments(List<String> attachments) {
this.attachments = attachments;
return this;
}
public ExchangeClientImplBuilder message(String message) {
this.message = message;
return this;
}
public ExchangeClient build() {
return new ExchangeClient(this);
}
}
public void sendExchange() throws IOException, ServiceLocalException {
ExchangeService exchangeService = new ExchangeService(exchangeVersion);
ExchangeCredentials exchangeCredentials = new WebCredentials(username, password, domain);
exchangeService.setCredentials(exchangeCredentials);
try {
exchangeService.setUrl(new URI("https://" + hostname + "/ews/Exchange.asmx"));
exchangeService.setTimeout(5000);
} catch (URISyntaxException ex) {
log.error("创建与服务端的连接发生异常", ex);
if (exchangeService != null) {
exchangeService.close();
}
return;
}
EmailMessage emailMessage;
try {
emailMessage = new EmailMessage(exchangeService);
emailMessage.setSubject(subject);
emailMessage.setBody(MessageBody.getMessageBodyFromText(message));
} catch (Exception ex) {
log.error("设置邮件发生异常", ex);
return;
}
try {
emailMessage.getToRecipients().add(recipientTo);
} catch (ServiceLocalException ex) {
log.error("设置邮件收件人发生异常.", ex);
return;
}
for (String recipient : recipientCc) {
try {
emailMessage.getCcRecipients().add(recipient);
} catch (ServiceLocalException ex) {
log.error("设置邮件抄送人发生异常.", ex);
return;
}
}
for (String recipient : recipientBcc) {
try {
emailMessage.getBccRecipients().add(recipient);
} catch (ServiceLocalException ex) {
log.error("设置邮件密送人发生异常.", ex);
return;
}
}
for (String attachmentPath : attachments) {
try {
emailMessage.getAttachments().addFileAttachment(attachmentPath);
} catch (ServiceLocalException ex) {
log.error("设置邮件附件发生异常", ex);
return;
}
}
for (UrlAttachments urlAttachment : urlAttachments) {
String fileName = urlAttachment.fileName;
emailMessage.getAttachments().addFileAttachment(fileName, new URL(urlAttachment.fileUrl).openStream());
}
try {
emailMessage.send();
log.info("邮件发送成功.");
} catch (Exception ex) {
log.error("邮件发送异常.", ex);
return;
}
}
}
构建发送邮件参数
public ExchangeClient convertExchange(ImSentMessage imSentMessage) {
if (filterNull(imSentMessage)) return null;
EmailServerProperty server = switchEmailServer(imSentMessage.getCorpCode());
if (null == server) return null;
ExchangeClient.ExchangeClientImplBuilder builder = new ExchangeClient.ExchangeClientImplBuilder();
builder.username(server.getSmtpAccount());
builder.password(server.getSmtpPassword());
builder.exchangeVersion(ExchangeVersion.Exchange2010_SP2);
builder.message(imSentMessage.getMessageContent());
builder.subject(imSentMessage.getMessageTitle());
builder.hostname(server.getSmtpHost());
builder.userid(imSentMessage.getImUser().getUserId());
builder.corpCode(imSentMessage.getImUser().getCorpCode());
builder.recipientTo(imSentMessage.getImUser().getEmail());
convertExchangeAttachment(builder, imSentMessage.getAttachmentFile());
return builder.build();
}