import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import sun.misc.BASE64Encoder;
public class SMTPClient {
private boolean debug=true;
BASE64Encoder encode=new BASE64Encoder();//用於加密後發送用戶名和密碼
public static void main(String[] args) throws UnknownHostException, IOException {
// TODO Auto-generated method stub
MailMessage message=new MailMessage();
message.setFrom("[email protected]");//發件人
message.setTo("[email protected]");//收件人
String server="smtp.163.com";//郵件服務器
//String server="smtpcom.263xmail.com";//郵件服務器
message.setSubject("test");//郵件主題
message.setContent("test");//郵件內容
message.setDatafrom("[email protected]");//發件人,在郵件的發件人欄目中顯示
message.setDatato("[email protected]");//收件人,在郵件的收件人欄目中顯示
message.setUser("[email protected]");//登陸郵箱的用戶名
message.setPassword("555555");//登陸郵箱的密碼
SMTPClient smtp=new SMTPClient(server,25);
boolean flag;
flag=smtp.sendMail(message,server);
if(flag){
System.out.println("郵件發送成功!");
}
else{
System.out.println("郵件發送失敗!");
}
}
private Socket socket;
public SMTPClient(String server,int port) throws UnknownHostException, IOException{
try{
socket=new Socket(server,port);
}catch(SocketException e){
System.out.println(e.getMessage());
}catch(Exception e){
e.printStackTrace();
}finally{
System.out.println("已經建立連接!");
}
}
//註冊到郵件服務器
public void helo(String server,BufferedReader in,BufferedWriter out) throws IOException{
int result;
result=getResult(in);
//連接上郵件服務後,服務器給出220應答
if(result!=220){
throw new IOException("連接服務器失敗");
}
result=sendServer("HELO "+server,in,out);
//HELO命令成功後返回250
if(result!=250)
{
throw new IOException("註冊郵件服務器失敗!");
}
}
private int sendServer(String str,BufferedReader in,BufferedWriter out) throws IOException{
out.write(str);
out.newLine();
out.flush();
if(debug)
{
System.out.println("已發送命令:"+str);
}
return getResult(in);
}
public int getResult(BufferedReader in){
String line="";
try{
line=in.readLine();
if(debug){
System.out.println("服務器返回狀態:"+line);
}
}catch(Exception e){
e.printStackTrace();
}
//從服務器返回消息中讀出狀態碼,將其轉換成整數返回
StringTokenizer st=new StringTokenizer(line," ");
return Integer.parseInt(st.nextToken());
}
public void authLogin(MailMessage message,BufferedReader in,BufferedWriter out) throws IOException{
int result;
result=sendServer("AUTH LOGIN",in,out);
if(result!=334){
throw new IOException("用戶驗證失敗!");
}
result=sendServer(encode.encode(message.getUser().getBytes()),in,out);
if(result!=334){
throw new IOException("用戶名錯誤!");
}
result=sendServer(encode.encode(message.getPassword().getBytes()),in,out);
if(result!=235){
throw new IOException("驗證失敗!");
}
}
//開始發送消息,郵件源地址
public void mailfrom(String source,BufferedReader in,BufferedWriter out) throws IOException{
int result;
result=sendServer("MAIL FROM:<"+source+">",in,out);
if(result!=250){
throw new IOException("指定源地址錯誤");
}
}
// 設置郵件收件人
public void rcpt(String touchman,BufferedReader in,BufferedWriter out) throws IOException{
int result;
result=sendServer("RCPT TO:<"+touchman+">",in,out);
if(result!=250){
throw new IOException("指定目的地址錯誤!");
}
}
//郵件體
public void data(String from,String to,String subject,String content,BufferedReader in,BufferedWriter out) throws IOException{
int result;
result=sendServer("DATA",in,out);
//輸入DATA回車後,若收到354應答後,繼續輸入郵件內容
if(result!=354){
throw new IOException("不能發送數據");
}
out.write("From: "+from);
out.newLine();
out.write("To: "+to);
out.newLine();
out.write("Subject: "+subject);
out.newLine();
out.newLine();
out.write(content);
out.newLine();
//句號加回車結束郵件內容輸入
result=sendServer(".",in,out);
System.out.println(result);
if(result!=250)
{
throw new IOException("發送數據錯誤");
}
}
//退出
public void quit(BufferedReader in,BufferedWriter out) throws IOException{
int result;
result=sendServer("QUIT",in,out);
if(result!=221){
throw new IOException("未能正確退出");
}
}
//發送郵件主程序
public boolean sendMail(MailMessage message,String server){
try{
BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
helo(server,in,out);//HELO命令
authLogin(message,in,out);//AUTH LOGIN命令
mailfrom(message.getFrom(),in,out);//MAIL FROM
rcpt(message.getTo(),in,out);//RCPT
data(message.getDatafrom(),message.getDatato(),message.getSubject(),message.getContent(),in,out);//DATA
quit(in,out);//QUIT
}catch(Exception e){
e.printStackTrace();
return false;
}
return true;
}
}
public class MailMessage {
private String from;
private String to;
private String datafrom;
private String datato;
private String subject;
private String content;
private String date;
private String user;
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getDatafrom() {
return datafrom;
}
public void setDatafrom(String datafrom) {
this.datafrom = datafrom;
}
public String getDatato() {
return datato;
}
public void setDatato(String datato) {
this.datato = datato;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
}