前段时间公司系统中有一块需要发送邮件calendar

outlook可以接受查看calendar

发送outlook主要是有rrule脚本的边界

网上找过一些资料,主要有两种实现方式

1、一种是已ics的附件格式发送附件,但是这样用户接收到的calendar

需要点开附件才能查看calendar,用户体验不是特别好。

2、编辑一段rrule,在邮件发送的时候以( System.Net.Mime.ContentType contype = new System.Net.Mime.ContentType("text/calendar");)格式发送

用户即可收到calendar

我项目中采用了第二种方式

ruule 替换代码

//替换 生成calenar 字符串(RRule格式 可使用DDay.iCal插件 生成 ,目前为手动拼接)
public class CalendarFormat
{
public string GetCalendar(CalendarContent cont)
{
#region RRule字符串 拼接Calendar
string bodyCalendar = @"BEGIN:VCALENDAR
PRODID:Microsoft CDO for Microsoft Exchange
VERSION:2.0
METHOD:REQUEST
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VTIMEZONE
TZID:China Standard Time
BEGIN:STANDARD
DTSTART:16010101T000000
TZOFFSETFROM:+0800
TZOFFSETTO:+0800
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
ATTENDEE;CN={10};RSVP=TRUE:{9}
CLASS:PUBLIC
CREATED:{8}
DESCRIPTION:{6}
DTEND;TZID='China Standard Time':{1}
DTSTAMP:{8}
DTSTART;TZID='China Standard Time':{0}
LAST-MODIFIED:{8}
LOCATION:{2}
ORGANIZER;CN={3}:mailto:{4}
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=zh-cn:{7}
TRANSP:OPAQUE
UID:{5}
X-ALT-DESC;FMTTYPE=text/html:<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 3.2//E
N'>\n<HTML>\n<HEAD>\n<META NAME='Generator' CONTENT='MS Exchange Server ve
rsion 14.02.5004.000'>\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n<!-- Converted f
rom text/rtf format -->\n\n<P DIR=LTR ALIGN=JUSTIFY><SPAN LANG='en-us'><FO
NT FACE='宋体'>{6}</FONT></SPAN><SPAN LANG='en-us'></SPAN></P></BODY></HTML>
X-MICROSOFT-CDO-BUSYSTATUS:BUSY
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-APPTSEQTIME:{8}
X-MS-OLK-AUTOFILLLOCATION:FALSE
X-MS-OLK-CONFTYPE:0
BEGIN:VALARM
TRIGGER:-PT15M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR";
#endregion

bodyCalendar = string.Format(bodyCalendar,
cont.StartTime.ToString("yyyyMMddTHHmmss"),
cont.EndTime.ToString("yyyyMMddTHHmmss"),
cont.location+""!=""?cont.location:"",
cont.username + "" != "" ? cont.username : "",
cont.email + "" != "" ? cont.email : "",
Guid.NewGuid().ToString("B"),
cont.body + "" != "" ? cont.body : "",
cont.subject + "" != "" ? cont.subject : "",
DateTime.Now.ToString("yyyyMMddTHHmmssZ"),
cont.attendeeList!=null?string.Join(",",cont.attendeeList):"",
"shima"
);

return bodyCalendar;
}
}

下面是邮件发送时的代码

执行
public void MySendMail(List<MailAttach> att)
{
SendNeed need=new SendNeed();
need.MailServer = "smtp.qq.com";
need.UserName = "XXX@qq.com";
need.PasssWord = "XXX";
need.interval = 10000;
CalendarContent cont=new CalendarContent();
cont.body = "nihao";
cont.StartTime = DateTime.Now;
cont.EndTime = DateTime.Now.AddHours(2);
cont.subject = "开会";
CalendarFormat calformat=new CalendarFormat();
string str = calformat.GetCalendar(cont);
string senderAddress = "XXX@qq.com";
string ToAddress = "XXX@qq.com";
string CCAddress = "";
string mailSubject = "HELLO";
string mailBody = "开会 你还";
EmailCalendarHelper emial=new EmailCalendarHelper();
emial.SendMessage(senderAddress, ToAddress, CCAddress, mailSubject, mailBody, att, str, need);

}

//发送邮件
public class SendNeed
{
public string MailServer;
public string UserName;
public string PasssWord;
public int interval;
}

public class MailAttach
{
public string mailAttachmentName;
public byte[] mailAttachment;

public MailAttach(string mailAttachmentName, byte[] mailAttachment)
{
this.mailAttachmentName = mailAttachmentName;
this.mailAttachment = mailAttachment;
}
}

public class EmailCalendarHelper
{
public bool SendMessage(string senderAddress, string ToAddress, string CCAddress, string mailSubject,
string mailBody, List<MailAttach> mailatt, string CalendarFromat,
SendNeed account)
{
//邮件发送类
System.Net.Mail.MailMessage mail = new System.Net.Mail.MailMessage();
//是谁发送的邮件
mail.From = new System.Net.Mail.MailAddress(senderAddress);
//发送给谁
int i;
string[] arrTo = ToAddress.Split(new char[] { ';' });
int iLength = arrTo.Length;
for (i = 0; i < iLength; i++)
{
mail.To.Add(arrTo[i]);
}

//抄送
if (CCAddress.Trim().Length > 0)
{
string[] arrCC = CCAddress.Split(new char[] { ';' });
iLength = arrCC.Length;
for (i = 0; i < iLength; i++)
{
if (arrCC[i].Length > 0)
mail.CC.Add(arrCC[i]);
}
}
//标题
mail.Subject = mailSubject;
//内容
mail.Body = mailBody;
//附件
if (mailatt!=null)
{
foreach (var ma in mailatt)
{
if (ma.mailAttachment != null && ma.mailAttachment.Length > 0)
{
MemoryStream attStream = new MemoryStream();
attStream.Write(ma.mailAttachment, 0, ma.mailAttachment.Length);
attStream.Seek(0, SeekOrigin.Begin);
mail.Attachments.Add(new System.Net.Mail.Attachment(attStream, ma.mailAttachmentName, System.Net.Mime.MediaTypeNames.Application.Octet));
}
}
}
//内容编码
mail.BodyEncoding = Encoding.Default;
//发送优先级
mail.Priority = System.Net.Mail.MailPriority.High;
//calendar字符串
string bodyCalendar = CalendarFromat;
//是否HTML形式发送
mail.IsBodyHtml = true;
//邮件服务器和端口
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient(account.MailServer, 25);
smtp.EnableSsl = true;
smtp.UseDefaultCredentials = true;
//指定发送方式
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//指定登录名和密码
smtp.Credentials = new System.Net.NetworkCredential(account.UserName, account.PasssWord);

//能不能发送看到效果全靠它了
{
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(bodyCalendar, contype);
mail.AlternateViews.Add(avCal);
}
//超时时间
smtp.Timeout = account.interval;
smtp.Send(mail);
mail.Dispose();
smtp.Dispose();
return true;
}
}

第二种方式有一种弊端,因为项目需求,发送calendar的时候,要同事发送table

但是calendar是以 以"text/calendar"格式发送邮件,所以table 格式无法呈现,测试直接用

outlook进行相同的操作也是会出现无格式。

后来被迫把calendar和table分两封邮件发出,如果有小伙伴有什么好的实施方案,欢迎指教。

.net 下发送calendar的更多相关文章

  1. phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法

    最近在phpcmsV9里用表单向导弄个的提交表单,但用了日期和时间类型时,用   <script language='javascript' src='{APP_PATH}index.php?m ...

  2. 在Linux命令行下发送html格式的邮件

    在Linux利用formail+sendmail来发送带图片的邮件 formail接收html格式的文件作为邮件的内容,这样就可以解决发送带图片邮件的问题了,因为html中可以插入图片,只要给出的im ...

  3. ZOC7在Mac下发送命令到多个窗口设置

    1 详见截图,找了半天 2 然后,下边框就会出现命令发送多个窗口的输入框了

  4. Phabricator 在 centos 系统下发送 Email的配置

    前言 phabricator 配置email 其实很简单,配好smtp 服务器.端口.协议.用户名和登陆密码,但过程却好麻烦. 开始时跟着官网配 sendmail ,又 google 又 baidu, ...

  5. Python下发送定时消息给微信好友

    """ Description:时间可以改长一点 一分钟一个 Author:Nod Date: Record: #---------------------------- ...

  6. linux下发送报警邮件(mailx)

    本文章主要解决 linux下监控到系统状况后怎么发邮件报警的问题. 如果你是最小化安装的centos/redhat 系统,是没有自带mailx的,也就是没有mail 命令. 解决办法 yum -y i ...

  7. Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收

    之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...

  8. volley框架下发送和读取cookie

    首先volley本身不支持cookie,但是volley又非常好用(比如封装了网络请求的实现,内部支持并发, 不用我们再额外设计网络管理异步处理,网络请求不应在UI线程等等),那既想使用volley又 ...

  9. django查询优化及ajax编码格式下发送数据 总结

    orm查询优化 1)only与refer ​ only方法返回的是一个queryset对象,本质就是列表套数据对象 ​ 该对象内只含有only括号所指定的属性(其他属性也可以获取,但是需要重新走数据库 ...

随机推荐

  1. mvc 中Range中max和min值晚绑定

    对于Attribute : Range(min,max)的min和max必须在用的时候给,但是需求有时须要把这两个值存db.动态取出的.这时就须要razor帮忙了: @Html.TextBoxFor( ...

  2. [hdu 4869](14年多校I题)Turn the pokers 找规律+拓欧逆元

    Turn the pokers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. public,private,protected,以及不写时的差别

    作用域public,private.protected.以及不写时的差别 这四个作用域的可见范围例如以下表所看到的. 说明:假设在修饰的元素上面没有写不论什么訪问修饰符,则表示friendly.不使用 ...

  4. IIS中遇到无法预览的问题(HTTP 错误 401.3 - Unauthorized 因为 Web server上此资源的訪问控制列表(ACL)配置或加密设置,您无权查看此文件夹或页面。)

    在IIS中  依次运行例如以下操作: 站点--编辑权限--共享(为了方便能够直接将分享对象设置为everyone)--安全(直接勾选 everyone )--应用--确定.

  5. centos6.5安装git

    1.git源码地址:http://codemonkey.org.uk/projects/git-snapshots/git/

  6. Spark术语

    1.resilient distributed dataset (RDD) The core programming abstraction in Spark, consisting of a fau ...

  7. springboot 入门四-时间类型处理

    springboot 自带了jackson来处理时间,但不支持jdk8 LocalDate.LocalDateTime的转换. 对于Calendar.Date二种日期,转换方式有二种: 一.统一app ...

  8. KVO等具体实现步骤以及注意事项

    KVO是一种设计模式,名为观察者. addObserver:forKeyPath:options:context: 通知其他对象的方法,这个方法在NSObject中就已经申明了,也就是说任何继承自NS ...

  9. 三菱Q系列PLC的智能功能模块程序

    一.模拟量输入模块Q64AD 1.模块开关或者参数设置 1.1I/O分配 1.2开关设置使用通道1,0-5v, 1.3使用GX configurator设置自动刷新PLC设置智能功能模块参数,即将模拟 ...

  10. 从头开始搭建一个Spring boot+ActiveMQ高可用分布式环境

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...