一、程序的实现

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

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

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

_in=newBufferedReader(newInputStreamReader(s.getInputStream()));

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

主要发送命令如下:

send(null);

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

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

send("AUTH LOGIN"+"\r\n");//only

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

send((newsun.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");

其中用户验证采用普遍的

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

_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()。

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

二、结果分析

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

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

三、程序需要改进的地方

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

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

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

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

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

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

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

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

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

java 邮件客户端 smtp_带用户验证的SMTP邮件客户端java实现相关推荐

  1. java webservice用户验证_java webservice 用户验证 (服务端 + 客户端)

    说明:在网上找了一堆 handler验证的东东,试验了一下,没成功. 现在换了一种方式:在 tomcat的配置文件中添加用户角色和用户信息 然后在 webservice的项目配置文件中增加对应的角色. ...

  2. vb发送邮箱连接服务器失败,VB:如何用需要身份验证的SMTP邮件服务器发信

    Option Explicit '需要引用  Microsoft CDO for Windows 2000 Library和 Microsoft ActiveX Data Objects 2.5 Li ...

  3. java启动密码,java - 用户验证密码后如何启动java applet程序? - SO中文参考 - www.soinside.com...

    我正在尝试连接两个简单的java程序,一个密码登录程序,然后打开第二个程序(一个非常简单的PrintWriter程序). 我是一个大型菜鸟,所以尝试将二级程序添加到密码程序中.显然这没用.我看到很多关 ...

  4. django 的用户验证及登录状态保持

    一.用户验证功能 Django自带用户验证及登录功能,引入模块为: from django.contrib.auth import authenticate 其中方法authenticate()的接收 ...

  5. 登录显示服务器端校验不通过,SMTP服务器需要安全连接或客户端未通过身份验证。服务器响应是:5.7.57 SMTP;...

    当我试图通过我的C#代码发送邮件上面的错误显示.我已经搜索可能的所有解决方案,但我没有得到解决方案.我使用下面的代码:SMTP服务器需要安全连接或客户端未通过身份验证.服务器响应是:5.7.57 SM ...

  6. Java 基于mail.jar 和 activation.jar 封装的邮件发送工具类

    准备工作 发送邮件需要获得协议和支持! 开启服务 POP3/SMTP 服务 如何开启 POP3/SMTP 服务:https://blog.csdn.net/weixin_44953227/articl ...

  7. Lotus Domino单用户多账号多邮件地址配置

    场景说明 集团公司的邮箱地址和下属子公司的邮件地址不一致,可能会出现一个用户有多个邮箱地址,确保没个邮箱在Domino的邮件系统都能正常收发邮件. 如:用户user集团的邮件地址user@acme.c ...

  8. java连接qq邮箱_Java使用qq邮箱发邮件实现

    public class MailDemo1 { public static void main(String[] args) throws Exception{ Properties prop = ...

  9. 用Mailgun方式在Drone pipeline中集成SMTP邮件通知

    文章目录 用Mailgun方式在Drone pipeline中集成SMTP邮件通知 前言 在Mailgun中开启SMTP服务 在Drone pipeline中集成邮件通知 小结 用Mailgun方式在 ...

最新文章

  1. Openfiler 2.3配置及Win2k8 iSCSI应用系列之二
  2. SAP RETAIL WB02 为门店激活物料分类账报错 - ML currencies are not integrated in FI for valuation area m123 NMI1 –
  3. 微信公众平台开发(102) 模板消息
  4. 每天一个设计模式,工厂方法模式(Factory Method)
  5. java中flush 函数,Java DataOutputStream.flush()类型
  6. Advanced C++ --- const function
  7. [原创]mybatis中整合ehcache缓存框架的使用
  8. php怎么字符串转为整数,在PHP中将字符串转换为整数的最快方法
  9. MSSQL sum()计算expression转化为数据类型int时发生算术溢出错误解决
  10. Java中try与catch的使用
  11. 区块链测试 以太坊 truffle是什么 怎么用
  12. 小米android tv,小米TV应用商店 第三方应用交互建议
  13. 基于Python的网络爬虫爬取天气数据可视化分析
  14. python爬取pexels网站图片
  15. Mobile(3)-攻防世界-APK逆向
  16. puzzle(0711)《机关排布》接水管、搭桥
  17. 赛事启动 |香港科大-杰瑞集团 2022【人工智能】百万奖金国际创业大赛
  18. qt客户端显示服务器发送的图片,qt客户端显示服务器发送的图片
  19. 当下计算机的应用有哪些领域,计算机有哪些专业课程 计算机专业就业前景怎么样...
  20. 使用uni-app实现数字华容道小游戏

热门文章

  1. 快来让你的网页色彩绚丽--linear-gradient与radial-gradient
  2. linux c++ 获取当前时间毫秒_Linux 切换工作目录
  3. VSTO中Word的查找方式
  4. Guava-Utilites学习测试类
  5. 蚪侠模板站群-V25版[泛域名+泛目录+泛内页]-[代码+汉字]干扰-字体繁简切换-蜘蛛欺骗-主动推送-全局锚文本锁定-自动新闻采集-自动模板采集
  6. 如何把多个js函数绑定到事件上面
  7. PHP 阿里云OpenAPI签名[RPC 调用机制]·一键登录取号[云通信号码认证服务]
  8. java 后台判断浏览器类型,IE11下载乱码解决方案
  9. Illegal key size or default parameters
  10. 全面的软件测试( 转)