为了账号安全,请及时绑定邮箱和手机立即绑定

c#基础知识之获取exchange中的图片

标签:
C#

摘要

在exchange 2007或者2010中获取的邮件内容为html标签格式,也就是一个页面。如果里面含有img标签,你会发现img标签的src属性为cid:xxxxxxxxxxxx的一串字符串,并不是url,这时候就造成页面上图片显示不出来。

解决办法

在网上找了一种解决办法。

原文地址:http://stackoverflow.com/questions/6650842/ews-exchange-2007-retrieve-inline-images

首先创建cid的索引


private const string CidPattern = "cid:";

private static HashSet<int> BuildCidIndex(string html)
{
   var index = new HashSet<int>();
   var pos = html.IndexOf(CidPattern, 0);
   while (pos > 0)
   {
       var start = pos + CidPattern.Length;
       index.Add(start);
       pos = html.IndexOf(CidPattern, start);
   }
   return index;
}


在索引的基础上封装一个替换的方法


private static void AdjustIndex(HashSet<int> index, int oldPos, int byHowMuch)
{
   var oldIndex = new List<int>(index);
   index.Clear();
   foreach (var pos in oldIndex)
   {
       if (pos < oldPos)
           index.Add(pos);
       else
           index.Add(pos + byHowMuch);
   }          
}

private static bool ReplaceCid(HashSet<int> index, ref string html, string cid, string path)
{
   var posToRemove = -1;
   foreach (var pos in index)
   {
       if (pos + cid.Length < html.Length && html.Substring(pos, cid.Length) == cid)
       {
           var sb = new StringBuilder();
           sb.Append(html.Substring(0, pos-CidPattern.Length));
           sb.Append(path);
           sb.Append(html.Substring(pos + cid.Length));
           html = sb.ToString();

           posToRemove = pos;
           break;
       }
   }

   if (posToRemove < 0)
       return false;

   index.Remove(posToRemove);
   AdjustIndex(index, posToRemove, path.Length - (CidPattern.Length + cid.Length));

   return true;
}


在获取的item中获取附件


FileAttachment[] attachments = null;
var index = BuildCidIndex(sHTMLCOntent);
if (index.Count > 0 && item.Attachments.Count > 0)
{
   var basePath = Directory.GetCurrentDirectory();

   attachments = new FileAttachment[item.Attachments.Count];
   for (var i = 0; i < item.Attachments.Count; ++i)
   {
     var type = item.Attachments[i].ContentType.ToLower();
     if (!type.StartsWith("image/")) continue;                    
     type = type.Replace("image/", "");

     var attachment = (FileAttachment)item.Attachments[i];
     var cid = attachment.ContentId;
     var filename = cid + "." + type;
     var path = Path.Combine(basePath, filename);
     if(ReplaceCid(index, ref sHTMLCOntent, cid, path))
     {
        // only load images when they have been found          
        attachment.Load(path);
        attachments[i] = attachment;
     }
  }
}
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消