通过会议管理系统将客户会议信息发送到Exchange 服务系统日历中.
有小伙伴留言怎么添加附件,于是我在代码中补充了添加附件的代码.
我写了个工具类如下:
pom.xml
<dependency>
<groupId>com.microsoft.ews-java-api</groupId>
<artifactId>ews-java-api</artifactId>
<version>2.0</version>
</dependency>
工具类
/**
* Exchange 发送一条会议邮件
*/
public static String sendEws(MeetTaskDTO meetTaskDTO) {
String sendEwsId = "";
//封装数据
MeetTaskEwsDto meetTaskEwsDto = transferMeetTaskDTO2MeetTaskEwsDTO(meetTaskDTO);
//获取当前租户的邮箱配置
MailField mailField = MailUtils.getMailField(meetTaskDTO.getTenantId());
//ExchangeVersion.Exchange2010 版本不支持流式通知,需要不断的执行 GetEvents 方法达到实时监听。
//获取版本 采用枚举的方式获取默认版本
String exchangeversion = StringUtils.isNotEmpty(mailField.getExchangeVersion()) ?mailField.getExchangeVersion() : MailConfig.getDefaultMailField().getExchangeVersion();
try {
//设置版本
ExchangeService service = new ExchangeService(ExchangeVersion.valueOf(exchangeversion));
//Exchange服务器的域名,使用ip可能会连接失败,如服务器在本地,没有域名可以在host文件中添加一条域名解析规则
//serverHost 为Exchange服务器域名
String serverHost = mailField.getExchangeServeHost();
//登录的账号和密码,账号一定是可以登录进去的账号,不一定是邮箱地址
//mailField.getExchangeAccount() 获取账号 mailField.getExchangePwd()获取密码
ExchangeCredentials credentials = new WebCredentials(mailField.getExchangeAccount(), mailField.getExchangePwd());
service.setCredentials(credentials);
//固定写法
service.setUrl(new URI("https://" + serverHost + "/ews/exchange.asmx"));
service.setCredentials(credentials);
service.setTraceEnabled(true);
//设置时区 中国时区 getTimeZoneDefinition 方法 必须2010以上版本不然会报错
TimeZoneDefinition tz = getTimeZoneDefinition(service, "UTC+08:00");
//发送信息
Appointment appointment = new Appointment(service);
appointment.setSubject(meetTaskEwsDto.getTaskName()); //会议主题
appointment.setBody(MessageBody.getMessageBodyFromText(meetTaskEwsDto.getContent())); //会议消息体
appointment.setStart(meetTaskEwsDto.getTaskStartTime()); //开始时间
appointment.setStartTimeZone(tz); //开始时间时区 必须设置
appointment.setEnd(meetTaskEwsDto.getTaskEndTime()); //结束时间
appointment.setEndTimeZone(tz); //结束时间时区 必须设置
appointment.setLocation(meetTaskEwsDto.getRoomName());//会议位置
**//添加附件 官方有很多具体用法**
//appointment.getAttachments().addFileAttachment("C:\\temp\\FileAttachment.txt");
//appointment.getAttachments().addFileAttachment("SecondAttachment.txt", "C:\\temp\\FileAttachment2.txt");
// byte[] theBytes = File.ReadAllBytes("C:\\Temp\\Tulips.jpg");
// appointment.getAttachments().addFileAttachment("ThirdAttachment.jpg", theBytes);
// appointment.getResources().add("会议资源账号,如:[email protected]"); //会议资源
//参会员工收件账号 这里是多个参会员工时写法
//meetTaskEwsDto.getParticipantsnEmail() 自定义获取参与员工的账号集合必须是 Exchange服务账号
if(StringUtils.isNotEmpty(meetTaskEwsDto.getParticipantsnEmail())){
for(String mail:meetTaskEwsDto.getParticipantsnEmail()){
appointment.getRequiredAttendees().add(mail); //必须参加的员工的账号
}
}
//必须参加的员工的账号
//appointment.getRequiredAttendees().add("[email protected]");
//可选参加的员工的账号
//appointment.getOptionalAttendees().add("[email protected]");
//appointment.setIsAllDayEvent(); // 是否全天事件
// appointment.save(); 方法列举如下参数
//SendInvitationsMode.SendToNone 不发送邀请模式
// WellKnownFolderName.Calendar 发送到日历
//SendInvitationsMode.SendToAllAndSaveCopy 发送给所有人并保存副本
appointment.save(WellKnownFolderName.Calendar); // 发送到日历
//appointment.update(ConflictResolutionMode.AutoResolve); //冲突解决 自动解决模式
//新建日历会议后生成的id并保存
sendEwsId = appointment.getId().toString();
} catch (Exception e) {
e.printStackTrace();
}
return sendEwsId;
/**
* 获取时区
* @param service
* @param timeZoneID
* @return
*/
private static TimeZoneDefinition getTimeZoneDefinition(ExchangeService service, String timeZoneID) {
TimeZoneDefinition timeZoneDefinition = null;
try {
for (TimeZoneDefinition tzd : service.getServerTimeZones()) {
if(tzd.getId().equalsIgnoreCase(timeZoneID)) {
timeZoneDefinition = tzd;
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return timeZoneDefinition;
}
/**
* 封装数据
* @param meetTaskDTO
* @return
* meetTaskDTO 是传过来的对象
*/
private static MeetTaskEwsDto transferMeetTaskDTO2MeetTaskEwsDTO(MeetTaskDTO meetTaskDTO) {
MeetTaskEwsDto meetTaskEwsDto =new MeetTaskEwsDto();
meetTaskEwsDto.setTaskName(meetTaskDTO.getTaskName());
meetTaskEwsDto.setRoomName(meetTaskDTO.getRoomName());
meetTaskEwsDto.setContent(meetTaskDTO.getContent());
//拼接开始时间和结束时间
String taskStartTime = meetTaskDTO.getTaskDate()+" "+meetTaskDTO.getTaskStartTime();
String taskEndTime = meetTaskDTO.getTaskDate()+" "+meetTaskDTO.getTaskEndTime();
meetTaskEwsDto.setTaskStartTime(DateUtils.allStringToDate (taskStartTime));
meetTaskEwsDto.setTaskEndTime(DateUtils.allStringToDate(taskEndTime));
//通过任务id 查询参与人员对象信息
//由于静态工具类无法注入 这个是获取 bean
MeetTaskPersonService meetTaskPersonService = SpringUtils.getBean(MeetTaskPersonService.class);
List<MeetTaskPersonDTO> meetTaskPersonDTOS = meetTaskPersonService.listEmployeeParticipatesByTaskId(meetTaskDTO.getId());
meetTaskDTO.setEParticipates(meetTaskPersonDTOS);
//将参与人集合对象 转换成userid 集合
List<String> personIdList = meetTaskDTO.getEParticipates().stream().map(MeetTaskPersonDTO::getPersonId).collect(Collectors.toList());
//判断参会人员是否有发起人 如果不包含就添加
if(!personIdList.contains(meetTaskDTO.getCreateUser())){
personIdList.add(meetTaskDTO.getCreateUser());
}
//获取用户邮箱
List<String> mails = new ArrayList<>();
UserService userService = SpringUtils.getBean(UserService.class);
for (String personId:personIdList){
//由于是工具 这个是获取 bean
UserDTO userDto = userService.getUserById(personId).getData();
mails.add(userDto.getEmail());
}
meetTaskEwsDto.setParticipantsnEmail(mails);
return meetTaskEwsDto;
}
如果有小伙伴觉得不够详细具体可看官方网址:
https://docs.microsoft.com/zh-cn/exchange/client-developer/exchange-web-services/how-to-add-attachments-by-using-ews-in-exchange
欢迎大家留言讨论
如有转载请标明出处