前言:
在看java socket的时候,其中“使用socket发送邮件”发现很晦涩,网上发现了很多优秀的文章介绍这部分,发现自己是卡在了Telnet这一块,知道了Telnet发送邮件的过程,再来看socket发送邮件就简单多了。
TELNET概念:
Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式。功能就是实现远程控制服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。(摘自百度百科)
Telnet发送邮件过程:
- 在CMD命令行键入 Telnet smtp.163.com 25 (使用的邮箱服务器+邮件服务器的默认端口25);
- 与服务器打招呼建立会话,键入命令 helo xxx (xxx表示任意字符);
- 发送邮件之前,肯定需要先登录,所以得有账号密码:
- 因为使用的是163服务器,所以账号需要时xxxxx@163.com,密码与之对应;
- Telnet命令行的账号密码是非明文的,所以将准备好的账号、密码编码成64位格式,编码工具可百度;
- 确定你的邮箱账号已经授权成功,如果有授权码,那么密码需要替换成授权码再编码加密;
- 准备工作完成,键入auth login(Telnet可能会失去对服务器的连接,重复上述步骤重连即可);
- 命令行显示334 dXNlcm5hbWU6后,粘贴你的加密后的账号(dXNlcm5hbWU6 是加密后的Username);
- 命令行显示334 UGFzc3dvcmQ6后,粘贴你的加密后的密码(UGFzc3dvcmQ6是加密后的Password);
- 窗口显示235 Authentication successful,则登录成功。
- 键入命令: mail from:xxxxx@163.com (邮件来自于谁?)
- 键入命令: rcpt to:xxxxx@xx.xx (邮件发给谁?)
- 键入命令: data (邮件内容是啥?)(End data with .:以回车 . 回车结束data),键入你要发送的邮件内容,格式如下:
- Subject:xxxxx (邮件的主题是啥?)
- From:xxxxx@163.com (邮件来自于谁? 此处要与步骤h保持一致)
- ===邮件内容部分===
- 回车 . 回车 :表示提交邮件内容
- 注:subject和from是为了避免服务器把你的邮件当成垃圾邮件过滤
- 窗口显示250 mail OK 表示邮件发送成功。可以继续发送,或键入quit退出。
注意事项:整个Telnet过程中的每一步都可能会被提示有错误,主要是命令格式和语法,如空格,是否有冒号等,也可能是误报,多试几次即可。
使用java socket发送邮件:
即使用socket套接字打开指定邮件服务器的连接,通过IO流模拟Telnet命令来发送邮件的过程,代码如下:
/**
* Created by wangyuanye on 2017/4/10.
*/
public class sendEmail {
//邮箱服务器地址
private String mailServer="smtp.163.com";
//要发送的邮箱地址
private String recipient="1234566@qq.com";
public static void main(String[] arges) {
sendEmail t = new sendEmail();
t.sendMail();
}
public void sendMail() {
String name="xxxxxx@163.com";
String pass="xxxx";
try {
Socket s = new Socket(mailServer, 25);
//IO流
BufferedReader in = new BufferedReader
(new InputStreamReader(s.getInputStream(),"UTF-8"));
PrintWriter out = new PrintWriter
(new OutputStreamWriter(s.getOutputStream(),"gbk"),true);
//connected mailServer or not
read(in);
//success or not
send(in, out, "HELO theWorld");
//validation
send(in,out,"auth login");
//handle data
send(in,out,new BASE64Encoder().encode(name.getBytes()));
send(in,out,new BASE64Encoder().encode(pass.getBytes()));
//where from
send(in, out, "MAIL FROM: <xxxxxx@163.com>");
//send to
send(in, out, "RCPT TO: <" + recipient+">");
//mail content
send(in, out, "DATA");
send(out, "Subject: test !");
send(out, "From:<15821145937@163.com>");
send (out, "\n");
send(out, "this is a program for sending e-mail,coding with java socket!");
send(out, "\n.\n");
//exit
send(in, out, "QUIT");
s.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
//read info
public void read(BufferedReader in){
try {
String msg=in.readLine();
System.out.println(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
//read info and input order
public void send(BufferedReader in, PrintWriter out, String s) {
try {
out.write(s + "\n");
out.flush();
System.out.println("read : "+s);
s = in.readLine();
System.out.println("write : "+s);
}catch (Exception e) {
e.printStackTrace();
}
}
//input order
public void send(PrintWriter out, String s) {
try {
out.write(s + "\n");
out.flush();
System.out.println("write: "+s);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
问题:
1.关于邮件内容的中文乱码问题;
描述:网上搜了相关的资料,大致是说在接收包的时候未能完整接收包数据,这个没太明白;
也有说是编码格式的问题,但试了几种编码(utf-8,8859_1,gbk,gb18030)
都没反应,希望知道问题所在的网友留言相告,先行谢过。