前段时间公司系统中有一块需要发送邮件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. Golang开发环境搭建(Notepad++、LiteIDE两种方式以及martini框架使用)

    本文介绍两种Golang的开发环境一种基于notepad++.还有一种基于liteide. 1.下载Golang语言的pkg:http://golangtc.com/download 直接点击安装,一 ...

  2. vue-购物车

    最终的实现效果: 需求分析: 购物车需要展示一个已加入购物车的商品列表,包含商品名称,商品单价,购买数量和操作等信息,还需要实时显示购买的总价.其中购买数量可以增加或减少,每类商品还可以从购物车中移除 ...

  3. python decorator 基础

    一般来说,装饰器是一个函数,接受一个函数(或者类)作为参数,返回值也是也是一个函数(或者类).首先来看一个简单的例子: # -*- coding: utf-8 -*- def log_cost_tim ...

  4. mybatis 之 占位符#{} 和 ${}

    #{}占位符用来设置参数,参数的类型可以有3种,基本类型,自定义类型,map基本类型作为参数,参数与占位符中的名称无关. <select id="findById" para ...

  5. Hibernate--使用注解配置映射关系

    写在前面: 配置实体类与数据库的映射关系,有两种方式: 1.使用*.hbm.xml    :  2.使用@注解 一:注解的方式: 1.@Entity 加在类的前面,将类声明为持久化类. 2.@Tabl ...

  6. scott表结构

  7. 服务器端语言go之开篇分享

    由于之前看过其他脚本语言,此时看服务器端语言go语法时也短短用了半天的时间,如图1所示,是个人学习go语法的目录截图,学习网址:菜鸟网站,为了个人方便学习和记忆,因此写下本篇文章,在本篇文章里我主要是 ...

  8. listbox控件使用

    1. 属性列表: SelectionMode    组件中条目的选择类型,即多选(Multiple).单选(Single)    Rows             列表框中显示总共多少行    Sel ...

  9. Udacity并行计算课程笔记-The GPU Hardware and Parallel Communication Patterns

    本小节笔记大纲: 1.Communication patterns gather,scatter,stencil,transpose 2.GPU hardware & Programming ...

  10. 后缀数组之hihocoder 重复旋律1-4

    蒟蒻知道今天才会打后缀数组,而且还是nlogn^2的...但基本上还是跑得过的: 重复旋律1: 二分答案,把height划分集合,height<mid就重新划分,这样保证了每个集合中的LCP&g ...