玩转exchange(查找邮件,修改邮件,发送邮件)

背景:

每天早上需要发站会纪要,纪要内容为组员昨日的工作完成情况,工作完成情况需要从每个组员的exchange邮件中选择昨日发的日报邮件,提取信息,因组员很多,每天这种重复的复制粘贴操作很麻烦,就想到了用java写个程序来完成这个事。

概念:

exchage 与 outlook
Exchange是服务器端的软件,而Outlook是其客户端的软件。只是Outlook不仅仅可以作为Exchange的客户端,还可以接收其他支持Pop3等的邮件,当然,Exchange邮件接收方式也不仅仅局限于使用Outlook,你也可以使用Foxmail等其他软件,也可以通过Web方式使用OWA方式接收。(PS:在网上搜索API的时候千万不要搜outlook相关的api,因为是针对exchange服务端进行邮件的操作,而非outlook,虽然我们在客户端使用的outlook)

方法:

步骤:

  1. 连接exchange
  2. 查找自己邮件中的组员邮件,并保存
  3. 查找日报模板邮件,并在指定位置替换成组员邮件中的信息
  4. 发送邮件

代码:

  • domain
package outlook.meeting
 
class UserStandMeeting {
 
    static constraints = {
 
    }
 
    UserStandMeeting(List<String> yesterdayWork,List<String> todayWork,List<String> progress){
        this.yesterdayWork = yesterdayWork
        this.todayWork = todayWork
        this.progress = progress
    }
 
    //成员姓名
    String member
    //昨日工作列表
    List<String> yesterdayWork
    //今日工作列表
    List<String> todayWork
    //昨日工作进度
    List<String> progress
}
  • main函数
package outlook.meeting

import microsoft.exchange.webservices.data.core.ExchangeService
import microsoft.exchange.webservices.data.core.PropertySet
import microsoft.exchange.webservices.data.core.enumeration.property.BasePropertySet
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName
import microsoft.exchange.webservices.data.core.enumeration.search.FolderTraversal
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.FolderSchema
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.FindFoldersResults
import microsoft.exchange.webservices.data.search.FolderView
import microsoft.exchange.webservices.data.search.ItemView
import microsoft.exchange.webservices.data.search.filter.SearchFilter
import org.apache.commons.lang3.StringUtils
import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements

import java.text.SimpleDateFormat

class ReceiveMailByOnlineController {

    //你的exchange账号
    private static String EMAIL = "your exchange email"
    //local地址:打开outlook->右上方文件-> office账户->local地址会显示在用户账户下方
    private static String EMAIL_LOCAL = "your exchange local"
    //你的exchange账号密码
    private static String EMAIL_PASSWORD = "your exchange password"
    //收件人的exchange账号
    private static String EMAIL_TO = "to exchange email"
    //组员成员
    private static List<String> TEAM = Arrays.asList("xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx","xxx")
    //筛选条件,筛选邮件时会根据这个字段来进行条件筛选
    private static String FILTER_KEY = "日报"
    //模板筛选条件,筛选模板邮件时会根据这个字段来进行条件筛选
    private static String TEMPLATE_FOLDER_KEY = "站会纪要模板"

    static void main(String[] args) {
        //鉴权,获取连接
        ExchangeService service = anthAccount()
        //获取与保存数据
        List<UserStandMeeting> userStandMeetingList = new ArrayList<UserStandMeeting>()
        for(String member : TEAM){
            getMemberContent(service,member,userStandMeetingList)
        }
        //获取模板,替换数据并发送
        getTemplateContent(service,userStandMeetingList)
    }

    static ExchangeService anthAccount(){
        ExchangeService service = new ExchangeService()
        ExchangeCredentials credentials = new WebCredentials(EMAIL_LOCAL, EMAIL_PASSWORD)
        service.setCredentials(credentials)
        service.autodiscoverUrl(EMAIL)
        return service
    }

    //查找组员日报邮件
    static getMemberContent(ExchangeService service,String member,List<UserStandMeeting> userStandMeetingList){
        //查找文件
        FolderView view = new FolderView(10)
        view.traversal = FolderTraversal.Deep
        view.propertySet = new PropertySet(BasePropertySet.IdOnly)
        view.propertySet.add(FolderSchema.DisplayName)
        SearchFilter searchFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName,member)
        FindFoldersResults findFolderResults = service.findFolders(WellKnownFolderName.Root, searchFilter, view)
        for(Folder item : findFolderResults.getFolders()){
            for(Item i : item.findItems(new ItemView(10))){
                if(i.getSubject().contains(FILTER_KEY)){
                    EmailMessage emailMessage = EmailMessage.bind(service, i.getId())
                    Document doc = Jsoup.parse(emailMessage.getBody().text,"GBK")
                    println("小组成员:" + member)
                    userStandMeetingList.push(getTableData(doc,member))
                    return
                }
            }
        }
    }

    //获取模板邮件数据
    static getTemplateContent(ExchangeService service,List<UserStandMeeting> userStandMeetingList){
        //查找文件
        FolderView view = new FolderView(1)
        view.traversal = FolderTraversal.Deep
        view.propertySet = new PropertySet(BasePropertySet.IdOnly)
        view.propertySet.add(FolderSchema.DisplayName)
        SearchFilter searchFilter = new SearchFilter.IsEqualTo(FolderSchema.DisplayName,TEMPLATE_FOLDER_KEY)
        FindFoldersResults findFolderResults = service.findFolders(WellKnownFolderName.Root, searchFilter, view)
        for(Folder item : findFolderResults.getFolders()){
            for(Item i : item.findItems(new ItemView(1))){
                EmailMessage emailMessage = EmailMessage.bind(service, i.getId())
                Document doc = Jsoup.parse(emailMessage.getBody().text,"GBK")
                String messageBody = replaceTableData(doc,userStandMeetingList)
                sendMail(service,messageBody)
                println("替换数据成功")
                return
            }
        }
    }

    //解析日报信息
    static getTableData(Document doc,String member){
        Elements elements = doc.getElementsByTag("table")
        UserStandMeeting userStandMeeting = new UserStandMeeting(new ArrayList<String>(),new ArrayList<String>(),new ArrayList<String>())
        userStandMeeting.member = member
        for(Element element:elements){
            if(element.text() !=null && !"".equals(element.text())){
                Elements es = element.select("tr")
                for(Element tdelement:es){
                    Elements tdes = tdelement.select("td")
                    //只筛选需要的数据(今日工作)
                    //针对个别组员邮件格式不规范写的兼容代码
                    if(tdes.size() == 5 && !"工作事项".equals(tdes[0].text()) && !"xxx".equals(member) && !"xxx".equals(member) ||
                            (tdes.size() == 6 && !"工作事项".equals(tdes[0].text()) && "xxx".equals(member)) ||
                            (tdes.size() == 6 && !"工作事项".equals(tdes[0].text()) && "xxx".equals(member))) {
                        if(StringUtils.isNotBlank(tdes[0].text())){
                            userStandMeeting.yesterdayWork.push(tdes[0].text())
                            userStandMeeting.progress.push(tdes[2].text())
                        }
                    }
                    //只筛选需要的数据(昨日工作)
                    //针对个别组员邮件格式不规范写的兼容代码
                    if((tdes.size() == 4 && !"工作事项".equals(tdes[0].text()) && !"xxx".equals(member)) && !"xxx".equals(member) ||
                            (tdes.size() == 5 && !"工作事项".equals(tdes[0].text()) && "xxx".equals(member)) ||
                            (tdes.size() == 5 && !"工作事项".equals(tdes[0].text()) && "xxx".equals(member))){
                        if(StringUtils.isNotBlank(tdes[0].text())){
                            userStandMeeting.todayWork.push(tdes[0].text())
                        }
                    }
                }
            }
        }
        return userStandMeeting
    }

    //替换模板数据
    static replaceTableData(Document doc,List<UserStandMeeting> userStandMeetingList){
        Elements elements = doc.getElementsByTag("table")
        for(Element element:elements){
            if(element.text() !=null && !"".equals(element.text())){
                Elements es = element.select("tr")
                for(Element tdelement:es){
                    Elements tdes = tdelement.select("td")
                    if(tdes.size() == 7 && tdes[0].text() != "姓名"){
                        for(UserStandMeeting u : userStandMeetingList){
                            if(u.member.equals(tdes[0].text())){
                                String yesterdayWork = ""
                                for(String s : u.yesterdayWork){
                                    yesterdayWork = yesterdayWork + s + "<br>"
                                }
                                tdes[1].html(yesterdayWork)
                                String progress = ""
                                for(String s : u.progress){
                                    progress = progress + s + "<br>"
                                }
                                tdes[2].html(progress)
                                String todayWork = ""
                                for(String s : u.todayWork){
                                    todayWork = todayWork + s + "<br>"
                                }
                                tdes[3].html(todayWork)
                            }
                        }
                    }
                }
            }
        }
        return new String(doc.html().getBytes("UTF-8"),"UTF-8")
    }


    //发送邮件
    static sendMail(ExchangeService service,String messageBody){
        EmailMessage email = new EmailMessage(service)
        email.toRecipients.add(EMAIL_TO)
        email.subject = formatDate()
        email.body = new MessageBody(messageBody)
        email.send()
        println("send success")
    }

    //时间格式化
    static formatDate(){
        SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD")
        return sdf.format(new Date()) + "站会纪要"
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android Exchange 协议是一种用于在 Android 设备上发送和接收邮件的通信协议。它基于 Microsoft Exchange Server,并使用 Microsoft Exchange ActiveSync(EAS)进行通信。 Android Exchange 协议提供了以下功能和特点: 1. 邮件发送:Android Exchange 协议允许用户通过 Android 设备发送电子邮件。用户可以通过设备上的电子邮件应用程序编写邮件,选择收件人,并附加文件或图片。 2. 邮件同步:Android Exchange 协议通过与 Exchange Server 进行实时同步,确保所有邮件状态和操作在设备和服务器之间保持同步。这意味着,无论是通过设备还是服务器上的应用程序进行的操作,都会即时反映在另一端。 3. 日历和联系人同步:除了邮件,Android Exchange 协议还支持日历和联系人同步。用户可以在设备上查看和编辑 Exchange Server 上的日历事件和联系人信息,并确保更新会自动同步到服务器和其他设备上。 4. 安全性:Android Exchange 协议使用 Microsoft Exchange ActiveSync(EAS)进行通信,并支持加密和远程设备管理功能,以保护邮件的安全和用户的隐私。用户可以远程擦除设备上的数据,设置密码策略,并进行远程锁屏等操作。 综上所述, Android Exchange 协议为 Android 设备的用户提供了便捷的邮件发送和接收功能,并确保邮件、日历和联系人的同步和安全。无论是个人用户还是企业用户,都能从这一协议中受益,以更高效和安全的方式管理和处理电子邮件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值