使用imap协议ssl连接接收邮件并解析附件+删除邮件

 该代码并不全部通用, 可供参考。

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);
        }
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值