pic
一、合租国外主机现状 众所周知,国外主机空间一般都很大,流量等限制少,域名绑定不限,故很多人想合租国外主机,或者将自己买的主机拿出去卖。 朋友合租。这类一般是几个朋友合伙买一个国外空间,每个人分一个FTP,由大家共同管理,共同约定。缺点是管理不健全,很容易对其他人网站造成影响,故只建议熟识的朋友几个人一起用,相互之间有足够的信任。 Share Hosting合租。这类是我很反对的,因为Share Hosting的CPU,内存和I/O等资源限额...
pic
刚不久发表的一篇  [揭秘美国主机代购、美国主机评测等类似网站的赚钱方式]的文章,闲逛Ubuntu中文论坛,发现Ubuntu中文论坛也搞起了美国主机代购。详情点击。 Ubuntu中文论坛也是使用burstnet的vps主机,正因为这样,它才有说服力,用户完全可以通过ubuntu论坛得知此vps的性能。但Hector感觉此vps的速度不咋地。。而ubuntu的名气也足以使大家相信此vps不是骗人的。而且此vps相当便宜,最常用的一个vps信息如下: VPS #1 (Virtual Private Server) - vePortal - CPU: 1GH...
pic
一、写在前面 现在网上有大量的美国主机导购网站,美国主机评测网站,上面有各个美国主机提供商的中文翻译信息,选购指南,优惠码信息,各种使用技巧等等。他们确实让广大想到国外买主机的用户得到了大量的信息,甚至还愿意帮用户买相应的美国主机。其目的何在?其利润何在?今天Hector就来分析分析他们的盈利方式。 二、美国主机的Resellers Plan(经销商计划) 计划每个美国主机网站都有自己的一套经销商计划,其方式可能不同,都是...
pic
首先申明,此文章没有任何价值,就是想看看我能不能制造一个网络流行语啥的(当然现在在百度,google上搜不到类似的信息下面有图为证)。这句话可以组成很多经典的句子,我先来两个,如果你有兴趣的可以在下面跟几条经典的。1、在这天朝的年代,竟有google这个二愣子的存在。2、在这如此文明的年代,竟有叫兽如此猥琐的存在。3、在这如此纯洁的年代,竟有XX门和XX门的存在。4、在这如此低调的年代,竟有凤姐的存在。5、在这乙肝遭歧视的年...
pic
一、GFW的名称 GFW 并非官方的正式名称 墙 防火长城 长城防火墙 中国国家防火墙 国家公共网络监控系统 功夫网(Gong Fu Wang) 二、GFW简介 GFW是架设在中国主干级网路路由器上的一套高级资讯过滤系统,主要用途是对境内外网路的访问分析和过滤,阻止用户浏览政府不希望用户看到的网页内容、电邮等资讯。据一项哈佛大学的一项研究,有超过18000个网站在中国境内被 GFW 屏蔽。 GFW的全写为「Great FireWall」,得名于Charles R. Smith所写的一篇...

26

带用户验证的SMTP邮件客户端java实现
Posted on : 26-01-2010 | By : Hector | In : 编程杂谈
3

  一、程序的实现

SMTP (Simple Mail Transfer Protocol) : 电子邮件从客户机传输到服务器或从某一个服务器传输到另一个服务器使用的传输协议。 SMTP 是请求/响应协议,命令和响应都是基于 ASCII 文本,并以 CR LF 符结束。响应包括一个表示返回状态的三位数字代码。SMTP TCP 协议 25 端口监听连接请求。首先,我们创建套接字,然后创建基于套接字输入输出流的过滤器流。可以方便的向服务器整行读取写入数据。相关代码如下:

              java.net.Socket s=new java.net.Socket(_smtp.getText(),25);  //创建套接字,SMTP默认25端口

              _out=new PrintWriter(s.getOutputStream());                 //实例化输入输出流

         _in=new BufferedReader(new InputStreamReader(s.getInputStream()));

Send()函数用来发送数据后读取服务器的响应。其异常抛出由调用者处理,send函数将发送的信息写入到服务器,同时在状态栏输出,整行读取数据后将响应状态也在侧边栏输出。

主要发送命令如下:

        send(null);

            send("HELO " + java.net.InetAddress.getLocalHost().getHostName()+"\r\n");//noly

            /*用户验证,发送base64加密的用户名密码*/

            send("AUTH LOGIN"+ ="EN-US" style="mso-bidi-font-size:10.5pt;font-family:宋体;mso-ascii-theme-font:minor-fareast;mso-fareast-theme-font:minor-fareast;mso-hansi-theme-font:minor-fareast;mso-bidi-font-family:"Courier New";color:#2A00FF;mso-font-kerning:0pt">"\r\n");//only

            send((new   sun.misc.BASE64Encoder()).encode(_from.getText().getBytes())+"\r\n");//only

            send((new   sun.misc.BASE64Encoder()).encode( _pwd.getText().getBytes())+"\r\n");//only

            send("MAIL FROM: " + _from.getText()+"\r\n");//only

            send("RCPT TO: " + _to.getText()+"\r\n");

        send("DATA"+"\r\n");

其中用户验证采用普遍的Base64加密后的用户名,密码。

接着我们发送邮件正文。最先发送的是邮件的相关信息,注意相关信息一般可以造假,除非服务器进行检测。内容如下:

_out.print("cc:" + "这里是抄送内容"+"\r\n");

              _out.print("From:" + "来自邮箱"+"\r\n");

            _out.print("to:" + "发送的邮件地"+"\r\n");

            _out.print("date:" + "时间"+"\r\n");

            _out.print("Subject:" + _subject.getText()+"\r\n");

正文采用MIME(Multipurpose Internet Mail Extensions,多功能Internet 邮件扩充服务)来实现发送功能各异的文本。MIME信息由正常的Internet文本邮件组成,文本邮件拥有一些特别的符合RFC 822的信息头和格式化过的信息体(用ASCII 的子集来表示的附件)。这些MIME头给出了一种在邮件中表示附件的特别的方法。我们首先发送正文的相关信息头,然后通过不同的MIME段(每段前也缀以一个特别的头)来发送html、纯文本、加密的附件等。主要代码如下:

                _out.print("X-Mailer:Hector’s mail\r\n"      //先发送信息头   

                 +"MIMI-Version:1.0\r\n"+"Content-Type:multipart/mixed;boundary=\"#BOUNDARY#\"\r\n\r\n"

                +"Content-Transfer-Encoding:7bit\r\n\r\n"

                +"This is a multi-part message in MIME format\r\n\r\n"

                +"–#BOUNDARY#\r\n"   //一个分段标志而已,便于分段发送各种数据

                +&q
uot;Content-Type: text/html;charset=gb2312\r\n"

                +"Content-Transfer-Encoding:printable\r\n\r\n"

                +_body.getText()+"\r\n"     //html正文 

                );

正文发送完之后,我们以send("\r\n"+"."+"\r\n")作为结束,接着我们退出与服务器的链接send("quit"+"\r\n"),最后关闭套接字s.close()

其中的异常捕获后输出到状态栏。

 

二、结果分析

下图是运行后的界面和发送的内容,状态栏显示邮件正在发送列队中。

SMTPA发邮件,客户端

在邮箱中检测到了带HTML的邮件,其中的加粗,换行,斜体html标签都成功实现。

 SMTP带用户名验证

三、程序需要改进的地方

 测试在linux下发送失败,原因是Doswindows采用回车+换行CR/LF表示下一行, (具体参考[关于linux和windows的CR, LF, CR/LF 回车 换行问题])

UNIX/Linux采用换行符LF表示下一行。经过不断替换换行符,在linux发送成功,需要改换行符的地方:

            send("HELO " + java.net.InetAddress.getLocalHost().getHostName()+"\n");

            send("AUTH LOGIN"+"\n");

            send((new   sun.misc.BASE64Encoder()).encode(_from.getText().getBytes())+"\n");

            send((new   sun.misc.BASE64Encoder()).encode( _pwd.getText().getBytes())+"\n");

考虑我们可以通过System.getProperty("os.name")函数获取操作系统中的关键字如(windows)来自动选择换行符,实现多操作系统的兼容。

为了方便的编辑html文件,可以键入一个html编辑器,另外实现多收件人,以及多附件的发送。

此小程序只是为学习SMTP协议,精力有限,想丰富此程序的功能,请自行调试代码。

 

代码下载:201001261229413388.txt

 程序简陋,仅供学习之用,有问题请到http://www.ourys.com/post/SMTP-JAVA-AUTH_LOGIN.html这里讨论。

 

Tags:
这篇日志发表于10年01月26日。 你可以订阅该日志的所有评论通过 RSS 2.0。 你可以发表评论,或者引用通告
3 Responses
  1. 2010年01月26日 11:29 下午 17gogo

    深奥,不懂?纯纯的来看看,支持了

    [回复]

    #1
  2. 2010年01月28日 9:42 上午 午夜兰花手札

    发送附件的功能我还是不太明白。

    Hector 于 2010-1-28 10:14:47 回复

    附件是根据MIME服务的原理构成的,MIME把各种数据分段,每段定义相应的格式,附件应该是要读取数据流并用BASE64加密吧,具体的参考一下MIME,我也只是简单测试了一下,随意发了几个数据可以当附件发送出去,读取数据流加密等没有时间做~

    [回复]

    #2
  3. 2010年01月31日 9:20 下午 天缘

    之前用C写过这东西,JAVA倒没试过,现在越来越不喜欢编程了,还是硬件好玩点。

    [回复]

    #3

Leave a Reply

最新评论

标签云

© 2010 - IT元素 | Theme AppChain | | designer handbags| Christian louboutin| wedding dress| links of london| Abercrombie and Fitch| トリーバーチ | cda to mp3 converter|