java ics 發送郵件日曆提醒


        最近做了一個項目,要根據客戶定製的任務信息發日曆提醒信息,上網查了些資料,發現網上的資料有些不全,這對於初次接觸這個技術的人來說是件很麻煩的事,所以把代碼分享一下,希望對大家有所幫助。

      發送日曆提醒有兩種方式 ,一種通過純文本方式,一種是通過iCal4j 自動生成一個提醒時間,不管哪種方式,都要有一下幾個元素


BEGIN:VCALENDAR                   ------ 起始
VERSION:2.0                       ------ 版本
PRODID:iCal4j v1.0//EN            ------ 創建該對象的標誌符
BEGIN:VEVENT                      ------ 事件開始
DTSTART:19970714T170000Z          ------ 事件起始時間
DTEND:19970715T040000Z            ------ 事件結束時間
SUMMARY:Bastille Day Party        ------ 事件概要
END:VEVENT                        ------ 事件結束
END:VCALENDAR                     ------ 結束

上面的例子,它表示發生在 1997 年七月十四日下午五點與 1997 年七月十五日四點之間的事件“Bastille Day Party”。      


較爲詳細的資料可以參考 iCalendar 編程基礎:瞭解和使用 iCal4j 這篇文章。


下面我們通過代碼來講解

首先 需要幾個jar 包  mail.jar(生成郵件的),ical4j-1.0.jar 

下面是完整的java 代碼


這個 類 是生成提醒時間的類

SalesFollowupScheduleImpl.java

 import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.net.SocketException;
import java.net.URI;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.DateTime;
import net.fortuna.ical4j.model.TimeZone;
import net.fortuna.ical4j.model.TimeZoneRegistry;
import net.fortuna.ical4j.model.TimeZoneRegistryFactory;
import net.fortuna.ical4j.model.ValidationException;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.component.VTimeZone;
import net.fortuna.ical4j.model.parameter.Cn;
import net.fortuna.ical4j.model.parameter.PartStat;
import net.fortuna.ical4j.model.parameter.Role;
import net.fortuna.ical4j.model.parameter.Rsvp;
import net.fortuna.ical4j.model.property.Attendee;
import net.fortuna.ical4j.model.property.CalScale;
import net.fortuna.ical4j.model.property.Created;
import net.fortuna.ical4j.model.property.Location;
import net.fortuna.ical4j.model.property.Method;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Uid;
import net.fortuna.ical4j.model.property.Version;
import net.fortuna.ical4j.util.UidGenerator;
import org.apache.log4j.Logger;
import com.m3td.m3ssi.bussion.email.MailSendCustomerManagerImpl;
import com.m3td.m3ssi.common.util.FileUtil;
import com.m3td.m3ssi.entity.sales.SalesFollowupBean;


/**
 * Sales Person 任務日程提醒(生成ICS)
 * 
 * @author jet
 * @time 2012-12-13
 * 
 */
public class SalesFollowupScheduleImpl {
 
 
private static final Logger log = Logger
.getLogger(SalesFollowupScheduleImpl.class);
 
//創建日曆
public void createEvent(SalesFollowupBean salesFollowupBean) throws ParseException, IOException, ValidationException{

if(salesFollowupBean!=null)
{
SimpleDateFormat sdf  =new  SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
 
Date startDateV = new Date();
String date = salesFollowupBean.getTask_fulltime();


String content = salesFollowupBean.getTask_content();
startDateV = sdf.parse(date);
 
//創建時區
TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();

//設置時區
TimeZone timezone = registry.getTimeZone("America/Mexico_City"); 
VTimeZone tz = timezone.getVTimeZone();

// Start Date
java.util.Calendar startDate = new GregorianCalendar();

startDate.setTimeZone(timezone);
startDate.setTime(startDateV);

// End Date
java.util.Calendar endDate = new GregorianCalendar();
endDate.setTimeZone(timezone);
 
endDate.setTime(startDateV);
 
//Create the event
String eventName = salesFollowupBean.getTask_content();
DateTime start = new DateTime(startDate.getTime());
DateTime end = new DateTime(endDate.getTime());
VEvent meeting = new VEvent(start, end, eventName);
//add timezone info..
meeting.getProperties().add(tz.getTimeZoneId());
meeting.getProperties().add(new Location(""));//表裏沒有提醒地點,等以後有了添加上 
meeting.getProperties().add(new Created("20121219T112146Z")); 

//generate unique identifier..
UidGenerator ug = new UidGenerator("1"); 
Uid uid = ug.generateUid(); 
meeting.getProperties().add(uid); 

//add attendees..
Attendee dev1 = new Attendee(URI.create("mailto:"+ salesFollowupBean.getCustomer_email())); 
dev1.getParameters().add(Role.REQ_PARTICIPANT);
dev1.getParameters().add(Rsvp.TRUE);  
dev1.getParameters().add(PartStat.NEEDS_ACTION);  
dev1.getParameters().add(new Cn(content));
meeting.getProperties().add(dev1);

Attendee dev2 = new Attendee(URI.create("mailto:"+salesFollowupBean.getCustomer_email())); 
dev1.getParameters().add(Role.REQ_PARTICIPANT);
dev1.getParameters().add(Rsvp.TRUE);  
dev1.getParameters().add(PartStat.NEEDS_ACTION);  
dev1.getParameters().add(new Cn(content)); 
meeting.getProperties().add(dev2);
 
//Create a calendar
net.fortuna.ical4j.model.Calendar icsCalendar = new net.fortuna.ical4j.model.Calendar();
icsCalendar.getProperties().add(new ProdId("--//Events Calendar//iCal4j 1.0//EN"));
icsCalendar.getProperties().add(CalScale.GREGORIAN);
icsCalendar.getProperties().add(Version.VERSION_2_0); 
icsCalendar.getProperties().add(Method.REQUEST);  
 
//Add the event and print
icsCalendar.getComponents().add(meeting);

CalendarOutputter co = new CalendarOutputter(false);  
   Writer wtr = new StringWriter();  
   co.output(icsCalendar, wtr);  
   //日曆提醒文件轉換問文本,做爲郵件發送
   String mailContent = wtr.toString(); 

//生成文件是否成功標示
boolean result = false;
//指定ics文件名稱
String test = salesFollowupBean.getId()+"-"+salesFollowupBean.getSales_id();

// 生成ics文件
String dir = "d:/data/";   //晚點替換成變量 文件的生成格式
String fileName = test + ".ics";

String fileNamePath =  dir+fileName;
result = FileUtil.writeEncodingFile("UTF-8", fileNamePath,
mailContent);
if(result==true){
log.debug("....生成ics文件成功....");
//send email
MailSendCustomerManagerImpl t = new MailSendCustomerManagerImpl();
t.sendMail(mailContent,fileNamePath,salesFollowupBean );
}
else
{
log.debug(".....生成ics文件失敗.....");
}
}


//文本發送的方法

public StringBuffer createIcs() throws SocketException{
UidGenerator ug = new UidGenerator("1"); 
Uid uid = ug.generateUid(); 

StringBuffer buffer = new StringBuffer();  
         buffer.append("BEGIN:VCALENDAR\n"  
                 + "PRODID:-//Microsoft Corporation//Outlook 9.0 MIMEDIR//EN\n"  
                 + "VERSION:2.0\n"  
                 + "METHOD:REQUEST\n"  
                 + "BEGIN:VEVENT\n"  
                 + "ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE:MAILTO:"+"[email protected]"+"\n"  
                 + "ORGANIZER:MAILTO:"+"[email protected]"+"\n"  
                 + "DTSTART:20120302T060000Z\n"  
                 + "DTEND:20120302T070000Z\n"  
                 + "LOCATION:Conference room\n"  
                 + "UID:"+uid+"\n"//如果id相同的話,outlook會認爲是同一個會議請求,所以使用uuid。  
                 + "CATEGORIES:SuccessCentral Reminder\n"  
                 + "DESCRIPTION:This the description of the meeting.<br>asd;flkjasdpfi\n\n"  
                 + "SUMMARY:Test meeting request\n" + "PRIORITY:5\n"  
                 + "CLASS:PUBLIC\n" + "BEGIN:VALARM\n"  
                 + "TRIGGER:-PT15M\n" + "ACTION:DISPLAY\n"  
                 + "DESCRIPTION:Reminder\n" + "END:VALARM\n"  
                 + "END:VEVENT\n" + "END:VCALENDAR"); 
         
         
         return buffer;
}
 
}

MailSendCustomerManagerImpl.java  發送郵件的類

/**
 * 客戶信息發送,郵件處理類
 * 
 * @author jet
 * @time 2012-07-21
 * 
 */
public class MailSendCustomerManagerImpl {


private static Logger logger = Logger
.getLogger(MailSendCustomerManagerImpl.class);


@SuppressWarnings("static-access")
public void sendMail(String sendFile,String fileNamePath,SalesFollowupBean salesFollowupBean)
throws IOException {


logger.debug("==== com.m3td.m3spring.service.task.impl.MailSendCustomerManagerImpl.sendMailCustomerInfoForStaffManager() start====");
 
// 讀取郵件配置信息
Properties perties = new Properties();
EmailSenderInfo mailSenderInfo = new EmailSenderInfo();
try {

// 獲取郵件配置信息
InputStream inputStream = new BufferedInputStream(
new FileInputStream(this.getWebInfPath()+"/WEB-INF/resource.properties"));
perties.load(inputStream);
mailSenderInfo.setMailServerHost(perties.getProperty("email.server.host"));
mailSenderInfo.setTransport(perties.getProperty("email.server.transport"));
mailSenderInfo.setFromAddress(perties.getProperty("email.from.address"));
mailSenderInfo.setUserName(perties.getProperty("email.from.userName"));
mailSenderInfo.setPassword(perties.getProperty("email.from.userPassword"));

String toadderss[] = {salesFollowupBean.getCustomer_email()};// 多個郵件接收人 取customer info
String filesNames[] = {fileNamePath}; // 多個文件名 通過sales
// 正文
mailSenderInfo.setContent(salesFollowupBean.getTask_content()); // content
// 主題
mailSenderInfo.setSubject(salesFollowupBean.getTask_content()); //content
// 接收人
mailSenderInfo.setToAddress(salesFollowupBean.getCustomer_email()); // 單個郵件接收人 ,取customer
mailSenderInfo.setToAddressArray(toadderss);
// 發送文件名稱
mailSenderInfo.setFileName(fileNamePath); // 單個文件名 // 通過sales // id 和 // 客戶名稱生成
mailSenderInfo.setAttachFileNames(filesNames);
mailSenderInfo.setDoSend(true);
mailSendProccess(mailSenderInfo,sendFile); // 執行郵件發送
} catch (IOException ex) {
ex.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
}
}


/**
* 執行郵件發送

* @param mailSenderInfo
*            郵件信息對象
* @throws IOException
*/
private void mailSendProccess(EmailSenderInfo mailSenderInfo,
String contextPath) throws IOException {


logger
.debug("==== com.m3td.m3spring.service.task.impl.MailSendCustomerManagerImpl.mailSendProccess() start====");
try {
// 設置郵件服務屬性
Properties props = new Properties();
props.put("mail.smtp.host", mailSenderInfo.getMailServerHost());
props.put("email.server.transport", mailSenderInfo
.getMailServerPort());
props.put("mail.smtp.auth", "true");


// 根據屬性新建一個郵件會話,消息對象
Session session = Session.getInstance(props);
session.setDebug(true);


MimeMessage message = new MimeMessage(session);
message.setSubject(mailSenderInfo.getSubject()); // 設置主題
message.setSentDate(new Date()); // 設置發信時間
message
.setFrom(new InternetAddress(mailSenderInfo
.getFromAddress()));// 設置發件人地址
message.setContent(contextPath,
"text/calendar;method=REQUEST;charset=UTF-8");
// 添加收件人地址
String[] mailToArray = mailSenderInfo.getToAddressArray();
if (mailToArray == null || mailToArray.length == 0) {
InternetAddress toAddress = new InternetAddress(mailSenderInfo
.getToAddress());
message.setRecipient(Message.RecipientType.TO, toAddress);
} else {
InternetAddress[] toAddressList = new InternetAddress[mailToArray.length];
for (int index = 0; index < mailToArray.length; index++) {
if (toAddressList != null && mailToArray[index] != null
&& (mailToArray[index].trim().length() > 0)) {
toAddressList[index] = new InternetAddress(
mailToArray[index]);
}
}
message.addRecipients(Message.RecipientType.TO, toAddressList);
}


BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(new DataHandler(
new ByteArrayDataSource(contextPath.toString(),
"text/calendar;method=REQUEST;charset=\"UTF-8\"")));
//設置正文
Multipart container = new MimeMultipart();
container.addBodyPart(messageBodyPart);

// Multipart container = new MimeMultipart();
// MimeBodyPart htmlContent = new MimeBodyPart();
// htmlContent.setText(contextPath);
// container.addBodyPart(htmlContent);
// message.setContent(container);


// 設置附件信息
MimeBodyPart fileBodyPart = null;
FileDataSource dataSource = null;
String[] fileNams = mailSenderInfo.getAttachFileNames();
if (fileNams != null && fileNams.length > 0) {
for (int index = 0; index < fileNams.length; index++) {
if (fileNams[index] != null
&& fileNams[index].trim().length() > 0) {
fileBodyPart = new MimeBodyPart();
dataSource = new FileDataSource(fileNams[index]);// 要發送的附件地址
fileBodyPart
.setDataHandler(new DataHandler(dataSource));
fileBodyPart.setFileName(dataSource.getName());// 設置附件的名稱
container.addBodyPart(fileBodyPart);
}
}
message.setContent(container);// 設置附件內容
}
message.saveChanges();// 存儲郵件信息
Transport tranSport = session.getTransport(mailSenderInfo
.getTransport());
tranSport.connect(mailSenderInfo.getMailServerHost(),
mailSenderInfo.getUserName(), mailSenderInfo.getPassword());
tranSport.sendMessage(message, message.getAllRecipients()); // 發送郵件
tranSport.close();


System.err.println("........郵件發送成功....");
} catch (MessagingException e) {
logger
.error("com.m3td.m3spring.service.task.impl.MailSendCustomerManagerImpl.mailSendProccess(MailSenderInfo mailSenderInfo)"
+ " 郵件發送失敗:" + e.getMessage());


}


logger .debug("==== com.m3td.m3spring.service.task.impl.MailSendCustomerManagerImpl.mailSendProccess() end====");
}


//處理普通java類讀取web-inf 下的文件路徑問題
private String getWebInfPath(){  
        URL url = getClass().getProtectionDomain().getCodeSource().getLocation();  
        String path = url.toString();  
        int index = path.indexOf("WEB-INF");  
          
        if(index == -1){  
            index = path.indexOf("classes");  
        }  
          
        if(index == -1){  
            index = path.indexOf("bin");  
        }  
          
        path = path.substring(0, index);  
          
        if(path.startsWith("zip")){//當class文件在war中時,此時返回zip:D:/...這樣的路徑  
            path = path.substring(4);  
        }else if(path.startsWith("file")){//當class文件在class文件中時,此時返回file:/D:/...這樣的路徑  
            path = path.substring(6);  
        }else if(path.startsWith("jar")){//當class文件在jar文件裏面時,此時返回jar:file:/D:/...這樣的路徑  
            path = path.substring(10);   
        }  
        try {  
            path =  URLDecoder.decode(path, "UTF-8");  
        } catch (UnsupportedEncodingException e) {  
            e.printStackTrace();  
        }  
          
        return path;  
    }  

}

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章