• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用Java實現SMTP服務器

    發表于:2007-05-26來源:作者:點擊數: 標簽:
    電子郵件傳遞可以由多種 協議 來實現。目前,在Internet網上最流行的三種電子郵件 協議 是SMTP、POP3和IMAP,下面分別簡單介紹。 ◆SMTP 協議 簡單郵件傳輸 協議 (SimpleMailTransferProtocol,SMTP)是一個運行在TCP/IP之上的 協議 ,用它發送和接收電子郵件

    電子郵件傳遞可以由多種協議來實現。目前,在Internet網上最流行的三種電子郵件協議是SMTP、POP3和IMAP,下面分別簡單介紹。

    ◆SMTP協議

    簡單郵件傳輸協議(SimpleMailTransferProtocol,SMTP)是一個運行在TCP/IP之上的協議,用它發送和接收電子郵件。SMTP服務器在默認端口25上監聽。SMTP客戶使用一組簡單的、基于文本的命令與SMTP服務器進行通信。在建立了一個連接后,為了接收響應,SMTP客戶首先發出一個命令來標識它們的電子郵件地址。如果SMTP服務器接受了發送者發出的文本命令,它就利用一個OK響應和整數代碼確認每一個命令??蛻舭l送的另一個命令意味著電子郵件消息體的開始,消息體以一個圓點“.”加上回車符終止。

    ◆POP3協議

    郵局協議(PostOfficeProtocolVersion3,POP3)提供了一種對郵件消息進行排隊的標準機制,這樣接收者以后才能檢索郵件。POP3服務器也運行在TCP/IP之上,并且在默認端口110上監聽。在客戶和服務器之間進行了初始的會話之后,基于文本的命令序列可以被交換。POP3客戶利用用戶名和口令向POP3服務器認證。POP3中的認證是在一種未加密的會話基礎之上進行的。POP3客戶發出一系列命令發送給POP3服務器,如:請求客戶郵箱隊列的狀態、請求列出的郵箱隊列的內容和請求檢索實際的消息。POP3代表一種存儲轉發類型的消息傳遞服務?,F在,大部分郵件服務器都采用SMTP發送郵件,同時使用POP3接收電子郵件消息。

    ◆IMAP協議

    Internet消息訪問協議(InternetMessageAclearcase/" target="_blank" >ccessProtocol,IMAP)是一種電子郵件消息排隊服務,它對POP3的存儲轉發限制提供了重要的改進。IMAP也使用基于文本命令的語法在TCP/IP上運行,IMAP服務器一般在默認端口143監聽。IMAP服務器允許IMAP客戶下載一個電子郵件的頭信息,并且不要求將整個消息從服務器下載至客戶,這一點與POP3是相同的。IMAP服務器提供了一種排隊機制以接收消息,同時必須與SMTP相結合在一起才能發送消息。

    下面以SMTP發送電子郵件為例講解怎樣用Java實現SMTP服務器應用功能,從而完成郵件的發送的。


    SMTP命令


    SMTP協議是目前網上流行的發送E-Mail的協議,SMTP協議共有14條命令。不過,發一封E-Mail只需用如下5條命令就足夠了,分別為:

    ◆HELO<SP><domain><CRLF>,與SMTP服務器握手,傳送本機域名;

    ◆MAIL<SP>FROM:<reverse-path><CRLF>,傳送發信者的信箱名稱;

    ◆RCPT<SP>TO:<forward-path><CRLF>,傳送接收者的信箱名稱;

    ◆DATA<CRLF>,發送信件數據(包括信頭和信體);

    ◆QUIT<CRLF>,退出與SMTP服務器的連接。


    編程思路


    首先我們設計一個郵件發送程序的交互界面,界面中包括用戶輸入郵件的收件人、發信人和主題組件的單行文本框,書寫郵件內容的多行文本框等。然后為了能夠實現E-mail的發送和設置,我們設計一個SmtpMail類,它封裝了與郵件服務器之間的Socket通信操作,以及SMTP命令的發送和響應信息的接收。


    編程技巧說明


    1.設置窗體和組件

    我們設計了一個MailSendFrame()類繼承Frame對象,作為容納組件的主窗體。Main()函數實現將窗體啟動時置于屏幕的正中央,窗口定義代碼如下:

    publicstaticvoidmain(String[]args){
    mailSendFramemailSendFrame=newmailSendFrame();
    DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
    DimensionframeSize=mailSendFrame.getSize();
    if(frameSize.height>screenSize.height){
    frameSize.height=screenSize.height;
    }
    if(frameSize.width>screenSize.width){
    frameSize.width=screenSize.width;
    }
    mailSendFrame.setLocation((screenSize.width-frameSize.width)/2,
    (screenSize.height-frameSize.height)/2);
    mailSendFrame.setVisible(true);
    mailSendFrame.show();
    }



    在Main()函數中,首先利用代表系統信息的Toolkit對象得到當前系統中設置的屏幕分辨率,并且用分辨率和窗體的大小作比較,然后,調用MailSendFrame的SetLocation()方法設置窗體的左上角坐標,使窗體的中心和屏幕的中心正好重合,從而將窗體居中。

    //組件實例變量的定義
    PanelpanelMain=newPanel();
    PanelpanelUp=newPanel();
    Panelpanel3=newPanel();
    Panelpanel4=newPanel();
    Panelpanel6=newPanel();
    Panelpanel7=newPanel();
    TextFieldtxtServer=newTextField();
    TextFieldtxtTo=newTextField();
    TextFieldtxtFrom=newTextField();
    TextFieldtxtSubject=newTextField();
    Panelpanel8=newPanel();
    LabellblFile=newLabel();
    ButtoncmdBrowse=newButton();
    PanelpanelDown=newPanel();
    TextAreatxtMail=newTextArea();
    Panelpanel10=newPanel();
    ButtoncmdSend=newButton();
    ButtoncmdExit=newButton();
    .......
    .......
    panelMain.add(panelUp,null);
    panelUp.add(panel3,null);
    panel3.add(newLabel("發信服務器:"),null);
    panel3.add(txtServer,null);
    panelUp.add(panel4,null);
    panel4.add(newLabel("收件人:"),null);
    panel4.add(txtTo,null);
    panelUp.add(panel6,null);
    panelUp.add(panel7,null);
    panel7.add(newLabel("主題:"),null);
    panel7.add(txtSubject,null);
    panel6.add(newLabel("發件人:"),null);
    panel6.add(txtFrom,null);
    panelUp.add(panel8,null);
    panel8.add(newLabel("附件:"),null);
    panel8.add(lblFile,null);
    panel8.add(cmdBrowse,null);
    panelMain.add(panelDown,null);
    panelDown.add(txtMail,BorderLayout.CENTER);
    panelDown.add(panel10,BorderLayout.SOUTH);
    panel10.add(cmdSend,null);
    panel10.add(cmdExit,null);
    panelDown.add(newLabel(""),BorderLayout.EAST);
    panelDown.add(newLabel(""),BorderLayout.WEST);
    ........
    ........



    窗體組件的定義都是在Init()方法中完成,設置好收件人、發信人和主題組件的單行文本框,書寫郵件內容的多行文本框,以及附件中的瀏覽按鈕、發送和退出按鈕。

    2.窗體中的事件處理

    事件處理也是在Init()方法中完成。選取附件文件的“瀏覽”按鈕的事件處理,在單擊該按鈕時,打開一個OpenFileDialog文件對話框,讀取用戶所選取的文件名。打開文件對話框的“瀏覽”按鈕的代碼如下:

    privateFileDialogopenFileDialog=newFileDialog(this,"打開文件",FileDialog.LOAD);
    publicmailSendFrame(){
    try{
    Init();
    }
    catch(Exceptione){
    e.printStackTrace();
    }
    }
    ......
    ......



    單擊“發送”按鈕的事件處理,實現用戶填寫郵件信息的收集和郵件的發送操作?!鞍l送”按鈕的代碼如下:

    cmdSend.addActionListener(newjava.awt.event.ActionListener(){
    publicvoidactionPerformed(ActionEvente){
    cmdSend_actionPerformed(e);
    }
    }



    實現cmdSend_actionPerformed()方法如下:

    voidcmdSend_actionPerformed(ActionEvente){
    mailSender.setFrom(txtFrom.getText().trim());
    mailSender.setTo(txtTo.getText().trim());
    mailSender.addHeader("Subject",txtSubject.getText().trim());
    mailSender.addData(txtMail.getText());
    if(!lblFile.getText().trim().equals(""))
    mailSender.addAttachment(lblFile.getText().trim());
    mailSender.open(txtServer.getText().trim(),25);
    mailSender.transmit();
    mailSender.close();
    }



    單擊“退出”按鈕的事件處理,實現程序的退出和窗體的關閉?!巴顺觥卑粹o和偵聽器的程序代碼如下:

    cmdExit.addActionListener(newjava.awt.event.ActionListener(){
    publicvoidactionPerformed(ActionEvente){
    cmdExit_actionPerformed(e);
    }
    }
    this.addWindowListener(newjava.awt.event.WindowAdapter(){
    publicvoidwindowClosing(WindowEvente){
    this_windowClosing(e);
    }
    }



    上面程序分別為退出和窗體注冊事件的偵聽器或適配器,它們處理各自的交互動作。實現cmdExit_actionPerformed()和this_windowClosing()方法如下:

    voidcmdExit_actionPerformed(ActionEvente){
    System.exit(0);
    }
    voidthis_windowClosing(WindowEvente){
    System.exit(0);
    }



    3.SmtpMail類的實現

    采用Open()方法,建立與郵件服務器之間的TCP/IP連接,創建套接字,并且得到發送命令所用的輸出流Send和接收服務器相應所用的輸入流Rev。Open()方法的代碼如下:

    publicintopen(StringserverName,intport){
    try{
    mailSocket=newSocket(serverName,port);
    send=newPrintWriter(mailSocket.getOutputStream(),true);
    recv=newBufferedReader(newInputStreamReader(mailSocket.getInputStream()));
    Strings1=recv.readLine();
    charc=s1.charAt(0);
    if((c=='4')|(c=='5'))
    return0;
    }
    catch(Exceptione){
    return0;
    }
    return1;
    }



    在SmtpMail類中,通過Transmit()方法完成發送任務。Transmit()方法的代碼如下:

    publicinttransmit(){
    booleanflag=true;
    //發送HELO命令
    if(domain.length()!=0){
    inti=sendString("HELO"+domain);
    if(i!=1)
    return0;
    }
    //發送MAILFROM命令(發件人)
    if(from.length()!=0){
    intj=sendString("MAILFROM:"+from);
    if(j!=1)
    return0;
    }
    //發送RCPTTO命令(收件人)
    if(to.length()!=0){
    intk=sendString("RCPTTO:"+to);
    if(k!=1)
    return0;
    }
    //發送郵件正文(DATA命令)
    if(sendString("DATA")!=1)
    return0;
    //發送郵件頭信息
    for(intl=0;l<x_set.size();l+=2){
    Strings=(String)x_set.elementAt(l);
    send.println(s+":"+x_set.elementAt(l+1));
    }
    //發送時間及相關內容格式說明
    if(x_set.indexOf("Date")<0)
    send.println("Date:"+(newDate()).toString());
    ........
    ........



    使用SendString()方法來發送字符串命令,并且接收郵件服務器的響應信息,判斷命令是否被接收。返回1表示命令被拒絕執行,返回0表示命令被接受。SendString()方法的代碼如下:

    privateintsendString(Strings){
    Strings1="";
    try{
    send.println(s);
    s1=recv.readLine();
    }
    catch(Exceptione){
    System.out.print(s1);
    return0;
    }
    if(s1.length()==0)
    return0;
    charc=s1.charAt(0);
    return!((c=='4')|(c=='5'))?1:0;
    }



    使用Close()方法來關閉與服務器之間的套接字連接。該方法發送“QUIT”命令,收到響應消息后,才真正關閉連接。Close()方法的代碼如下:

    publicintclose(){
    inti=0;
    try{
    i+=sendString("QUIT");
    mailSocket.close();
    }
    catch(Exceptione){
    return0;
    }
    returni==0?1:0;
    }



    mailSendFrame.java源程序代碼如下:

    importjava.awt.*;
    importjava.awt.event.*;
    publicclassmailSendFrameextendsFrame{
    smtpMailmailSender=newsmtpMail();
    PanelpanelMain=newPanel();
    PanelpanelUp=newPanel();
    Panelpanel3=newPanel();
    Panelpanel4=newPanel();
    Panelpanel6=newPanel();
    Panelpanel7=newPanel();
    TextFieldtxtServer=newTextField();
    TextFieldtxtTo=newTextField();
    TextFieldtxtFrom=newTextField();
    TextFieldtxtSubject=newTextField();
    Panelpanel8=newPanel();
    LabellblFile=newLabel();
    ButtoncmdBrowse=newButton();
    PanelpanelDown=newPanel();
    TextAreatxtMail=newTextArea();
    Panelpanel10=newPanel();
    ButtoncmdSend=newButton();
    ButtoncmdExit=newButton();
    privateFileDialogopenFileDialog
    =newFileDialog(this,"打開文件",FileDialog.LOAD);
    publicmailSendFrame(){
    try{
    Init();
    }
    catch(Exceptione){
    e.printStackTrace();
    }
    }
    publicstaticvoidmain(String[]args){
    mailSendFramemailSendFrame=newmailSendFrame();
    DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
    DimensionframeSize=mailSendFrame.getSize();
    if(frameSize.height>screenSize.height){
    frameSize.height=screenSize.height;
    }
    if(frameSize.width>screenSize.width){
    frameSize.width=screenSize.width;
    }
    mailSendFrame.setLocation((screenSize.width-frameSize.width)/2,
    (screenSize.height-frameSize.height)/2);
    mailSendFrame.setVisible(true);
    mailSendFrame.show();
    }
    privatevoidInit()throwsException{
    this.setLayout(newBorderLayout());
    panelMain.setLayout(newGridLayout(2,1));
    panelUp.setLayout(newGridLayout(6,1));
    panel3.setLayout(newFlowLayout());
    this.setVisible(true);
    .......
    .......
    //smtpMail.java的源代碼
    importjava.io.*;
    importjava.net.Socket;
    importjava.util.*;
    publicclasssmtpMail{
    privatebooleansendConf=false;
    publicstaticfinalintOK=1;
    publicstaticfinalintERROR=0;
    privatestaticfinalStringTEXT="1";
    privatestaticfinalStringTFILE="2";
    privatestaticfinalStringBFILE="3";
    privatestaticfinalStringCPR="Java1.0";
    privatestaticfinalStringMAILER="X-Mailer";
    privatestaticfinalintBUFFER_SIZE=48;
    privateStringDELIMETER;
    privateStringSEPARATOR;
    privatestaticfinalintHOW_LONG=6;
    privatestaticfinalcharSMTP_ERROR_CODE1=52;
    privatestaticfinalcharSMTP_ERROR_CODE2=53;
    privatestaticfinalintfillchar=61;
    privatestaticfinalStringcvt=
    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    privateSocketmailSocket;
    privateBufferedReaderrecv;
    privatePrintWritersend;
    privateStringfrom;
    privateStringto;
    privateStringdomain;
    privateVectorx_set;
    privateVectorbody;
    privateVectorattach;
    publicsmtpMail(){
    DELIMETER="";
    SEPARATOR="";
    mailSocket=null;
    recv=null;
    send=null;
    from="";
    to="";
    domain="";
    x_set=newVector();
    body=newVector();
    attach=newVector();
    DELIMETER=getId();
    SEPARATOR=System.getProperty("file.separator");
    }
    .........
    .........

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>