是用C#开发邮件服务器吗?
是的,WINFORM,写个实体类,有些参数:发件人、标题、抄送人、正文、附件等等。
@有机物:
园子里的参考博文:
github上有些开源项目可以参考:
@dudu: 这个邮件系统是局域网内的,这样的话,就不需要配置POP3了,但是,SMTP怎么配置呢?
@有机物: 你不是要开发邮件服务器吗?SMTP本来就是邮件服务器的重点功能。
@dudu: 我知道SMTP是很重要的,但是,我现在所处的网段不能访问外网,所有的用户都在一个局域网内,都不能访问外网,你上面的示例都是配置外网的POP3和SMTP,如果是局域网内就不能使用了。我现在就想知道,如果是做成局域网内使用的邮件系统,该从哪里入手,思路应该是怎么样的呢?
@dudu: 我这个时候,只需要写一个客户端,用于发送和接收。
@有机物: 那一行代码不需要写,在局域网内用搭建一个邮件服务器(推荐软件MailEnable免费版),然后用邮件客户端发送/接收就可以了,MailEnable还自带Web邮箱界面,用户通过浏览器就可以发送/接收。
当然,你想自己写邮件客户端也没问题。
@dudu: 是这样的,我写的这个客户端或者说是类是需要用到项目中的,自己写就没有思路了,你还能帮忙指点指点?
@有机物: 可能参考一下前面两篇园子里的博文
@dudu: 看过了,demo也下下来看过了,不过,和我想要的效果还是不一样,如果那台电脑不能访问外网,那么他的程序就不能正常的收发邮件了。我现在所要做的就是,只能在局域网内使用,根本就不能访问外网,SMTP该怎么设置。
@dudu: 我把代码和一些配置发给你看看。
创建一个winform程序,添加配置文件:app.config,其中,配置文件代码为:
<configuration>
<system.net>
<mailSettings>
<smtp><network host="localhost" port="25" defaultCredentials="true" username="123" password="123456"></smtp>
</mailSettings>
</system.net>
</configuration>
创建一个实体类,里面有一些属性。在SYSTEM.NET.MAIL下,使用SMTPCLIENT发送邮件。
在IIS配置工具中(注:win7系统),找到SMTP电子邮件,打开功能,续重【将电子邮件传送至SMTP服务器】,并选择使用localhost,端口默认为25,身份验证设置选用:指定凭证,并创建账号和密码分别为:123,123456【对应APP.CONFIG中的USERNAME和PASSWORD】,保存设置,开始调试。
调用send方法时,就会出现:由于目标计算机积极拒绝,无法连接:127.0.0.1:25.错误代码:10061
@有机物: 在Windows防火墙中允许25端口的访问
@dudu: 我在防火墙中,设定了该程序允许访问所有端口,现在报错为:操作已过时。
@有机物: 建议检查一下SMTP服务是否已启动
@dudu: 已经启动,如果没有启动的话,就报上面的错误:由于目标计算机积极拒绝,无法连接:127.0.0.1:25.错误代码:10061。启动之后,就报:操作已过时。我怀疑,这个地方的所谓操作过时,是不是存在着先联网发送之类的再做其他的操作,这个地方不好测试,也没有关键性的提示。
1.socket编程,数据的交互通过自定义的数据格式
2.web service/WCF - 因为是局域网的,所以这个比较推荐
主要是那个发送邮件的方法,不知道该怎么写,我会考虑用web service,能不能给个例子。或者具体一点的思路,现在连一点思路都没有。以前写的都是好玩,没有太大的用途。
@有机物: 局域网?那你总得有邮件服务器吧,只要是标准的邮件服务器,无论局域网还是广域网,都是需要配置pop3和smtp的。或者你自己写一个邮件服务器也不太难,因为并不需要与其它邮箱通讯,相关协议也不需要遵守。 自已定义服务端和客户端,就是一个socket编程和数据存取的问题了,有什么难的呀?
@沧海一杰: 邮件服务器就是系统自带的SMTP,我需要做客户端进行邮件的收发就行了,问题是,局域网内SMTP该怎么设置。
@有机物: 如果考虑用webservice,那么要要明白WS跟SMTP其实是两个不同的东西,例如WS方法,可以这样做:
1.定义一个邮件内容类
[DataContract] public class EmailContent{ [DataMember] //发送者 public string From { get; set; } [DataMember] //接收者 public string To { get; set; } [DataMember] //抄送 public List<string> CC { get; set; } [DataMember] //发送日期 public DateTime SendDatetime { get; set; } [DataMember] //附件 public List<AttachObject> Attachs { get; set; } [DataMember] //邮件状态 public EMailState State{get;set;} } //邮件状态:读取,未读取,删除(用于发送者请求删除自己发送的邮件,仅仅在接收者未读取的情况下) public enum EMailState{ [EnumMember(Value="已读取")] STATE_READ, [EnumMember(Value="未读取")] STATE_NO_READ, [EnumMember(Value="标记删除")] STATE_FLAG_DELETE }
2。定义一个服务契约
[ServiceContract] public interface IEmail { [OperationContract] public int SendEmail(EmailContent email); [OperationContract] public EmailContent ReceiveEmail(string userEmailAddress); }
这个服务只是简单的收和发,而且邮件同步时需要手动完成的,基于basicHttp协议,如果希望能实现用户登录后有未读取邮件自动推动可以添加服务回调,采用双工协议,其中的逻辑自己可以参考服务编程相关书籍
这里只是提供以下WS实现的思路
@andy1987: 我把代码和一些配置发给你看看。
创建一个winform程序,添加配置文件:app.config,其中,配置文件代码为:
<configuration>
<system.net>
<mailSettings>
<smtp><network host="localhost" port="25" defaultCredentials="true" username="123" password="123456"></smtp>
</mailSettings>
</system.net>
</configuration>
创建一个实体类,里面有一些属性。在SYSTEM.NET.MAIL下,使用SMTPCLIENT发送邮件。
在IIS配置工具中(注:win7系统),找到SMTP电子邮件,打开功能,续重【将电子邮件传送至SMTP服务器】,并选择使用 localhost,端口默认为25,身份验证设置选用:指定凭证,并创建账号和密码分别为:123,123456【对应APP.CONFIG中的 USERNAME和PASSWORD】,保存设置,开始调试。
调用send方法时,就会出现:由于目标计算机积极拒绝,无法连接:127.0.0.1:25.错误代码:10061
@有机物: 看你的描述的错误,应该是邮件服务器没有启动的,所以导致出现目标计算机积极拒绝
局域网搞这么麻烦干嘛,直接数据库表存储邮件字段不就可以实现需求了。
这是需求啊,呵呵,我也想这样做啊!
@有机物: 哦,那去oschina找个邮件服务器,配置好,然后用System.Net.Mail发邮件吧。
@幻天芒: 系统不是自带的就可以搭建SMTP服务器了吗?WIN7系统下,不知道怎么搭建完了,发送邮件的时候,提示:操作已过时。
@有机物: 这个还真没搭建过。检查服务什么吧。