.net 下发送calendar
前段时间公司系统中有一块需要发送邮件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的更多相关文章
- phpcmsV9中表单向导在js调用里日期控件在IE下报Calendar未定义的解决办法
最近在phpcmsV9里用表单向导弄个的提交表单,但用了日期和时间类型时,用 <script language='javascript' src='{APP_PATH}index.php?m ...
- 在Linux命令行下发送html格式的邮件
在Linux利用formail+sendmail来发送带图片的邮件 formail接收html格式的文件作为邮件的内容,这样就可以解决发送带图片邮件的问题了,因为html中可以插入图片,只要给出的im ...
- ZOC7在Mac下发送命令到多个窗口设置
1 详见截图,找了半天 2 然后,下边框就会出现命令发送多个窗口的输入框了
- Phabricator 在 centos 系统下发送 Email的配置
前言 phabricator 配置email 其实很简单,配好smtp 服务器.端口.协议.用户名和登陆密码,但过程却好麻烦. 开始时跟着官网配 sendmail ,又 google 又 baidu, ...
- Python下发送定时消息给微信好友
""" Description:时间可以改长一点 一分钟一个 Author:Nod Date: Record: #---------------------------- ...
- linux下发送报警邮件(mailx)
本文章主要解决 linux下监控到系统状况后怎么发邮件报警的问题. 如果你是最小化安装的centos/redhat 系统,是没有自带mailx的,也就是没有mail 命令. 解决办法 yum -y i ...
- Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收
之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...
- volley框架下发送和读取cookie
首先volley本身不支持cookie,但是volley又非常好用(比如封装了网络请求的实现,内部支持并发, 不用我们再额外设计网络管理异步处理,网络请求不应在UI线程等等),那既想使用volley又 ...
- django查询优化及ajax编码格式下发送数据 总结
orm查询优化 1)only与refer only方法返回的是一个queryset对象,本质就是列表套数据对象 该对象内只含有only括号所指定的属性(其他属性也可以获取,但是需要重新走数据库 ...
随机推荐
- 用JAVA自己画一张二维码
我们都知道,最近2年移动支付在中国堪称新四大发明之一. 二维码无处不在,特别是最近的支付宝扫码领红包,微信,qq,到处在发,阿里有点攻占腾讯移动支付市场的势头啊~博主忽然就对二维码是怎么画的有了点好奇 ...
- attr设置checked,disabled等属性失效的问题,jquery的attr和prop的区别
最近做项目遇到一个问题,radio设置了默认checked值,attr("checked",true)切换checked值失效 最后发现是jquery1.6版本之后,attr和pr ...
- 为 Azure IoT Edge 设备部署 Azure Stream Analytics 服务
在前面的两篇文章<Azure IoT Edge on Windows 10 IoT Core>和<Azure IoT Edge on Raspberry Pi 3 with Rasp ...
- 《重构——改善既有代码的设计》【PDF】下载
<重构--改善既有代码的设计>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196358 编辑推荐 重构,一言以蔽之,就是在不改变外 ...
- 小白的Python之路 PEP8 代码风格
转载自http://www.douban.com/note/134971609/ Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下 ...
- 【python】函数返回值
- cors解决Web跨域访问问题
首先了解一下什么是跨域以及解决的几种常见方式. 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器施加的安全限制. 所谓同源是指,域名,协议,端口均相同. 举例: 相对于 ...
- iOS 图片的拉伸,取固定区域显示
1.图片拉伸合适的尺寸 以及清晰度 UIButton * but =[[UIButton alloc]initWithFrame:CGRectMake(, , , )]; //拉伸 /*UIImage ...
- Swift基础学习
Swift基础学习 http://c.biancheng.net/cpp/html/2242.html 这个网站最近看了一下,对于基本语法解释概括的相对全面,如同重新练习一遍OC似的,挺全面的,谢谢 ...
- iOS框架搭建(MVC,自定义TabBar)--微博搭建为例
项目搭建 1.新建一个微博的项目,去掉屏幕旋转 2.设置屏幕方向-->只有竖向 3.使用代码构建UI,不使用storyboard 4.配置图标AppIcon和LaunchImage 将微博资料的 ...