项目改造需要下发给任务人任务后以邮件的形式下发给执行任务的同事,
经过几番周折最终写下了下面的代码,
亲身实测,贼好用简便
Smtp 协议
import org.springframework.stereotype.Service;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
@Service("smtpservice")
public class SmtpService {
private final String host = "smtp**.****.****.com";
private final String sender = "cc******@********com";
private final String username = "";
private final String password = "";
private final boolean auth = true;
/*简历会话*/
private MimeMessage message;
private Session session;
/*初始化*/
public void init() {
Properties ppts = System.getProperties();
ppts.put("mail.smtp.host", host);
ppts.put("mail.smtp.auth", auth);
session.getInstance(ppts);
message = new MimeMessage(session);
}
/**
* 发送邮件
* @param subject 邮件头文件名
* @param context 邮件内容
* @param receiveUser 收件人
*/
public void doSendHtmlEmail(String subject, String context, String receiveUser) {
try {
//发件人
InternetAddress fromAddress = new InternetAddress(sender);
message.setFrom(fromAddress);
//收件人
InternetAddress toAddress = new InternetAddress(receiveUser);
message.setRecipient(Message.RecipientType.TO, toAddress);
//邮箱标题
message.setSubject(subject);
// 邮件内容,也可以使纯文本"text/plain"
message.setContent(context, "text/html;charset=GBK");
message.saveChanges();
Transport smtp = session.getTransport("smtp");
// smtp验证,就是你用来发邮件的邮箱用户名密码
System.out.println(host + " " + username + " " + password + " " + auth);
smtp.connect(host, username, password);
//发送
smtp.sendMessage(message, message.getAllRecipients());
smtp.close();
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
Exchange 协议
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.PropertySet;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.BodyType;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.enumeration.search.LogicalOperator;
import microsoft.exchange.webservices.data.core.enumeration.search.SortDirection;
import microsoft.exchange.webservices.data.core.service.folder.Folder;
import microsoft.exchange.webservices.data.core.service.item.EmailMessage;
import microsoft.exchange.webservices.data.core.service.item.Item;
import microsoft.exchange.webservices.data.core.service.schema.EmailMessageSchema;
import microsoft.exchange.webservices.data.core.service.schema.ItemSchema;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.property.complex.MessageBody;
import microsoft.exchange.webservices.data.search.FindItemsResults;
import microsoft.exchange.webservices.data.search.ItemView;
import microsoft.exchange.webservices.data.search.filter.SearchFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.util.ResourceUtils;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
@Service("exchangeMailService")
public class ExchangeMailService {
@Value("${mail.exchange.url}")
private String serverUrl;// 邮件服务器
@Value("${mail.exchange.username}")
private String username;
@Value("${mail.exchange.password}")
private String password;
@Value("${mail.exchange.domain}")
private String domain;
private static ExchangeService service;
/**
* 初始化连接
*
* @throws Exception
*/
public void init(String classPath) throws Exception {
if (classPath == null) {
classPath = ResourceUtils.getURL("classpath:").getPath();
}
classPath = classPath.replace("%20", " ");
System.setProperty("javax.net.ssl.trustStore", classPath + "/jssecacerts");
service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
ExchangeCredentials credentials = new WebCredentials(username, password, domain);
service.setCredentials(credentials);
try {
URI uri = new URI(serverUrl);
service.setUrl(uri);
// service.autodiscoverUrl(emailAddress);
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void init() throws Exception {
init(null);
}
/**
* 使用Exchange协议发送
*
* @param subject 邮件主题
* @param to 收件人
* @param cc 抄送
* @param bodyText 正文
* @param realPath 附件
* @throws Exception
*/
public void doSend(String subject, List<String> to, List<String> cc, String bodyText, String realPath)
throws Exception {
EmailMessage msg = new EmailMessage(service);
msg.setSubject(subject);
MessageBody body = MessageBody.getMessageBodyFromText(bodyText);
body.setBodyType(BodyType.HTML);
msg.setBody(body);
for (String s : to) {
msg.getToRecipients().add(s);
}
// for (String s : cc) {
// msg.getCcRecipients().add(s);
// }
if (realPath != null && !"".equals(realPath)) {
msg.getAttachments().addFileAttachment(realPath);
}
msg.send();
}
public void send(String subject, List<String> to, List<String> cc, String bodyText) throws Exception {
doSend(subject, to, cc, bodyText, null);
}
/**
* 使用Exchange协议接收邮件
*
* @throws Exception
*/
public void getUnreadEmails() throws Exception {
// ItemView view = new ItemView(Integer.MAX_VALUE);
ItemView view = new ItemView(10, 4);
List<String> list = new ArrayList<String>();
FindItemsResults<Item> unRead = Folder.bind(service, WellKnownFolderName.Inbox).findItems(SetFilter(), view);
for (Item item : unRead.getItems()) {
System.out.println(item.getSubject());
if (item.getSubject() != null) {
list.add(item.getSubject().toString());
} else {
list.add("无标题");
}
// list.Add(item.DateTimeSent.ToString());
}
int unReadCount = Folder.bind(service, WellKnownFolderName.Inbox).getTotalCount(); // 未读邮件数量
System.out.println("unReadCount is:" + unReadCount);
}
public ArrayList<EmailMessage> doReceive(int max, SearchFilter searchFilter) throws Exception {
// 绑定收件箱,同样可以绑定发件箱
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
// 获取文件总数量
int count = inbox.getTotalCount();
if (max > 0) {
count = count > max ? max : count;
}
// 循环获取邮箱邮件
ItemView view = new ItemView(count);
// 按照时间顺序收取
view.getOrderBy().add(ItemSchema.DateTimeReceived, SortDirection.Descending);
FindItemsResults<Item> findResults;
if (searchFilter == null) {
findResults = service.findItems(inbox.getId(), view);
} else {
// e.g. new SearchFilter.SearchFilterCollection(
// LogicalOperator.Or, new
// SearchFilter.ContainsSubstring(ItemSchema.Subject, "EWS"),
// new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API"))
findResults = service.findItems(inbox.getId(), searchFilter, view);
}
service.loadPropertiesForItems(findResults, PropertySet.FirstClassProperties);
ArrayList<EmailMessage> result = new ArrayList<>();
for (Item item : findResults.getItems()) {
EmailMessage message = (EmailMessage) item;
result.add(message);
}
return result;
}
public ArrayList<EmailMessage> doReceiveByPage(int pageNo, int pageSize, SearchFilter searchFilter)
throws Exception {
// 绑定收件箱,同样可以绑定发件箱
Folder inbox = Folder.bind(service, WellKnownFolderName.Inbox);
// 循环获取邮箱邮件
ItemView view = new ItemView(pageSize, pageNo * pageSize);
// 按照时间顺序收取
view.getOrderBy().add(ItemSchema.DateTimeSent, SortDirection.Descending);
FindItemsResults<Item> findResults;
if (searchFilter == null) {
findResults = service.findItems(inbox.getId(), view);
} else {
// e.g. new SearchFilter.SearchFilterCollection(
// LogicalOperator.Or, new
// SearchFilter.ContainsSubstring(ItemSchema.Subject, "EWS"),
// new SearchFilter.ContainsSubstring(ItemSchema.Subject, "API"))
findResults = service.findItems(inbox.getId(), searchFilter, view);
}
service.loadPropertiesForItems(findResults, PropertySet.FirstClassProperties);
ArrayList<EmailMessage> result = new ArrayList<>();
for (Item item : findResults.getItems()) {
EmailMessage message = (EmailMessage) item;
// System.out.println("Subject is:" + message.getSubject());
// System.out.println("sender is:" +
// message.getSender().getAddress() + " " +
// message.getSender().getName());
//
// System.out.println("ToRecipients is:" + " " +
// MailUtil.getReceiveAddress(message));
// System.out.println("getDateTimeReceived is:" + " " +
// MailUtil.getReceiveDate(message, "yyyy-MM-dd HH:mm:ss"));
// System.out.println("getDateTimeSent is:" + " " +
// MailUtil.getSentDate(message, "yyyy-MM-dd HH:mm:ss"));
// System.out.println(item.getBody().toString());
// System.out.println("Importance:" +
// item.getImportance().toString());
result.add(message);
}
return result;
}
/**
* 设置获取什么类型的邮件
*
* @throws Exception
*/
private SearchFilter SetFilter() {
List<SearchFilter> searchFilterCollection = new ArrayList<SearchFilter>();
searchFilterCollection.add(new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, true));
SearchFilter s = new SearchFilter.SearchFilterCollection(LogicalOperator.And, searchFilterCollection);
// 如果要获取所有邮件的话代码改成这样:
// searchFilterCollection.add(new
// SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
// searchFilterCollection.add(new
// SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, true));
// SearchFilter s = new
// SearchFilter.SearchFilterCollection(LogicalOperator.Or,searchFilterCollection);
return s;
}
}