明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

從Java應(yīng)用程序中發(fā)送E-mail

[摘要]Java作為一種網(wǎng)絡(luò)編程語言,具有強(qiáng)大的網(wǎng)絡(luò)編程功能,可以用僅僅幾條語句完成其他語言需要的幾十條甚至上百條語句所能完成的功能。這里,我試著用Java編寫了一個(gè)可以用來發(fā)送E-mail的程序,很簡單,僅僅作為示例! ∈紫,需要了解一下SMTP協(xié)議(簡單郵件傳輸協(xié)議),是定義郵件傳輸?shù)膮f(xié)議,它是基于...
Java作為一種網(wǎng)絡(luò)編程語言,具有強(qiáng)大的網(wǎng)絡(luò)編程功能,可以用僅僅幾條語句完成其他語言需要的幾十條甚至上百條語句所能完成的功能。這里,我試著用Java編寫了一個(gè)可以用來發(fā)送E-mail的程序,很簡單,僅僅作為示例。
  首先,需要了解一下SMTP協(xié)議(簡單郵件傳輸協(xié)議),是定義郵件傳輸?shù)膮f(xié)議,它是基于TCP服務(wù)的應(yīng)用層協(xié)議,由RFC0821所定義。SMPT協(xié)議規(guī)定的命令是以明文方式進(jìn)行的。下表說明了SMTP服務(wù)器發(fā)送電子郵件所需的步驟。


SMTP協(xié)議

協(xié)議  描述
HELO本地主機(jī)名 啟動與SMTP服務(wù)器的通信

MAIL FROM:用戶@電子郵件地址.com 指定誰正在發(fā)送電子郵件
用戶@電子郵件地址.com  指定誰將接收電子郵件
DATA 指定電子郵件的數(shù)據(jù)是下一個(gè)
(你的電子郵件信息) 指定電子郵件的信息(任意行)
一個(gè)點(diǎn)指定電子郵件的結(jié)束
QUIT 正常關(guān)閉連接



  這就是一個(gè)簡單的發(fā)送郵件的會話過程,其實(shí)當(dāng)使用outlook express等客戶軟件發(fā)送時(shí),后臺進(jìn)行的交互也是這樣的,當(dāng)然,SMTP協(xié)議為了處理復(fù)雜的郵件發(fā)送情況如附件等等,定義了很多的命令及規(guī)定,具體可以通過閱讀RFC821來獲得。
  當(dāng)你的一個(gè)朋友向你發(fā)送郵件時(shí),他的郵件服務(wù)器和你的郵件服務(wù)器通過SMTP協(xié)議通信,將郵件傳遞給你郵件地址所指示的郵件服務(wù)器上(這里假設(shè)你的本地郵件服務(wù)器是Linux系統(tǒng)),若你通過telnet協(xié)議直接登錄到郵件服務(wù)器上,則可以使用mail等客戶軟件直接閱讀郵件,但是若你希望使用本地的MUA(Mail User Agent,如outlook express等客戶軟件)來閱讀郵件,則本地客戶端通過POP3或IMAP協(xié)議與郵件服務(wù)器交互,將郵件信息傳遞到客戶端(如:win98系統(tǒng))。而如果你向你的朋友回復(fù)一封信件時(shí),你所使用的MUA也是通過SMTP協(xié)議與郵件服務(wù)(一般為發(fā)送郵件地址對應(yīng)的email地址)器通信,指示其希望郵件服務(wù)器幫助轉(zhuǎn)發(fā)一封郵件到你朋友的郵件地址指定的郵件服務(wù)器中。若本地郵件服務(wù)器允許你通過它轉(zhuǎn)發(fā)郵件,則服務(wù)器通過SMTP協(xié)議發(fā)送郵件到對方的郵件服務(wù)器。這就是接受和發(fā)送郵件的全部過程。
  了解了電子郵件的發(fā)送過程,我們就可以利用Java的強(qiáng)大功能來實(shí)現(xiàn)這一過程了,下面這個(gè)程序SendMail.java演示了如何在應(yīng)用程序中發(fā)送電子郵件。
import java.io.*
import java.net.*
public class SendMail
{static PrintStream ps=null; //發(fā)送信息
static DatainputStream dis=null; //接受信息
public static void send(String str) throws IOException
{ps.println(str); //發(fā)送串
ps.flush(); //刷新該串
System.out.println("Java sent: "+str);
}
public static void receive() throws IOException
{ String readstr=dis.readLine(); //得到smtp響應(yīng)
System.out.println("SMTP response: "+readste);
}
public static void main (String args[])
{String HELO="HELO";
String MAIL_FROM="MAIL_FROM:user@user.com";
String RCPT_TO="RCPT_TO: user@user.com";
String SUBJECT="SUBJECT:Java is cool!";
String DATA="DATA"; //消息的開始
String BODY="Java send this!\r\n.\r\n";
//注意:"\r\n.\r\n" 標(biāo)志該信息結(jié)束
Socket smtp=null; //smtp套接字
try{smtp=new Socket("smtp.any.com",25);
//注意:25是smtp的默認(rèn)端口號
OutputStream os= smtp.getOutputStream();
ps=new PrintStream(os);
InputStream is= smtp.getIntputStream();
dis=new DataInputStream(is)
}
catch(IOException e)
{System.out.println("error");
}
try{//告訴smtp已準(zhǔn)備好
String loc=InetAddress.getLocalHost().getHostname();
send(HELO+loc);
receive(); //得到smtp響應(yīng)
send(MAIL_FROM); //從地址發(fā)出
receive(); //得到smtp響應(yīng)
send(RECP_TO); //發(fā)送smtp給誰
receive(); //得到smtp響應(yīng)
send(DATA); //發(fā)送smtp開始
receive(); //得到smtp響應(yīng)
send(SUBJECT); //發(fā)送smtp標(biāo)題
receive(); //得到smtp響應(yīng)
send(BODY); //發(fā)信息主體
receive(); //得到smtp響應(yīng)
smtp.close(); //關(guān)閉連接
}
catch(IOException e)
{ System.out.println("error");
}
System.out.println("Mail Sent!");
}
}
  你應(yīng)該注意到,電子郵件消息的數(shù)據(jù)部分有兩段:頭部和主體。在頭部,你可以制定有關(guān)這條消息的附加信息。在前面這個(gè)示例中,程序設(shè)置了這條消息的主題。為了運(yùn)行上述代碼,必須改變SMTP域名,以及發(fā)送者和接收者的E-mail地址。