RFC中文
建立一个到邮件服务器的连接(在此使用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);
和服务器会话,发送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();
注释使用中文,编译不通过。
解决:javac -help 发现 -encoding选项,故编译时加-encoding utf-8
java后的文件不能跟.class后缀
当传入发送邮箱正确的用户名和密码时,总是收到到:550 User has no permission这样的错误,
其实我们用Java发送邮件时相当于自定义客户端根据用户名和密码进行登录,然后使用SMTP服务发送邮件。但新注册的163邮件默认是不开启客户端授权验证的(对自定的邮箱大师客户端默认开启),
因此登录总是会被拒绝,验证没有权限。解决办法是进入163邮箱,进入邮箱中心——客户端授权密码,选择开启即可
设置完毕后,在代码中用使用客户端授权密码代替原始的邮箱密码,这样就可以正确的发送邮件了。
发送DATA后返回250而不是354
解决:读入服务器信息顺序不对,不知道为什么就响应不正确了,改了之后该什么时候读一行信息就读一行信息,然后就正确回应354了。
发送信息后服务器返回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)
试了一下,不加这个,直接空行就可以了。