一、程序的实现

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"+"\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这里讨论。

 

懒得拍照,网上找了一个图片,是一模一样的,,,

活动网址是www.g.cn/dm6,上面是这样说的:

*开户即得350元免费广告费,预存3000元获得1000元以及专业广告专家服务

感觉给我用有点浪费,不知道可不可以廉价转让出去。。。

 

哎,Google Adsense的个人pin码早已经收到了,可是不知道何年才能达到100美元。。。

 

 

   MyEclipse企业级工作平台(MyEclipse Enterprise Workbench ,简称MyEclipse)是对Eclipse IDE的扩展,利用它我们可以在数据库和J2EE的开发、发布,以及应用程序服务器的整合方面极大的提高工作效率。它是功能丰富的J2EE集成开发环境,包括了完备的编码、调试、测试和发布功能,完整支持HTML, Struts, JSF, CSS, Javascript, SQL, Hibernate。

结构上,MyEclipse的特征可以被分为7类:

1. J2EE模型

2. WEB开发工具

3. EJB开发工具

4. 应用程序服务器的连接器 

5. J2EE项目部署服务 

6. 数据库服务

7. MyEclipse整合帮助

对于以上每一种功能上的类别,在Eclipse中都有相应的功能部件,并通过一系列的插件来实现它们。MyEclipse结构上的这种模块化,可以让我们在不影响其他模块的情况下,对任一模块进行单独的扩展和升级。

  简单而言,MyEclipse是Eclipse的插件,也是一款功能强大的J2EE集成开发环境,支持代码编写、配置、测试以及除错,MyEclipse6.0以前版本需先安装Eclipse。MyEclipse6.0以后版本安装时不需安装Eclipse。

 MyEclipse 8.0 M1 发布,包含:Eclipse Galileo、Struts 2 和Eclipse Profiler

下载地址:
官方下载地址:http://downloads.myeclipseide.com/downloads/products/eworkbench/galileo/myeclipse-8.0M1-win32.exe

官方网站国内无法访问,大家可以用vpn或者代理去下载,或者大家搜一下国内的资源,也有的,这里有篇关于vpn的小工具。。发现一个很好用的免费翻墙vpn代理软件

 

注册码:

Subscriber:LauCheng
Subscription Code:YLR8ZC-855550-6765665204902409

 

 

 

 

 

前段时间学习Java套接字,写一个SMTP 发邮件的客户端,无赖百般在windows下可以发送,在linux下怎么都发不出去,最后在发现windows和linux在处理换行和回车不太一样。。。。

下面是网上找的,整理了一下:

在文本处理中, CR, LF, CR/LF是不同操作系统上使用的换行符.
Dos和windows采用回车+换行CR/LF表示下一行, 
而UNIX/Linux采用换行符LF表示下一行,
苹果机(MAC OS系统)则采用回车符CR表示下一行.
CR用符号’\r’表示, 十进制ASCII代码是13, 十六进制代码为0x0D; 
LF使用’\n’符号表示, ASCII代码是10, 十六制为0x0A.
所以Windows平台上换行在文本文件中是使用 0d 0a 两个字节表示, 而UNIX和苹果平台上换行则是使用0a或0d一个字节表示.
一般操作系统上的运行库会自动决定文本文件的换行格式. 如一个程序在windows上运行就生成CR/LF换行格式的文本文件,而在Linux上运行就生成LF格式换行的文本文件.
在一个平台上使用另一种换行符的文件文件可能会带来意想不到的问题, 特别是在编辑程序代码时. 有时候代码在编辑器中显示正常, 但在编辑时却会因为换行符问题而出错.
很多文本/代码编辑器带有换行符转换功能, 使用这个功能可以将文本文件中的换行符在不同格式单互换.
在不同平台间使用FTP软件传送文件时, 在ascii文本模式传输模式下, 一些FTP客户端程序会自动对换行格式进行转换. 经过这种传输的文件字节数可能会发生变化. 如果你不想ftp修改原文件, 可以使用bin模式(二进制模式)传输文本.

表一:

标志 符号 十进制Asscii码数                    十六进制数                              
CR \r                           13   0x0D
LF \n  10 0x0A

 

 

 

 表二:

标志 Win/Dos linux,Unix等
换行 \r\n     (<CR><LF>)                 \n       (<LF>)                     

 

 

 

所以在用println函数的时候,导致的换行在不同操作系统中可能不一样,在windows下表现的是“\r\n”,使用的时候要注意,关于那个smtp发邮件的(带用户验证),稍后放出,敬请期待。