現在一般的企業級應用都有需要向使用者發送約會邀請的功能需求,下面我們就來講講如何通過asp.net來發送約會邀請到outlook 中。
現在這方面的第三方庫比較多,我用的是DDay.iCal.它現在對於各個版本的outlook都支援良好,並且不依賴於office interop組件。下面
就來看一下具體的實現細節吧。
public void Sendmail_With_IcsAttachment()<br /> {<br /> MailMessage msg = new MailMessage();<br /> //Now we have to set the value to Mail message properties<br /> //Note Please change it to correct mail-id to use this in your application<br /> msg.From = new MailAddress(SmtpAccount, "ABC");<br /> msg.To.Add(new MailAddress(TestAccount, "BCD"));<br /> //msg.CC.Add(new MailAddress("zzzzz@xyz.com", "DEF"));// it is optional, only if required<br /> msg.Subject = "Send mail with ICS file as an Attachment";<br /> msg.Body = "Please Attend the meeting with this schedule";<br /> // Now Contruct the ICS file using string builder<br /> StringBuilder str = new StringBuilder();<br /> str.AppendLine("BEGIN:VCALENDAR");<br /> str.AppendLine("PRODID:-//Schedule a Meeting");<br /> str.AppendLine("VERSION:2.0");<br /> str.AppendLine("METHOD:REQUEST");<br /> str.AppendLine("BEGIN:VEVENT");<br /> str.AppendLine(string.Format("DTSTART:{0:yyyyMMddTHHmmssZ}", DateTime.Now.AddMinutes(+330)));<br /> str.AppendLine(string.Format("DTSTAMP:{0:yyyyMMddTHHmmssZ}", DateTime.UtcNow));<br /> str.AppendLine(string.Format("DTEND:{0:yyyyMMddTHHmmssZ}", DateTime.Now.AddMinutes(+660)));<br /> str.AppendLine("LOCATION: " + "");<br /> str.AppendLine(string.Format("UID:{0}", Guid.NewGuid()));<br /> str.AppendLine(string.Format("DESCRIPTION:{0}", msg.Body));<br /> str.AppendLine(string.Format("X-ALT-DESC;FMTTYPE=text/html:{0}", msg.Body));<br /> str.AppendLine(string.Format("SUMMARY:{0}", msg.Subject));<br /> str.AppendLine(string.Format("ORGANIZER:MAILTO:{0}", msg.From.Address));<br /> str.AppendLine(string.Format("ATTENDEE;CN=/"{0}/";RSVP=TRUE:mailto:{1}", msg.To[0].DisplayName, msg.To[0].Address));<br /> str.AppendLine("BEGIN:VALARM");<br /> str.AppendLine("TRIGGER:-PT15M");<br /> str.AppendLine("ACTION:DISPLAY");<br /> str.AppendLine("DESCRIPTION:Reminder");<br /> str.AppendLine("END:VALARM");<br /> str.AppendLine("END:VEVENT");<br /> str.AppendLine("END:VCALENDAR");<br /> //Now sending a mail with attachment ICS file.<br /> System.Net.Mail.SmtpClient smtpclient = new System.Net.Mail.SmtpClient();<br /> smtpclient.Host =SmtpHost; //-------this has to given the Mailserver IP<br /> smtpclient.Port = SmtpPort;<br /> smtpclient.EnableSsl = true;<br /> smtpclient.Credentials = new NetworkCredential(SmtpAccount, SmtpPassword);<br /> // smtpclient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;<br /> System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");<br /> contype.Parameters.Add("method", "PUBLISH");<br /> // contype.Parameters.Add("method", "REQUEST");<br /> contype.Parameters.Add("name", "Meeting.ics");<br /> AlternateView avCal = AlternateView.CreateAlternateViewFromString(str.ToString(), contype);<br /> msg.AlternateViews.Add(avCal);<br /> smtpclient.Send(msg);<br /> }
只要把郵件配置搞好,就能發送約會邀請了。下面來看看效果吧
是不是效果還不錯,不過我還要補充一點就是使用AlternateView 可能會影響原來的設定屬性也就是說
我之前設定的msg.IsBodyHtml=true.在我使用 System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");後就不起作用了,這個問題我查了很多資料也浪費了大量的
時間,最後我使用了兩個AlternateView 來實現我文本的不同編碼形式。就是把msg.Body="some content";
放在一個AlternateView 中。代碼如下
System.Net.Mime.ContentType htmlContype = new System.Net.Mime.ContentType("text/html");<br /> AlternateView htmlView = AlternateView.CreateAlternateViewFromString(content, htmlContype);<br /> msg.AlternateViews.Add(htmlView);<br /> System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");<br /> contype.Parameters.Add("name", "MeetingRequest.ics");<br /> AlternateView avCal = AlternateView.CreateAlternateViewFromString(meetingRequestion, contype);<br /> msg.AlternateViews.Add(avCal);
希望這段代碼能為你節省不少的時間。
想要深入瞭解的同學,可以訪問以下連結
http://kobikobi.wordpress.com/2009/01/03/sending-meeting-requests-to-outlook-via-aspnet-mail-message/