Exchange和Smtp协议 编写

项目改造需要下发给任务人任务后以邮件的形式下发给执行任务的同事,
经过几番周折最终写下了下面的代码,
亲身实测,贼好用简便

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值