從Java應用程序中發送E-mail
發表時間:2024-06-19 來源:明輝站整理相關軟件相關文章人氣:
[摘要]Java作為一種網絡編程語言,具有強大的網絡編程功能,可以用僅僅幾條語句完成其他語言需要的幾十條甚至上百條語句所能完成的功能。這里,我試著用Java編寫了一個可以用來發送E-mail的程序,很簡單,僅僅作為示例。 首先,需要了解一下SMTP協議(簡單郵件傳輸協議),是定義郵件傳輸的協議,它是基于...
Java作為一種網絡編程語言,具有強大的網絡編程功能,可以用僅僅幾條語句完成其他語言需要的幾十條甚至上百條語句所能完成的功能。這里,我試著用Java編寫了一個可以用來發送E-mail的程序,很簡單,僅僅作為示例。
首先,需要了解一下SMTP協議(簡單郵件傳輸協議),是定義郵件傳輸的協議,它是基于TCP服務的應用層協議,由RFC0821所定義。SMPT協議規定的命令是以明文方式進行的。下表說明了SMTP服務器發送電子郵件所需的步驟。
SMTP協議
協議 描述
HELO本地主機名 啟動與SMTP服務器的通信
MAIL FROM:用戶@電子郵件地址.com 指定誰正在發送電子郵件
用戶@電子郵件地址.com 指定誰將接收電子郵件
DATA 指定電子郵件的數據是下一個
(你的電子郵件信息) 指定電子郵件的信息(任意行)
一個點指定電子郵件的結束
QUIT 正常關閉連接
這就是一個簡單的發送郵件的會話過程,其實當使用outlook express等客戶軟件發送時,后臺進行的交互也是這樣的,當然,SMTP協議為了處理復雜的郵件發送情況如附件等等,定義了很多的命令及規定,具體可以通過閱讀RFC821來獲得。
當你的一個朋友向你發送郵件時,他的郵件服務器和你的郵件服務器通過SMTP協議通信,將郵件傳遞給你郵件地址所指示的郵件服務器上(這里假設你的本地郵件服務器是Linux系統),若你通過telnet協議直接登錄到郵件服務器上,則可以使用mail等客戶軟件直接閱讀郵件,但是若你希望使用本地的MUA(Mail User Agent,如outlook express等客戶軟件)來閱讀郵件,則本地客戶端通過POP3或IMAP協議與郵件服務器交互,將郵件信息傳遞到客戶端(如:win98系統)。而如果你向你的朋友回復一封信件時,你所使用的MUA也是通過SMTP協議與郵件服務(一般為發送郵件地址對應的email地址)器通信,指示其希望郵件服務器幫助轉發一封郵件到你朋友的郵件地址指定的郵件服務器中。若本地郵件服務器允許你通過它轉發郵件,則服務器通過SMTP協議發送郵件到對方的郵件服務器。這就是接受和發送郵件的全部過程。
了解了電子郵件的發送過程,我們就可以利用Java的強大功能來實現這一過程了,下面這個程序SendMail.java演示了如何在應用程序中發送電子郵件。
import java.io.*
import java.net.*
public class SendMail
{static PrintStream ps=null; //發送信息
static DatainputStream dis=null; //接受信息
public static void send(String str) throws IOException
{ps.println(str); //發送串
ps.flush(); //刷新該串
System.out.println("Java sent: "+str);
}
public static void receive() throws IOException
{ String readstr=dis.readLine(); //得到smtp響應
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" 標志該信息結束
Socket smtp=null; //smtp套接字
try{smtp=new Socket("smtp.any.com",25);
//注意:25是smtp的默認端口號
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已準備好
String loc=InetAddress.getLocalHost().getHostname();
send(HELO+loc);
receive(); //得到smtp響應
send(MAIL_FROM); //從地址發出
receive(); //得到smtp響應
send(RECP_TO); //發送smtp給誰
receive(); //得到smtp響應
send(DATA); //發送smtp開始
receive(); //得到smtp響應
send(SUBJECT); //發送smtp標題
receive(); //得到smtp響應
send(BODY); //發信息主體
receive(); //得到smtp響應
smtp.close(); //關閉連接
}
catch(IOException e)
{ System.out.println("error");
}
System.out.println("Mail Sent!");
}
}
你應該注意到,電子郵件消息的數據部分有兩段:頭部和主體。在頭部,你可以制定有關這條消息的附加信息。在前面這個示例中,程序設置了這條消息的主題。為了運行上述代碼,必須改變SMTP域名,以及發送者和接收者的E-mail地址。