用.net c#语言做一个发送会议邀请到outlook并显示在日历上
outlook日历(

iCalendar

)支持RFC5545标准 地址是https://rsync.tools.ietf.org/html/rfc5545(全英文)

iCalendar维基百科上的解释:http://zh.wikipedia.org/wiki/ICalendar
用c#开发可以选择用DDay.iCal库进行开发生成 RRule格式发送下载地址:http://sourceforge.net/projects/dday-ical/ 
也可以自己手动拼接iCalendar格式的字符串
有关RRule的描述:http://www.kanzaki.com/docs/ical/rrule.html(全英文)
关于此库对RRule格式的生成各解析地址为:http://blog.csdn.net/studyzy/article/details/11524627

先来看一下我找的资料链接

1.http://www.jiancool.com/article/71062631552/       用java通过 iCal4j的一个例子
2.http://imggt.com/technology/ical4j-cycle-reminder.html     同样用java通过 iCal4j的一个例子 不过较第一个清析并有修改和取消
3.http://blog.csdn.net/bestdowt1314/article/details/6573631 使用C#拼接的例子
4.http://blog.csdn.net/e111r222/article/details/11554995   关于ics格式的一篇文章
5.http://intl-bcds.iteye.com/blog/629470  同样用java通过iCal4j的一个例子
------------------------------------------------------------------------------------------------------------------------------------

你可以通过编写代码对outlook进行创建 修改 删除 添加

1.创建

  /// <summary>/// 创建/// </summary>public string createEmail(){StringBuilder sb = new StringBuilder();//头部 VCALENDAR{sb.Append("BEGIN:VCALENDAR\nPRODID:-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN\nVERSION:2.0\nMETHOD:REQUEST\n");}//时区    {sb.Append("BEGIN:VTIMEZONE\n");sb.Append("TZID:中国标准时间\n");sb.Append("TZID:Beijing, Chongqing, Hong Kong, Urumqi\n");sb.Append("BEGIN:STANDARD\nDTSTART:16010101T000000\nTZOFFSETFROM:+0800\nTZOFFSETTO:+0800\n");sb.Append("END:STANDARD\n");sb.Append("END:VTIMEZONE\n");}//事件 VEVENT{sb.Append("BEGIN:VEVENT\nATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;MAILTO=111@1111.com:\nDTEND:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T170000")) + "\nDTSTART:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T080000")) + "\nSUMMARY:活动\nUID:ewrewewoqprue@dfjewfdsfwe#$Q@$#@fwef1231\nDESCRIPTION:今天广场活动\nLOCATION:中国\nORGANIZER;CN=111@12222.com:\nSEQUENCE:0\n");//提醒开始 VALARM{   sb.AppendLine("BEGIN:VALARM");//开始sb.AppendLine("TRIGGER;RELATED=START:-PT00H5M00S");//触发sb.AppendLine("ACTION:DISPLAY");// sb.AppendLine("DURATION:PT10M");//每隔15分触发一次// sb.AppendLine("REPEAT:4");//重复4次sb.AppendLine("DESCRIPTION:REMINDER");//描述sb.AppendLine("END:VALARM");//VALARM 结束}//事件结束sb.Append("END:VEVENT\n");}//结束{sb.Append("END:VCALENDAR");}return sb.ToString();}

*需要注意的是:ATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;MAILTO=111@111.com:这句话必需放在 BEGIN:VEVENT之后否则发送之后在outlook显示会有问题

*MAILTO属性值后必需有":"(冒号)否则outlook将视为普通事件,不视为邀请处理
*ORGANIZER组织者(属性为CN时)后有":"(冒号) outlook将视为与出席者必须同在 否则只会出现出席者的邮箱
*一定要有组织者 和ATTENDEE的RSVP属性要为TRUE 设置 METHOD为REQUEST
*每一个VEVENT的uid都是唯一的,如果发送的多封邮件uid都相同那么outlook将视为一封
*****特别注意的是一定要注意空格,一开始我怎么试都不成最后发现是多了空格

2.修改

/// <summary>/// 修改/// </summary>/// <returns></returns>public string modifyEmail(){StringBuilder sb = new StringBuilder();//头部 VCALENDAR{sb.Append("BEGIN:VCALENDAR\nPRODID:-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN\nVERSION:2.0\nMETHOD:REQUEST\n");}//时区    {sb.Append("BEGIN:VTIMEZONE\n");sb.Append("TZID:中国标准时间\n");sb.Append("TZID:Beijing, Chongqing, Hong Kong, Urumqi\n");sb.Append("BEGIN:STANDARD\nDTSTART:16010101T000000\nTZOFFSETFROM:+0800\nTZOFFSETTO:+0800\n");sb.Append("END:STANDARD\n");sb.Append("END:VTIMEZONE\n");}//事件 VEVENT{sb.Append("BEGIN:VEVENT\nATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;MAILTO=111@111.com:\nDTEND:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T200000")) + "\nDTSTART:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T080000")) + "\nSUMMARY:活动\nUID:ewrewewoqprue@dfjewfdsfwe#$Q@$#@fwef1231\nDESCRIPTION:今天广场活动\nLOCATION:中国\nORGANIZER;CN=111@222.com:\nSEQUENCE:1\n");//提醒开始 VALARM{sb.AppendLine("BEGIN:VALARM");//开始sb.AppendLine("TRIGGER;RELATED=START:-PT00H5M00S");//触发sb.AppendLine("ACTION:DISPLAY");// sb.AppendLine("DURATION:PT10M");//每隔15分触发一次// sb.AppendLine("REPEAT:4");//重复4次sb.AppendLine("DESCRIPTION:REMINDER");//描述sb.AppendLine("END:VALARM");//VALARM 结束}//事件结束sb.Append("END:VEVENT\n");}//结束{sb.Append("END:VCALENDAR");}return sb.ToString();}

*需要注意思的是:修改邀请的时候只需要保持uid一致即可(可选项SEQUENCE表示修改序列号 叠加的,实际测试可以对它不做任何修改保持原来的0表示未修改过 此时应该值为1 因为是根据上面做的第一次修改)

*在这里我只修改了开始和结束时间

3.删除(也就是取消邀请)

/// <summary>/// 取消/// </summary>/// <returns></returns>public string cancelEmail(){StringBuilder sb = new StringBuilder();//头部 VCALENDAR{sb.Append("BEGIN:VCALENDAR\nPRODID:-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN\nVERSION:2.0\nMETHOD:CANCEL\n");}//时区    {sb.Append("BEGIN:VTIMEZONE\n");sb.Append("TZID:中国标准时间\n");sb.Append("TZID:Beijing, Chongqing, Hong Kong, Urumqi\n");sb.Append("BEGIN:STANDARD\nDTSTART:16010101T000000\nTZOFFSETFROM:+0800\nTZOFFSETTO:+0800\n");sb.Append("END:STANDARD\n");sb.Append("END:VTIMEZONE\n");}//事件 VEVENT{sb.Append("BEGIN:VEVENT\nATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;MAILTO=111@111.com:\nDTEND:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T200000")) + "\nDTSTART:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T080000")) + "\nSUMMARY:活动\nUID:ewrewewoqprue@dfjewfdsfwe#$Q@$#@fwef1231\nDESCRIPTION:今天广场活动\nLOCATION:中国\nORGANIZER;CN=111@222.com:\nSEQUENCE:2\n");//提醒开始 VALARM{sb.AppendLine("BEGIN:VALARM");//开始sb.AppendLine("TRIGGER;RELATED=START:-PT00H5M00S");//触发sb.AppendLine("ACTION:DISPLAY");// sb.AppendLine("DURATION:PT10M");//每隔15分触发一次// sb.AppendLine("REPEAT:4");//重复4次sb.AppendLine("DESCRIPTION:REMINDER");//描述sb.AppendLine("END:VALARM");//VALARM 结束}//事件结束sb.Append("END:VEVENT\n");}//结束{sb.Append("END:VCALENDAR");}return sb.ToString();}

*需要注意的是:取消邀请的时候只需要保持uid一致并设置METHOD:CANCEL即可(可选项SEQUENCE表示修改序列号 叠加的,实际测试可以对它不做任何修改保持原来的0表示未修改过 此时应该值为2 因为根据上面在取消时进行了修改)

4.添加

/// <summary>/// 添加/// </summary>/// <returns></returns>public string insertEmail(){StringBuilder sb = new StringBuilder();//头部 VCALENDAR{sb.Append("BEGIN:VCALENDAR\nPRODID:-//ddaysoftware.com//NONSGML DDay.iCal 1.0//EN\nVERSION:2.0\nMETHOD:REQUEST\n");}//时区    {sb.Append("BEGIN:VTIMEZONE\n");sb.Append("TZID:中国标准时间\n");sb.Append("TZID:Beijing, Chongqing, Hong Kong, Urumqi\n");sb.Append("BEGIN:STANDARD\nDTSTART:16010101T000000\nTZOFFSETFROM:+0800\nTZOFFSETTO:+0800\n");sb.Append("END:STANDARD\n");sb.Append("END:VTIMEZONE\n");}//事件2 VEVENT{sb.Append("BEGIN:VEVENT\nATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;MAILTO=111@111.com:\nDTEND:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150604T170000")) + "\nDTSTART:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150604T080000")) + "\nSUMMARY:6月4号活动\nUID:wqefasfewfoiweuj4123@#$#@$^*ewkorjweiofj\nDESCRIPTION:6月4号今天广场活动\nLOCATION:中国xxx\nORGANIZER;CN=111@222.com:\nSEQUENCE:0\n");//提醒开始 VALARM{sb.AppendLine("BEGIN:VALARM");//开始sb.AppendLine("TRIGGER;RELATED=START:-PT00H5M00S");//触发sb.AppendLine("ACTION:DISPLAY");// sb.AppendLine("DURATION:PT10M");//每隔15分触发一次// sb.AppendLine("REPEAT:4");//重复4次sb.AppendLine("DESCRIPTION:REMINDER");//描述sb.AppendLine("END:VALARM");//VALARM 结束}//事件结束sb.Append("END:VEVENT\n");}//事件1 VEVENT{sb.Append("BEGIN:VEVENT\nATTENDEE;ROLE=REQ-PARTICIPANT;RSVP=TRUE;PARTSTAT=NEEDS-ACTION;MAILTO=111@111.com:\nDTEND:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T170000")) + "\nDTSTART:" + (string.Format("{0:yyyyMMddTHHmmssZ}", "20150603T080000")) + "\nSUMMARY:活动\nUID:<span style="font-family: 'Open Sans';">ewrewewoqprue@dfjewfdsfwe#$Q@$#@fwef1231</span>\nDESCRIPTION:今天广场活动\nLOCATION:中国\nORGANIZER;CN=111@2222.com:\nSEQUENCE:0\n");//提醒开始 VALARM{sb.AppendLine("BEGIN:VALARM");//开始sb.AppendLine("TRIGGER;RELATED=START:-PT00H5M00S");//触发sb.AppendLine("ACTION:DISPLAY");// sb.AppendLine("DURATION:PT10M");//每隔15分触发一次// sb.AppendLine("REPEAT:4");//重复4次sb.AppendLine("DESCRIPTION:REMINDER");//描述sb.AppendLine("END:VALARM");//VALARM 结束}//事件结束sb.Append("END:VEVENT\n");}//结束{sb.Append("END:VCALENDAR");}return sb.ToString();}

*需要注意的是:添加第一种:(添加VEVENT节) 添加时要将新添加的放在前面并且uid不能为同一个(个人认为放在前面是因为:如果放在后面outlook发现第一个VEVENT的uid与之前的发送邀请的uid相同那么它会认为是同一个请求,此时不会将新的EVENT添加到原来的日历上)

*添加第二种:添加只要重新发送一个邀请即可只要VEVENT节的uid不重复outlook就会在日历(仅限于此计算机栏目)上
------------------------------------------------------------------------------------------------------------------------------------

接下来就是执行发送邮件的程序

/// <summary>/// 发送邮件/// </summary>/// <param name="from">发送人邮件地址</param>/// <param name="fromname">发送人显示名称</param>/// <param name="to">发送给谁(邮件地址)</param>/// <param name="subject">主题</param>/// <param name="body">内容</param>/// <param name="username">邮件登录名</param>/// <param name="password">邮件密码</param>/// <param name="server">邮件服务器</param>public static voidMySendMail(string from, string fromname, string to, string subject, string body, string username, string password, string server){try{//邮件发送类 System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();//是谁发送的邮件 mail.From = new System.Net.Mail.MailAddress(from, fromname);//发送给谁 mail.To.Add(to);//标题 mail.Subject = subject;//内容编码 mail.BodyEncoding = Encoding.Default;//发送优先级 mail.Priority = System.Net.Mail.MailPriority.High;//邮件内容 mail.Body = body;//是否HTML形式发送 mail.IsBodyHtml = true;//邮件服务器和端口 System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(server, 25);smtp.UseDefaultCredentials = true;//指定发送方式 smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;//指定登录名和密码 smtp.Credentials = new System.Net.NetworkCredential(username, password);
                //能不能发送看到效果全靠它了{System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");contype.Parameters.Add("method", "REQUEST");contype.Parameters.Add("charset", "UTF-8");System.Net.Mail.AlternateView avCal = System.Net.Mail.AlternateView.CreateAlternateViewFromString(body, contype);mail.AlternateViews.Add(avCal);}//超时时间smtp.Timeout = 10000;smtp.Send(mail);mail.Dispose();smtp.Dispose();}catch (Exception exp){throw exp;}}

*需要注意的是不能将拼接成的字符串做为附件发过去,要以正文方式发送

.net c# outlook发送邀请功相关推荐

  1. 怎样使用Outlook发送电子邮件,Outlook发送邮件步骤是什么?

    Outlook作为最常用的邮箱客户端之一,受到了很多人的欢迎.但是,Outlook的绑定方法确实比较繁琐,经常会出现问题,不知道Outlook怎么发送邮件.其实,不是所有邮箱都支持绑定邮箱客户端,不过 ...

  2. Python: Git Log自动生成Release Notes,并调用Outlook发送至邮件

    Python: Git Log自动生成Release Notes,并调用Outlook发送至邮件 主要功能 先上图 生成ReleaseNotes 邮件: 生成ReleaseNotes Text: 关键 ...

  3. outlook发送确认画面_如何强制Outlook下载图像(如果确定是个好主意)

    outlook发送确认画面 If you receive an email that contains linked images, Outlook does not download those i ...

  4. outlook发送接收错误_如何在Outlook 2013中为RSS源创建发送/接收组

    outlook发送接收错误 If you choose to manually update your RSS feeds on demand, there is a way to do this w ...

  5. outlook收不到html图片,急!求教高手!用outlook发送HTML格式邮件,图片不能显示是为什么...

    满意答案 hpan9365 2013.10.11 采纳率:59%    等级:11 已帮助:9110人 OneNote 的电子邮件功能需要 Microsoft Office Outlook 2003 ...

  6. 【Vegas原创】outlook发送时,报550 5.7.1 client does not have permissions to send as this sender解决方法...

    环境:exchange2007 outlook2007 AD 现象:老板要收外网邮件,但发送的时候需要用公司exchange来发.账户配置好后,一直报550 5.7.1 client does not ...

  7. 如何更改从Outlook发送的电子邮件中的“答复”地址

    If you're sending an email on behalf of someone else, you might want people to reply to that person ...

  8. Outlook发送后,收到的邮件都是纯文本格式

    不知道哪国语言的网址 疑似官方文档的解决方法,[排错]Outlook中,HTML邮件发送后变成了纯文本格式 https://social.technet.microsoft.com/Forums/he ...

  9. python用outlook自动发邮件_python调用outlook发送exchange邮件(含附件)

    最近在解决一个问题,就是生成每日数据的报表,然后利用邮件群发给各位同事.由于主要工作不在这,为了节省时间,所以选择了使用python语言. 选择发送邮件时,有人可能会说直接使用smtp库不就行吗?为啥 ...

最新文章

  1. WIN7 64位系统下,右下角的声音和电源图标不见的解决办法
  2. html如何呈现在显示器,lcd显示器采用什么显示方式
  3. Wcf 基础教程 服务寄宿之 Windows 服务寄宿
  4. mysql的一些初步使用!mysqlcheck mysqladmin 建立删除修改表,库,等
  5. 基本套接字TCP和UDP
  6. xp故障恢复控制台和它的命令
  7. 我的《野蛮生长》书摘
  8. 《你好,李焕英》总票房逆袭《哪吒》 成中国影史亚军
  9. python自带笔记本电脑_Python执行速度:笔记本电脑与台式机
  10. Supervisor使用说明
  11. MySQL 性能优化一
  12. 【深入理解TcaplusDB技术】详细介绍TDR表
  13. 用C++(附源码)制作一款功能强大,自动偷菜QQ农场辅助!
  14. 手机重装为linux,安卓手机重装系统的方法
  15. office 2021 最新版详细安装教程,附激活方法
  16. Excise_day05_Array
  17. Office2016和Office365有什么区别
  18. 携程 | 组织架构如何影响项目管理
  19. WEB自动化_告警框处理(对话框、确认框、提示框、输入/编辑框、勾选框、单选框、复选框、下拉框)
  20. 中国科学院计算机研究所李华,李华-中国科学院大学-UCAS

热门文章

  1. Windows2016 NLB操作模式
  2. 如何修改eclipse编辑器背景色
  3. 申宝公司-A股短期难改震荡走势
  4. 新玺配资:震荡格局明显 低吸原则为主
  5. [转]100首经典好听的外文歌曲!
  6. ffmpeg 推流到nginx1.22.1+nginx-rtmp-module服务器
  7. 世界是由什么组成的java_世界的万物到底是由什么构成的?答案竟然是:什么都没有?...
  8. HTML5实战之《疯狂猜价格》
  9. 计算pi的近似值公式法_肾脏病患者小心尿毒症!医授低蛋白饮食法:重要计算公式一次曝...
  10. this.PreviousPage.FindControl遇到MasterPage,如何查找控件?