1.方法级代理,获取传入的参数以及返回值。
2.代码示例
@CommandDynamicProxy(
target = NewMeetingCmd.class,
desc = "创建会议代理")
public class CreateOutlookMeetingCmd extends AbstractCommandProxy<Map<String,Object>> {
@Override
public Map<String, Object> execute(Command<Map<String, Object>> targetCommand) {
// System.out.println(getClass().getName() + "command 执行之前做一些事");
//获取到被代理对象
NewMeetingCmd newMeetingCmd = (NewMeetingCmd) targetCommand;
//获取被代理对象的参数
Map<String, Object> params = newMeetingCmd.getParams();
//对参数做预处理
//TODO
//参数回写
newMeetingCmd.setParams(params);
//执行标准的业务处理
Map<String, Object> result = nextExecute(targetCommand);
//对返回值做加工处理
if (result.get("meetingid") != null) {
String meetingid = result.get("meetingid").toString();
CreateOutlookMeetingUtil.sendEmail(meetingid,"REQUEST");
}
// System.out.println(getClass().getName() + "创建outlook会议完成");
return result;
}
}
发送生成会议的方法
public static void send(String title, String text, String location, String startTime, String endTime, String uuid, String method, List<String> emails) {
try {
String fromEmail = emailProp.getProperty("fromEmail", name);
Properties props = new Properties();
try {
//端口一般为 25/465/487 可以使用telnet host port查看是否可用 比如 telnet mail.unipower.cn 25
props.put("mail.smtp.port", "");
//配置outlook上查到的host
props.put("mail.smtp.host", "");
props.put("mail.transport.protocol", "");
props.put("mail.smtp.ssl", "true");
// props.put("mail.debug", "true");
} catch (Exception e) {
e.printStackTrace();
}
Session session;
Authenticator authenticator = new EmailAuthenticator();
session = Session.getInstance(props, authenticator);
MimeMessage message = new MimeMessage(session);
//设置发件人
message.setFrom(new InternetAddress(fromEmail));
//设置单个收件人
// message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
/*
设置多收件人,Message.RecipientType.CC:密送
Message.RecipientType.BCC:抄送
Message.RecipientType.TO:收件人
*/
message.addRecipients(Message.RecipientType.TO,setRecipientT0(emails));
message.setSubject(title);
// String uuid= UUID.randomUUID().toString();
StringBuffer buffer = new StringBuffer();
buffer.append("BEGIN:VCALENDAR\n"
+ "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n"
+ "VERSION:2.0\n"
+ "METHOD:"+method+"\n" //METHOD:CANCEL 取消会议 METHOD:REQUEST 创建和更新会议
+ "BEGIN:VEVENT\n"
+ "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:"+fromEmail+"\n"
+ "ORGANIZER:MAILTO:"+fromEmail+"\n"
+ "DTSTART:"+startTime+"\n"
+ "DTEND:"+endTime+"\n"
+ "LOCATION:"+location+"\n"
//如果id相同的话,outlook会认为是同一个会议请求,所以使用uuid。
+ "UID:"+uuid+"\n"
+ "CATEGORIES:\n"
+ "DESCRIPTION:"+text+"\n\n" // 会议内容换行为\\n
+ "SUMMARY:会议邀请\n" + "PRIORITY:5\n"
+ "SEQUENCE:1\n" //设置优先级 其中cancel>update>create
+ "CLASS:PUBLIC\n" + "BEGIN:VALARM\n"
+ "TRIGGER:-PT15M\n" + "ACTION:DISPLAY\n"
+ "DESCRIPTION:Reminder\n" + "END:VALARM\n"
+ "END:VEVENT\n" + "END:VCALENDAR");
log.info("sendOutlook:"+ buffer);
Multipart multipart = new MimeMultipart();
BodyPart messageBodyPart = new MimeBodyPart();
// 测试下来如果不这么转换的话,会以纯文本的形式发送过去,
//如果没有text/calendar;method=REQUEST;charset=\"UTF-8\",outlook会议附件的形式存在,而不是直接打开就是一个会议请求
messageBodyPart.setDataHandler(new DataHandler(new ByteArrayDataSource(buffer.toString(),"text/calendar;method=REQUEST;charset=\"UTF-8\"")));
// 添加会议邀请内容
multipart.addBodyPart(messageBodyPart);
// 附件功能
// 创建消息部分
BodyPart fujianBodyPart = new MimeBodyPart();
// 添加网络附件
message.setContent(multipart,"text/html;charset=UTF-8");
//message.setText("测试");
Transport.send(message);
} catch (MessagingException me) {
me.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}