该代码并不全部通用, 可供参考。
package "保密";
import com.alipay.antflow.util.SofaAntxUtil;
import com.alipay.antlaw.core.model.exception.AntlawBizException;
import com.alipay.antlaw.core.service.messager.EmailOperateService;
import com.alipay.sofa.runtime.api.annotation.SofaService;
import com.google.common.io.ByteStreams;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import javax.mail.Authenticator;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeBodyPart;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
/**
* 使用IMAP协议接收邮件
*
* @author hj
* @time 2017-07-20
*/
@Slf4j
@SofaService(interfaceType = EmailOperateService.class)
@Service("EmailOperateService")
public class EmailOperateServiceImpl implements EmailOperateService {
/**
* 连接邮箱所需参数
*/
private final static String PROTOCOL = "imap";
private final static Integer PORT = 993;
private final static String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
private final static String SERVER = “保密”; //邮箱协议服务器地址
private final static String USER_NAME = “保密”;
private final static String PASSWORD = “保密”;
/**
* 连接状态下的邮箱文件夹对象
*/
private Folder folder;
/**
* 操作邮箱的client
*/
private Store store;
/**
* 获取 归档中转邮箱 最新一封邮件的第一条附件数据
*/
public byte[] getLastMessageAttachment() throws AntlawBizException, MessagingException {
byte[] attachmentData;
Message message;
try {
connectMailBox();
List<Message> imapAllMessage = listAllMsgs();
if (CollectionUtils.isEmpty(imapAllMessage)) {
return null;
}
//归档中转邮箱 正常情况下只会存在一条邮件
message = imapAllMessage.get(0);
// 邮件类型不是mixed时,表示邮件中不包含附件,直接输出邮件内容
log.info("contentType:" + message.getContentType());
if (message.isMimeType("multipart/mixed")) {
Multipart multipart = (Multipart) message.getContent();
if (multipart.getCount() > 1) {
throw new AntlawBizException("[归档中转邮箱] 邮件所属的附件大于1份!");
}
MimeBodyPart bp = (MimeBodyPart) multipart.getBodyPart(0);
InputStream inputStream = bp.getInputStream();
ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
ByteStreams.copy(inputStream, swapStream);
attachmentData = swapStream.toByteArray();
} else {
throw new AntlawBizException("[归档中转邮箱] 邮件无附件! ");
}
} catch (MessagingException | IOException ex) {
log.error("查询归档邮箱出错,e={}", ex);
return null;
} finally {
closeMailBox();
}
return attachmentData;
}
/**
* 关闭邮箱连接
* @throws MessagingException
*/
private void closeMailBox() throws MessagingException {
folder.close(true);
store.close();
}
/**
* 连接邮箱
* @throws MessagingException
*/
private void connectMailBox() throws MessagingException {
Properties props = new Properties();
props.setProperty("mail.transport.PROTOCOL", PROTOCOL);
props.setProperty("mail.imap.host", SERVER);
props.setProperty("mail.imap.ssl.enable", "true");
props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
Session session = Session.getDefaultInstance(props, new mailAuthenticator(USER_NAME, PASSWORD));
session.setDebug(false);
store = session.getStore(PROTOCOL);
store.connect(SERVER, PORT, USER_NAME, PASSWORD);
}
/**
* 删除归档中转邮箱 所有邮件
*
* @return
*/
@Override
public boolean deleteAllMessage() {
List<Message> messageList;
Boolean flag = true;
try {
connectMailBox();
messageList = listAllMsgs();
for (Message message : messageList) {
message.setFlag(Flags.Flag.DELETED, true);
if (message.isSet(Flags.Flag.DELETED)) {
log.info("邮件删除成功!");
} else {
log.error("删除邮件时查询邮件失败!");
flag = false;
}
}
closeMailBox();
} catch (MessagingException e) {
log.error("删除邮件时查询邮件失败,e={}", e);
flag = false;
}
return flag;
}
/**
* 查询归档中转邮箱 邮件数量
*
* @return
*/
@Override
public Integer getMessageCount() throws MessagingException {
return listAllMsgs().size();
}
/**
* 使用imap协议获取所有邮件(目前邮箱固定为 "合同归档中转邮箱")
*/
private List<Message> listAllMsgs() throws MessagingException {
folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
return Arrays.asList(folder.getMessages());
}
/**
* ssl连接邮箱需要的类
*/
class mailAuthenticator extends Authenticator {
String user;
String password;
public mailAuthenticator(String user, String password) {
this.user = user;
this.password = password;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
}
}