自己动手写邮件客户端(1)

自己动手写邮件客户端(1)
    ——命令行测试发邮件

参考

RFC中文

环境

  • 系统: win10
  • 语言: java

简要流程

  • 建立一个到邮件服务器的连接(在此使用smtp.163.com:25)

    Socket s = new Socket(mailServer,25); 
    
  • 将SOCKET输入流连接到带缓冲功能的输入流BufferedReader,以便一次读一行来自服务器的应答报文

    BufferedReader inFromServer = new BufferedReader(new InputStreamReader(s.getInputStream()));
    
  • 将SOCKET输出流连接到带缓冲功能的输出流PrintWriter,以便一次输出一行报文到服务器

    PrintWriter outToServer = new PrintWriter(s.getOutputStream() ,true);
    
  • 读取来自服务器的第一行应答,并显示在屏幕上

    response = inFromServer.readLine();
    System.out.print("MailServer:" + response + "\n");
    
  • 将用户的帐号和密码以BASE64格式进行编码以便进行服务器身份验证

    BASE64Encoder encoder = new  BASE64Encoder();
    String encodedUser = encoder.encode(from.getBytes());
    String encodedPwd = encoder.encode(pw.getBytes());
    
  • 和服务器会话,发送EHLO hostname命令

    outToServer.println("EHLO " + hostName);
    
  • 读入来自服务器的5行应答
  • 和服务器会话,发送AUTH LOGIN命令,请求身份验证

    outToServer.println("AUTH LOGIN ");
    
  • 读入来自服务器的应答,并显示在屏幕上

  • 向服务器发送自己的帐号
    outToServer.println(encodedUser);

  • 读入来自服务器的应答,并显示在屏幕上

  • 向服务器发送自己的密码
  • 读入来自服务器的应答,并显示在屏幕上
  • 向服务器发送MAIL FROM: 发件人地址

    outToServer.println("MAIL FROM: <" + from + ">");
    
  • 读入来自服务器的应答,并显示在屏幕上

  • 向服务器发送RCPT TO: 收件人地址

    outToServer.println("RCPT TO: <" + to + ">");
    
  • 读入来自服务器的应答,并显示在屏幕上
  • 请求发送邮件正文

    outToServer.println("DATA");
    
  • 读入来自服务器的应答,并显示在屏幕上
  • 开始发送邮件正文
  • 发送邮件结束标志

    outToServer.println(".");
    
    • 读入来自服务器的应答,并显示在屏幕上
  • 关闭SOCKET

    s.close();
    

遇到的问题及解决方案

1

注释使用中文,编译不通过。
解决:javac -help 发现 -encoding选项,故编译时加-encoding utf-8

2

java后的文件不能跟.class后缀

3

当传入发送邮箱正确的用户名和密码时,总是收到到:550 User has no permission这样的错误,

其实我们用Java发送邮件时相当于自定义客户端根据用户名和密码进行登录,然后使用SMTP服务发送邮件。但新注册的163邮件默认是不开启客户端授权验证的(对自定的邮箱大师客户端默认开启),

因此登录总是会被拒绝,验证没有权限。解决办法是进入163邮箱,进入邮箱中心——客户端授权密码,选择开启即可

设置完毕后,在代码中用使用客户端授权密码代替原始的邮箱密码,这样就可以正确的发送邮件了。

4

发送DATA后返回250而不是354
解决:读入服务器信息顺序不对,不知道为什么就响应不正确了,改了之后该什么时候读一行信息就读一行信息,然后就正确回应354了。

5

发送信息后服务器返回554 DT:SPM
这是因为邮件主题(subject)设置成了test,被网易当成垃圾邮件,没有发出去。。。。。。。。。参见

自己给自己(163)发不会出现这种问题,但是邮件没有内容
解决:正文与头(subject、from、to等信息空一行),网上有人说要

writter.println("Content-Type: text/plain;charset=\"gb2312\"");//如果发送正文必须加这个,而且下面要有一个空行   
05.writter.println();  

[其博文链接](http://blog.csdn.net/icodeyou/article/details/40324451
试了一下,不加这个,直接空行就可以了。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值