import java.io.*;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.util.*;
import javax.naming.NamingException;
import sun.misc.BASE64Encoder;
public class WorkThread extends Thread
{
String domain;
String to;
String subject;
String body;
String myEncode="gb2312";
public String hosts[]={
"google.com","sun.com","borland.com","dell.com","163.com","263.com",
"sina.com","etang.com","sohu.com" };
String from="ddd@"+getRandomDomain();
public void run(){
String mxServers[]=null;
MxFinder finder = new MxFinder(domain,"202.204.208.2");
try
{
mxServers = finder.getMxServers();
}
catch(NamingException e)
{
e.printStackTrace();
};
if(mxServers==null)
{
System.out.println("address is wrong");
}else{
try{
L1:
for(int i=0;i<mxServers.length;i++)
{
String mxServer=mxServers[i];
for(int j=0;j<3;j++)
{
Socket socket=new Socket(mxServer,25);
DataInputStream dis = new DataInputStream(socket.getInputStream());
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
String response = "";
response = readLastLine(dis);
if(!response.startsWith("220"))
{
dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null;
continue;
} else { //连接成功,开始写入HELO,标识自己身份
dos.writeBytes("HELO "+domain+"\r\n");
response = readLastLine(dis);
if(!response.startsWith("250"))
{ //无法识别此域名,可在此进行相应处理; dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null;
continue;
} else
{ //SMTP可以识别此域名;写入:MAIL FROM告诉服务器想发一封邮件;
dos.writeBytes("MAIL FROM: "+from+"\r\n");
response = readLastLine(dis);
System.out.println(response);
if(!response.startsWith("250"))
{ //SMTP服务器不打算接收邮件,可在此做相应处理;
System.out.println("failure"); dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null;
continue;
} else
{ //SMTP服务器准备接收邮件,写入RCPT TO告诉服务器收件人地址;
dos.writeBytes("RCPT TO: <"+to+">\r\n");
response = readLastLine(dis);
if(!response.startsWith("250"))
{ //SMTP不愿意为接收人接收邮件,可在此进行相应处理; dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null;
continue;
}else
{ //SMTP愿意为接收入接收邮件,写入DATA表明开始邮件传送;
dos.writeBytes("DATA\r\n");
response = readLastLine(dis);
if(!response.startsWith("354"))
{ dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null;
continue;
} else
{ //SMTP服务器同意开始输入邮件,对邮件体的//From,To,Subject,Data等做相应设置,写入要传送的邮件体//正文:body;
dos.writeBytes("From:< "+getStr(from,myEncode)+">\r\n");
dos.writeBytes("To: <"+getStr(to,myEncode)+">\r\n");
dos.writeBytes("Subject: "+getStr(subject,myEncode)+"\r\n");
dos.writeBytes("Reply-To: <"+from+">\r\n");
dos.writeBytes("mime-version: 1.0\r\n");
dos.writeBytes("Content-Type: text/html;\r\n"); dos.writeBytes("Content-Transfer-Encoding: Base64");
dos.writeBytes("\r\n\r\n");
dos.writeBytes(getBase64(body));
dos.writeBytes("\r\n\r\n"); dos.writeBytes("\r\n.\r\n");
response =readLastLine(dis);
if(!response.startsWith("250"))
{ //发送失败,可在此做相应处理; dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null;
continue;
} else
{ //发送成功,结束此次传送;
dos.writeBytes("quit\r\n");
dis.close();
dos.close();
socket.close();
dis = null;
dos = null;
socket = null; break L1;
}//sixth else
}//fifth else
}//fourth else
}//third else
} //second else
}//first else
}
}
}catch(Exception e){ e.printStackTrace();}
}
}//run end
private String readLastLine(DataInputStream in) throws IOException
{
String ret = "";
do
{
BufferedReader d= new BufferedReader(new InputStreamReader(in));
ret=d.readLine();
} while(in.available() > 0);
return ret;
}
private String getBase64(String str)
{
return (new BASE64Encoder().encode(str.getBytes()));
}
public static String getStr(String str, String encode)
{
try
{
byte temp[] = str.getBytes(encode);
String tmp = new String(temp, "8859_1");
String s = tmp;
return s;
}
catch(Exception exception)
{
return null;
}
}
private String getRandomDomain()
{
String ret = "";
Random r = new Random(System.currentTimeMillis());
ret = hosts[r.nextInt(hosts.length)];
return ret;
}
public static void main(String[] args)
{
WorkThread wt=new WorkThread();
int pos;
if(args.length<3) System.out.println("请输入您要发送到的邮件地址(如:dddd@163.com)、主题、内容");
else{
wt.to=args[0];
wt.subject=args[1];
wt.body=args[2];
pos=wt.to.indexOf("@");
if(pos==-1) System.out.println("您输入的地址错误,请重新输入");
else { wt.domain=wt.to.substring(pos+1);
wt.start();
}
}
}
}
Java SMTP协议电子邮件传送
最新推荐文章于 2024-09-02 15:20:02 发布