NET中发送电子邮件的实例教程,有关站内信的数据库设计

站内信:网址运行人士能够向单个(单发卡塔 尔(英语:State of Qatar)或七个(群发卡塔尔国客商推送音讯,站内信其实正是向数据库中插入一条条笔录。

  今天,发布了博客“群发“站内信”的实现”,获得广大网民呼应,在那表示多谢。

  在无数网址种类(如CMS系统,SNS系统等卡塔 尔(阿拉伯语:قطر‎,都有“站内信”的职能。

第风流洒脱、导入命名空间:

数据库设计:

message【站内信发件箱表】{每回运转职员发送一条站内信(无论是单发或是群发卡塔 尔(阿拉伯语:قطر‎就能够在发件箱表中增添一条记下}

 997755.com澳门葡京 1

 表字段:ID、SendID、RecID、MessageID、Statue、DateTime

messagetext【站内信发件内容表】{每趟启动人士发送站内信的剧情就能够保留到站内信发件内容表中}

997755.com澳门葡京 2

表字段:ID、Title、Message、PData

messageuserinfo【站内信选用箱表】{顾客站内信收件箱}

997755.com澳门葡京 3

表字段:ID、SendID、RecID、MessageID、Statue、DateTime

 

  看了网络老铁的留言。开采我们对文中的前三种状态并没有啥样争论,对第三种方案争论颇多。笔者在这里再把自身的第三种状态详细的解说一下,和大家调换。其余,本文的中央首要位于“群发”(也等于点到面卡塔 尔(英语:State of Qatar),至于“单发”(点到点卡塔 尔(英语:State of Qatar),不在本文的研讨之列。

  “站内信”不相同于电子邮件,电子邮件通过专门的邮件服务器发送、保存。而“站内信”是系统内的消息,说白了,“站内信”的落实,便是经过数据库插入记录来得以实现的。

 代码如下 复制代码
using System.Net.Mail;
 

事情逻辑:在启使人陶醉士发送了一条站内信后,当客户再度登入时就能刷新历史站内信,而这几个不活跃的客商就不会更新站内信。

此情此景:运转职员向某些(单发卡塔 尔(阿拉伯语:قطر‎或多少个(群发卡塔 尔(阿拉伯语:قطر‎顾客发送站内信

增添发件内容:向messagetext站内信发件内容表中加多一条内容记录
{这里先增多messagetext站内信发件内容表发生一条记下,后边message站内信发件箱表中才有MessageID能够提到}

增添发件人发件记录:向message站内信发件箱表中增多一条发送记录
{备注:假若是单发997755.com澳门葡京,RecID则是点名客户的UserID,如果是群发RecID则是0。(0象征具有顾客卡塔 尔(英语:State of Qatar)}

客商登入时刷新与温馨有关的站内信,并将数据拉长到messageuserinfo站内信接纳箱表

  1. 询问条件:【发件人不是和谐】並且【收件人是协和依旧收件人是全部人】况且【本身收件表中海市蜃楼的记录】

    select m.id from Message as m where (m.recid='所有人' or m.recid='自己的ID') and m.sendid!='自己的ID' and m.MessageID not in (select u.messageid from MessageUserInfo as u  where u.recid='自己的ID')
    

      

  2. 将相关的站内信音信增多到本人的收件表中,并标识未读。

    1.   将下面【查询条件】中查询出来的id音信用做查询message站内信发件箱表的条件

      select * from message  where id=上面的m.id
      

        

    2. 将获得到message站内信发件箱表数码增加到NET中发送电子邮件的实例教程,有关站内信的数据库设计。messageuserinfo站内信接受箱表

  3. 询问出团结的站内信记录

    select u.ID,u.RecID,m.Title,m.Message,u.Statue,m.PDate from messageuserinfo as u join messagetext as m on u.MessageID = m.ID where u.RecID='自己的ID'
    

      

     

  先看看,第两种处境。站内的客户是大批量级的(上百万卡塔 尔(阿拉伯语:قطر‎。

  “站内信”有八个根基能。意气风发:点到点的音讯传送。客户给顾客发送站内信;助理馆员给顾客发送站内信。二:点到面包车型客车音信传送。管理员给客户(钦定知足某一口径的顾客群卡塔 尔(阿拉伯语:قطر‎群发消息。点到点的信息传送比较轻松达成,本文不再详述。上面将基于不相同的情状,来说说“站内信”的群发是哪些达成的。

概念发送电子邮件的艺术[互连网海人民广播广播台大例外的,能够比较着看一下,WinForm的也适用]:

  经过思索,表设计改善如下

  第风流洒脱种意况,站内的顾客是微量级其他。(几十到相当多卡塔尔

 代码如下 复制代码
/// <summary>
/// 发送电子邮件
/// </summary>
/// <param name=”MessageFrom”>发件人邮箱地址</param>
/// <param name=”MessageTo”>收件人邮箱地址</param>
/// <param name=”MessageSubject”>邮件核心</param>
/// <param name=”MessageBody”>邮件内容</param>
/// <returns></returns>
public bool Send(MailAddress MessageFrom, string MessageTo, string
MessageSubject, string MessageBody)
{
 MailMessage message = new MailMessage();
 message.From = MessageFrom;
 message.To.Add(MessageTo); //收件人邮箱地址能够是八个以落实群发
 message.Subject = MessageSubject;
 message.Body = MessageBody;
 message.IsBodyHtml = true; //是否为html格式
 message.Priority = MailPriority.Normal; //发送邮件的预先级别
 SmtpClient sc = new SmtpClient();
 sc.Host = “smtp.qq.com”; //内定发送邮件的服务器地址或IP
 sc.Port = 25; //钦点发送邮件端口
 //钦点登陆服务器的客户名和密码(发件人的邮箱登录密码)
 sc.Credentials = new System.Net.NetworkCredential(“【发件箱地址】”,
“【www.111cn.net发件箱密码】”);
 try
 {
  sc.Send(message); //发送邮件
 }
 catch
 {
  return false;
 }
 return true;
}
 

 

  这种状态,由于顾客的数量超级少,因而,未有要求过多的伪造数据库的优化,选拔简便易行的报表,对系统的兼顾也来的从简,前期也正如轻巧有限支撑,是金榜题名的用空间换时间的做法。

义发送电子邮件的点子

  表名:Message

  数据库的统筹如下:表名:Message

调用定义的不二等秘书诀,完成出殡和下葬邮件:

  ID:编号;RecID:选择者编号;MessageID:站内信编号;Statue:站内信的查看景况;

  ID:编号;SendID:发送者编号;RecID:选用者编号(如为0,则接纳者为全体人卡塔 尔(英语:State of Qatar);Message:站内信内容;Statue:站内信的查看情状;PDate:站内信发送时间;

 代码如下 复制代码
/// <summary>
/// 发送邮件
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
protected void ForMail(string name, string mail)
{
 try
 {
  //string email = txtemail.Text.Trim();
  MailAddress MessageFrom = new MailAddress(“【发件箱地址】”);
//发件人邮箱地址
                  string MessageTo = mail; //收件人邮箱地址
  string MessageSubject = bs.HtmlEncode(邮件大旨);
  //邮件内容
(通常是一个网站链接,生成随机数加验证id参数,点击去网站求证。卡塔尔国”;
  string MessageBody = “” + content1.Value.Trim() + “”;
  if (Send(MessageFrom, MessageTo, MessageSubject, MessageBody))
  {
   //Response.Write(“发送邮件成功”);
  }
  else
  {
   //Response.Write(“发送邮件战败”);
  }
 }
 catch
             {
  //ClientScript.RegisterStartupScript(ClientScript.GetType(),
“myscript”, “<script>alert(‘客商音信删除战败’)</script>”);
 }
}
 

  表名:MessageText 

  假若,某一个总指挥要给具备人发站内信,则先遍历客商表,再根据顾客表中的具备顾客依次将站内信插入到Message表中。那样,倘使有伍拾几个客商,则群发一条站内信要实行57个插入操作。那一个驾驭上比较简单,相比较亏本空间。

调用方法发送邮件
 

  ID:编号;SendID:发送者编号;Message:站内信的内容;PDate:站内信发送时间;

  某多少个客商登录后,查看站内信的言语则为:

现在和过去十分不相仿邮箱的smtp地址都不相像、需求比方QQ的是smtp.qq.com、163的是smtp.163.com

 

  Select * FROM Message Where RecID=‘ID’ OR RecID=0

更加的多详细内容请查看:

  那样,管理员(倘使ID=1卡塔尔国给全体的顾客发风姿罗曼蒂克封站内信。就在MessageText表中插入一条记下。举例:

  第两种情景,站内的顾客中量级其余(上千到上万卡塔 尔(阿拉伯语:قطر‎。

  ID:4;SendID=1;Message=Good;PDate:2010-4-9

  倘诺依旧依照第大器晚成种景况的笔触。那发一条站内信的后果基本上正是后台崩溃了。因为,发一条站内信,得重复上千个插入记录,这还不是最重大的,关键是上千以致上万条记下,Message字段的剧情是同生龙活虎的,而Message有恢宏的占用存款和储蓄空间。比方说,Message字段有玖拾柒个汉字,占用200个字节,那么5万条,就占领200×50000=10000000个字节=10M。轻巧的大器晚成份站内信,就占领10M,那还让不令人活了。

 

  因而,将本来的报表拆分为四个表,将Message的主体位于多少个表内,节省空间的据有

  有些顾客(假如ID=7卡塔 尔(英语:State of Qatar),登录系统后,发现在MessageText的表中,有ID=4的笔录,並且在Message中从不RecID=7且MessageID=4的记录,表达那条记下那些顾客未有读过,给个提示音信给客户,提示客户看站内信。注意,那时照例没有在Message中插入记录。风华正茂旦该用户点击查看该站内信的时候,在Message中插入一条记下,如:

  数据库的设计如下:

  ID:55;RecID=7;MessageID=4;Statue=已读

  表名:Message

  假如该客户删除那条站内信,则实乃改进上边那条记下:

  ID:编号;SendID:发送者编号;RecID:采取者编号(如为0,则选用者为全体人卡塔 尔(阿拉伯语:قطر‎;MessageID:站内信编号;Statue:站内信的查阅意况;

  ID:55;RecID=7;MessageID=4;Statue=删除

  表名:MessageText 

  那样一来,这么些顾客下一次登入的时候,由于Message表中有对应的笔录,也不会唤醒客商看站内信。

  ID:编号;Message:站内信的剧情;PDate:站内信发送时间;

 

  在总指挥发风华正茂封站内信的时候,实行两步操作。先在MessageText表中,插入站内信的内容。然后在Message表中给持有的客户插入一条记下,标记有豆蔻梢头封站内信。

  有网上好朋友思疑,为啥删除的时候,只是标识“删除”,这样,经过了相当短的时间,不是浪费大量的半空中吗?这些网上朋友说的也是有道理。可是,大家依旧要解析现实的状态。

  那样的规划,将再一次的站内信的主心骨新闻(站内信的剧情,发送时间卡塔尔放在四个表内,多量的节约存款和储蓄空间。可是,在询问的时候,要比第风流倜傥种情景来的错综相连。

  当网站的客户高达百万级的时候,此中的“活跃客商”(参看上文的牵线卡塔 尔(英语:State of Qatar)大概只占个中的一小部分。

  第三种状态,站内的顾客是多量级的(上百万卡塔尔,况且活跃的客户仅占当中的意气风发有些。

  如果,网址顾客200万,个中活跃客商40万。

  我们皆有那般的经历,某日看二个网址比较好,有时心绪澎湃,就报了名了二个顾客。过了后生可畏段时间,由于各种原因,就淡忘了挂号时的顾客名和密码,也就不再登录了。那么那个顾客就叫做不活跃的。从骨子里来看,不活跃的顾客占着极大的百分比。

  大器晚成封站内信,在MessageText中有一条记下,40万活蹦活跳客户都看了站内信(其实,那也很小或然,有广大的人是不看站内信的卡塔尔。在Message中插入了40万条记下。以后,不管是读书只怕是删除,在Message中保留了那40万条记下。

  大家以登记客商2百万,此中活跃顾客只占在那之中的一成。

 

  就到底遵照第三种的事态,发风流倜傥封“站内信”,那得推行2百万个插入操作。可是个中的有用操作唯有一成,因为别的的十分之七的客商恐怕恒久都不会再登入了。

  好,假若不接受这种形式,在群发的时候,往Message中布署200万记下,40万活跃顾客都看了信,而且都亲自去做的去除了站内信(这是相当小可能的卡塔 尔(英语:State of Qatar),Message中依然保留了160万条记下。因为,那么些不活跃的客户大概永世都不会登录了。那40万条记下(最坏的气象,因为黄金时代旦有人不看站内信,就不会生成记录卡塔 尔(英语:State of Qatar)和160万条记下(最佳的情况,因为不是各类顾客都会删除站内信。卡塔尔国比较,这一个特别节约空间啊?

  在这里种景色下,大家还得把思路换换。

 

  数据库的希图和第两种情状亦然:

  站内信的宏图,要凭仗你的受众群的具体景况而定,假设您的受众群活跃度接近百分之百,並且每人都很勤快,小编的安插性当然有标题。可事实上中那些美好状态大概是不恐怕现身的。

  表名:Message

  

  ID:编号;SendID:发送者编号;RecID:接收者编号(如为0,则采用者为全部人卡塔 尔(英语:State of Qatar);MessageID:站内信编号;Statue:站内信的查看情状;

  有网上好朋友提出,假若站内信的指标不是一切而是意气风发部分吧?抱歉,那一个也不在本文钻探之列,你能够对本身的表张开扩充,以达到你的渴求。

  表名:MessageText 

 

  ID:编号;Message:站内信的从头到尾的经过;PDate:站内信发送时间;

  感谢各位网上老铁的交换。作者在这里想说的是,大家布署一个连串,必需得结合真实情状,依照实际情形来制订,比能达到规定的标准叁个相比较可观的场景。

  管理员发站内信的时候,只在MessageText插入站内信的宗旨内容。Message里不插入记录。

  那么,客商在签于今,首先查询MessageText中的那多少个并未在Message中有记录的记录,表示是未读的站内信。在查阅站内信的剧情时,再将有关的记录插入到Message中。

  那几个措施和第三种的相比起来。假若,活跃客商是百分之百。两个作用是一模二样的。而活泼客户的比例越低,越能反映第三种的优胜来。只插入有效的记录,这个不活跃的,就不再占用空间了。

  以上,是本人对群发“站内信”的贯彻的主张。也接待各位提议本人的建议,我们相互借鉴,协同进步。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website