利用DevExpress的RichEditControl控件可以发送包含图片的邮件。但存在一个问题。RichEdit直接将图片解析成base64码包含在RichEdit的HtmlText中,这导致客户端发送到服务器时,邮件内容串行化超过容量导致发送失败。

解决的办法参考帖子:https://www.cnblogs.com/wuhuacong/archive/2013/01/27/2878368.html

按照该帖子的方法将图片提取出来,分别发送邮件内容和图片。

Program.MainForm.poxy.AddMailIns(inMails.ToArray());
Program.MainForm.poxy.AddMailOuts(outMails.ToArray());
Program.MainForm.poxy.InsertMailImages(mailImages.ToArray());
Program.MainForm.poxy.InsertMailImageRelations(mailImageRelations.ToArray());

  上面分别存入数据库的四个表:收件表、发件表、图片表、图片邮件关联表。

但是参考帖子只给了发送邮件的解决思路,没有给出接收邮件和显示邮件的方法

具体思路是,给每个邮件对象添加一个IncludeImage属性,如果该属性为false,直接接收邮件并显示即可。

如果为true,在按照邮件ID去邮件图像关联表中找出包含图像的ImageId,再去图像表找出图像,读到本地的图像为byte[]类型,将其转换为base64码,再在邮件中,替换即可。类似这样:

 protected string ParseRichEditContent(frmComMail.BoxMailItem boxMailItem)
{
bool isInMail = boxMailItem.IsInMail;
string mailContent = "";
bool isExistRelation = false;
bool isExistMailImage = false;
string mailId = "";
if (isInMail)
{
mailContent = boxMailItem.InMail.MailContent;
if ((bool)boxMailItem.InMail.IsIncludeImage)
mailId = boxMailItem.InMail.MailId;
}
else
{
mailContent = boxMailItem.OutMail.MailContent;
if ((bool)boxMailItem.OutMail.IsIncludeImage)
mailId = boxMailItem.OutMail.MailId;
}
if (!mailId.Equals(""))//处理有图像文件的显示
{
for (int jj = 0; jj < _frmComMail.mailImageRelations.Count; jj++)
{
if (_frmComMail.mailImageRelations[jj].MailId.Equals(mailId))
{
isExistRelation = true;
break;
}
}
if (!isExistRelation)
_frmComMail = _frmComMail.RefreshMails(0x01000, mailId);//增加本地内存中的mailImageRelation(即_frmComMail.mailImageRelations) for (int jj = 0; jj < _frmComMail.mailImageRelations.Count; jj++)
{
if (_frmComMail.mailImageRelations[jj].MailId.Equals(mailId))
{
for (int kk = 0; kk < _frmComMail.mailImages.Count; kk++)
{
if (_frmComMail.mailImages[kk].ImageId.Equals(_frmComMail.mailImageRelations[jj].ImageId))
{
isExistMailImage = true;
break;
}
}
}
}
if (!isExistMailImage)
_frmComMail = _frmComMail.RefreshMails(0x00100, mailId);//增加本地内存中的mailImage(即_frmComMail.mailImages) for (int jj = 0; jj < _frmComMail.mailImageRelations.Count; jj++)
{
if (_frmComMail.mailImageRelations[jj].MailId.Equals(mailId))
{
for (int kk = 0; kk < _frmComMail.mailImages.Count; kk++)
{
if (_frmComMail.mailImages[kk].ImageId.Equals(_frmComMail.mailImageRelations[jj].ImageId))
{
string base64String = Convert.ToBase64String(_frmComMail.mailImages[kk].Image);
string replaceString = "data:image/" + _frmComMail.mailImages[kk].ImageType + "; base64," + base64String;
mailContent = mailContent.Replace(_frmComMail.mailImages[kk].ImageId, replaceString);
}
}
}
}
}
return mailContent;
}

  上述代码段核心内容为:

string base64String = Convert.ToBase64String(_frmComMail.mailImages[kk].Image);
string replaceString = "data:image/" + _frmComMail.mailImages[kk].ImageType + "; base64," + base64String;
mailContent = mailContent.Replace(_frmComMail.mailImages[kk].ImageId, replaceString);

  

【DevExpress】邮箱制作小结的更多相关文章

  1. 动态传递参数到DevExpress.XtraReports的小结

    原文:动态传递参数到DevExpress.XtraReports的小结 前两种方法和WinForm一样,可以传递参数.数组.实体对象.DataTable等1. 采用构造函数具体用法:在Report中p ...

  2. cadence 焊盘制作小结

    因为以前一直用altium designer 话PCB,做封装的时候焊盘是不用自己操心的,但是开始用cadence以后发现好多以前不太懂的东西,需要自己画焊盘,这就导致需要了解好多自己以前不懂的东西, ...

  3. cadence 封装制作小结

    assembly :是装配层,就是元器件的实际大小,用来产生元器件的装配图.也可以使用此层进行布局:外框尺寸应该为元件除焊盘外的部分 该区域可比silkscreen小10mil,线宽不用设置,矩形即可 ...

  4. html5播放器制作小结

    链接:http://snowinmay.net/6rooms/html/music.php 9月份前的版本: 播放,暂停,点赞,播放状态显示. 9.2版本: 下载歌曲,静音,时间倒计时(点击暂停时倒计 ...

  5. Ubuntu Docker 简单安装 GitLab

    相关博文: Ubuntu 简单安装 Docker Ubuntu 简单安装和配置 GitLab 服务器版本 Ubuntu 16.04 LTS. 1. 安装和配置 安装命令: sudo docker ru ...

  6. Python开发 基础篇

    2019-02-01 产生验证码: 用户输入的值和显示的值相同时显示Correct,否则继续生成随机验证码等待用户输入 def check_code(): import random checkcod ...

  7. c#学习内容

    学习winform+DevExpress 界面制作 wpf UIAutomation 控制别的程序 ok c#通过句柄控制别的程序  ok c# 截图  ok c# 多线程  ok c# 数据库myq ...

  8. DevExpress - 使用 GaugeControl 标尺组件制作抽奖程序 附源码

    前不久,公司举办了15周年庆,其中添加了一个抽奖环节,要从在读学员中随机抽取幸运学员,当然,这个任务就分到了我这里. 最后的效果如下,启动有个欢迎页面,数据是来自Excel的,点击开始则上面的学号及姓 ...

  9. DevExpress控件的GridControl控件小结

    DevExpress控件的GridControl控件小结 (由于开始使用DevExpress控件了,所以要点滴的记录一下) 1.DevExpress控件组中的GridControl控件不能使横向滚动条 ...

随机推荐

  1. python之django基础

    看了不是同一期的视频,发现9期老师线性引入的方式,讲得django更加易于理解掌握. 抱歉的是,笔记没有整理就发上来了.希望看到的人不要被我带偏. 1. 新建Django项目 命令行创建: djang ...

  2. [Chrome] 谷歌浏览器开启开发模式仍然无法安装油猴脚本

    右键 > 属性 > 起始位置 > 添加 --enable-easy-off-store-extension-install 谷歌浏览器无法安装油猴脚本:--enable-easy-o ...

  3. 国内第一本cbuilder开发web的宝典震撼登场(delphi也可参考)

    uniGUI入门到精通cBuilder版 众所周知,cbuilder和delphi是曾经风靡多年的强悍的万能的开发工具,岂奈大浪淘沙,B/S时代的到来让这对孪生兄弟隐姓埋名.然,无数风流人物依然对他们 ...

  4. myls

    #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unist ...

  5. 转载 * jQuery实现动态分割div—通过拖动分隔栏实现上下、左右动态改变左右、上下两个相邻div的大小

    由jQuery实现上下.左右动态改变左右.上下两个div的大小,需要自己引入jquery1.8.0.min.js包 可用于页面布局. //============================ind ...

  6. java如何快速创建List

    几个快速添加list的方法 1. 使用Collections.addAll()方法,前提还是需要手动 new ArrayList ArrayList<String> s = new Arr ...

  7. 微信小程序 image属性 mode

    mode属性可以改变图片的填充容器方式

  8. 监测NGINX服务的shell脚本

    Nginx 虽然处理并发量比 apache 确实要强点,但它这种 php-cgi 模式不是太稳定,这点网上也有朋友总结了,我在实现项目中也感受到了. 偶尔会出现以下情况的:php-cgi 进程突然消失 ...

  9. java变量的自动提升与强制转换

    所有的byte型.short型和char的值将被提升到int型 一个字节可以提升为4个字节 4个字节不可以降为一个字节 强制转换4个字节转换为一个字节 [丢失精度] byte b = 3; b = ( ...

  10. flask-不错的教程

    https://spacewander.github.io/explore-flask-zh/7-blueprints.html