熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

java實現郵件發送

2013-11-23 18:52:05  來源: Java核心技術 




  要實現郵箱的發送需要一個已知賬號和密碼的郵箱並且開通了STMPPOP服務常見主流郵箱郵件收取和發送popstmp服務配置匯總介紹一文中詳細介紹了各個郵箱開通服務的步驟
   
    郵件發送是利用與郵件發送服務器建立的Socket連接通過這個連接獲得輸入輸出流再利用流在程序中輸入特定的命令行來實現郵件的發送
   
   
   
    下面是程序步驟
   
    與郵件發送服務器建立器Socket連接(需要端口號和服務器名稱)
   
    用HELO命令注冊到服務器上
   
    用AUTH LOGIN命令根據已有的郵箱賬號和密碼登陸到服務器
   
    用MAIL FROM<>命令設置郵件源地址信息
   
    用MAIL TO<>命令設置郵件目的地址信息
   
    用DATAFROMTOSUBJECT命令分別設置發件人昵稱收件人昵稱主題信息和內容+回車結束內容輸入
   
    最後用QUIT命令退出郵件發送服務
   
   
   
下面是程序代碼
   
    定義一個接口主要是上面步驟方法的聲明
   
    SendMailjava:
   
    package comsunfloweryuansendmail;import javaioIOException;/** * @author Caihanyuan * @time 上午:: */public interface SendMail {
   
    /**
   
    * 向服務器發送命令
   
    *
   
    * @param order
   
    *
   
    向服務器發送的命令行
   
    * @return 返回服務器狀態
   
    * */
   
    public int sendToServer(String order)
   
    /**
   
    * 解析服務器返回的應答信息
   
    *
   
    * @return 返回服務器狀態
   
    * */
   
    public int getResult()
   
    /** 與服務器發起會話 */
   
    public void regist() throws IOException;
   
    /** 登錄到服務器 */
   
    public void login() throws IOException;
   
    /** 設置郵件源地址 */
   
    public void setMailFrom() throws IOException;
   
    /** 設置郵件目的地址 */
   
    public void setMailTo() throws IOException;
   
    /** 設置郵件內容 */
   
    public void setData() throws IOException;
   
    /** 退出郵箱服務 */
   
    public void quit() throws IOException;
   
    /** 發送郵件的主程序 */
   
    public boolean sendMail() throws IOException;}
   
    接口的實現類
   


    SendMailImpjava:
   
    package comsunfloweryuansendmail;import javaioBufferedReader;import javaioBufferedWriter;import javaioIOException;import javaioInputStreamReader;import javaioOutputStreamWriter;import Socket;import UnknownHostException;import javautilStringTokenizer;import sunmiscBASEEncoder;/** * @author Caihanyuan * @time 上午:: */public class SendMailImp implements SendMail {
   
    public static final int SINA = ;
   
    public static final int QQ = ;
   
    public static final int FOXMAIL = ;
   
    public static final int WANGYI = ;
   
    public static final int WANGYI = ;
   
    public static final int YEAH = ;
   
    public static final int HOTMAIL = ;
   
    public static final int YAHOO = ;
   
    public static final int GMAIL = ;
   
    /** 用於向服務器發起連接 */
   
    private Socket socket = null;
   
    /** 與服務器連接後的輸入流 */
   
    private BufferedReader input = null;
   
    /** 與服務器連接後的輸出流 */
   
    private BufferedWriter output = null;
   
    /** 發送郵件服務器名稱 */
   
    private String server = null;
   
    /** 發送端口號 */
   
    private int port;
   
    /** 郵件信息 */
   
    private MailMessage message;
   
    public MailMessage getMessage() {
   
    return message;
   
    }
   
    //設置郵件的信息內容以方法鏈的方式實現
   
    public SendMailImp setMessage(MailMessage message) {
   
    ssage = message;
   
    return this;
   
    }
   
    public Socket getSocket() {
   
    return socket;
   
    }
   
    public void setSocket(Socket socket) {
   
    thissocket = socket;
   
    }
   
    public BufferedReader getInput() {
   
    return input;
   
    }
   
    public void setInput(BufferedReader input) {
   
    thisinput = input;
   
    }
   
    public BufferedWriter getOutput() {
   
    return output;
   
    }
   
    public void setOutput(BufferedWriter output) {
   
    thisoutput = output;
   
    }
   
    public String getServer() {
   
    return server;
   
    }
   
    public void setServer(String server) {
   
    thisserver = server;
   
    }
   
    public int getPort() {
   
    return port;
   
    }
   
    public void setPort(int port) {
   
    thisport = port;
   
    }
   
    /**
   
    * 根據郵箱類型設置發送郵件服務器和端口號
   
    */
   
    public static SendMailImp getInstance(int sendMailType) {
   
    SendMailImp sendMailImp = new SendMailImp()
   
    switch (sendMailType) {
   
    case SINA:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case QQ:
   
    case FOXMAIL:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case WANGYI:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case WANGYI:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case YEAH:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case YAHOO:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case GMAIL:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    case HOTMAIL:
   
    sendMailImpsetServer(
   
    sendMailImpsetPort(
   
    break;
   
    default:
   
    break;
   
    }
   
    try {
   
    // 與發送郵件服務器建立Socket連接並得到輸入輸出流
   
    Socket socket = new Socket(sendMailImpgetServer() sendMailImp
   
    getPort())
   
    BufferedReader input = new BufferedReader(new InputStreamReader(
   
    socketgetInputStream()))
   
    BufferedWriter output = new BufferedWriter(new OutputStreamWriter(
   
    socketgetOutputStream()))
   
    sendMailImpsetSocket(socket)
   
    sendMailImpsetInput(input)
   
    sendMailImpsetOutput(output)
   
    }
   
    catch (UnknownHostException e) {
   
    eprintStackTrace()
   
    }
   
    catch (IOException e) {
   
    eprintStackTrace()
   
    }
   
    return sendMailImp;
   
    }
   
    public int sendToServer(String order) {
   
    try {
   
    thisgetOutput()write(order)
   
    thisgetOutput()newLine()
   
    thisgetOutput()flush()
   
    Systemoutprintln(已發送命令 + order)
   
    }
   
    catch (IOException e) {
   
    eprintStackTrace()
   
    }
   
    return getResult()
   
    }
   
    public int getResult() {
   
    String line = ;
   
    try {
   
    line = thisgetInput()readLine()
   
    Systemoutprintln(服務器返回狀態 + line)
   
    }
   
    catch (IOException e) {
   
    eprintStackTrace()
   
    }


   
    // 從服務器返回消息中取得狀態碼並轉換成整數返回
   
    StringTokenizer get = new StringTokenizer(line
   
    return IntegerparseInt(getnextToken())
   
    }
   
    public void regist() throws IOException {
   
    int result = getResult()
   
    // 連接上服務器後服務器給出應答
   
    if (result !=
   
    throw new IOException(連接服務器失敗
   
    result = sendToServer(HELO + thisgetServer())
   
    // HELO命令成功後服務器返回應答
   
    if (result !=
   
    throw new IOException(注冊郵件服務器失敗
   
    }
   
    public void login() throws IOException {
   
    BASEEncoder encode = new BASEEncoder()
   
    int result = sendToServer(AUTH LOGIN
   
    // 登陸服務成功服務器返回應答
   
    if (result !=
   
    throw new IOException(登陸服務失敗
   
    // 對郵箱用戶名進行驗證
   
    result = sendToServer(encodeencode(ssagegetUser()getBytes()))
   
    if (result !=
   
    throw new IOException(用戶名錯誤
   
    // 對郵箱密碼進行驗證
   
    result = sendToServer(encodeencode(messagegetPassword()getBytes()))
   
    if (result !=
   
    throw new IOException(用戶驗證錯誤
   
    }
   
    public void setMailFrom() throws IOException {
   
    int result = sendToServer(MAIL FROM:< + thisgetMessage()getFrom()
   
    + >
   
    if (result !=
   
    throw new IOException(郵件源地址錯誤
   
    }
   
    public void setMailTo() throws IOException {
   
    int result = sendToServer(RCPT TO:< + thisgetMessage()getTo() + >
   
    if (result !=
   
    throw new IOException(郵件目的地址錯誤
   
    }
   
    public void setData() throws IOException {
   
    int result = sendToServer(DATA
   
    // 輸入date回車後若收到應答後繼續輸入郵件內容
   
    if (result !=
   
    throw new IOException(不能發送數據
   
    thisgetOutput()write(FROM: + thisgetMessage()getDatafrom())
   
    thisgetOutput()newLine()
   
    thisgetOutput()write(TO: + thisgetMessage()getDatato())
   
    thisgetOutput()newLine()
   
    thisgetOutput()write(SUBJECT: + thisgetMessage()getSubject())
   
    thisgetOutput()newLine()
   
    thisgetOutput()newLine()
   
    thisgetOutput()write(thisgetMessage()getContent())
   
    thisgetOutput()newLine()
   
    // 句點加回車結束郵件內容輸入
   
    result = sendToServer(
   
    if (result !=
   
    throw new IOException(發送數據錯誤
   
    }
   
    public void quit() throws IOException {
   
    int result = sendToServer(QUIT
   
    if (result !=
   
    throw new IOException(未能正確退出
   
    thisgetInput()close()
   
    thisgetOutput()close()
   
    }
   
    public boolean sendMail() {
   
    boolean success = true;
   
    try {
   
    // 注冊到發送郵件服務器
   
    regist()
   
    // 登陸到服務器
   
    login()
   
    // 設置郵件源地址
   
    setMailFrom()
   
    // 設置郵件目的地址
   
    setMailTo()
   
    // 設置郵件體
   
    setData()
   
    // 退出郵件
   
    quit()
   
    }
   
    catch (Exception e) {
   
    eprintStackTrace()
   
    success = false;
   
    }
   
    return success;
   
    }}
   
    郵件信息的實體類
   
    MailMessagejava:
   
    package comsunfloweryuansendmail;/** * @author Caihanyuan * @time 下午:: */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 getFrom() {
   
    return from;
   
    }
   
    public void setFrom(String from) {
   
    thisfrom = from;
   
    }
   
    public String getTo() {
   
    return to;
   
    }
   
    public void setTo(String to) {
   
    thisto = to;
   
    }
   
    public String getDatafrom() {
   
    return datafrom;
   
    }
   
    public void setDatafrom(String datafrom) {
   
    thisdatafrom = datafrom;
   
    }
   
    public String getDatato() {
   
    return datato;
   
    }
   
    public void setDatato(String datato) {
   
    thisdatato = datato;
   
    }
   
    public String getSubject() {
   
    return subject;
   
    }
   
    public void setSubject(String subject) {
   
    thissubject = subject;
   
    }
   
    public String getContent() {
   
    return content;
   
    }
   
    public void setContent(String content) {
   
    ntent = content;
   
    }
   
    public String getDate() {
   
    return date;
   
    }
   
    public void setDate(String date) {
   
    thisdate = date;
   
    }
   
    public String getUser() {
   
    return user;
   
    }
   
    public void setUser(String user) {
   
    thisuser = user;
   
    }
   
    public String getPassword() {
   
    return password;
   
    }
   
    public void setPassword(String password) {
   
    thispassword = password;
   
    }}


   
    測試類
   
    Testjava:
   
    package comsunfloweryuantest;import javaioIOException;import comsunfloweryuansendmailMailMessage;import comsunfloweryuansendmailSendMail;import comsunfloweryuansendmailSendMailImp;/** * @author Caihanyuan * @time 下午:: */public class Test {
   
    public static void main(String[] args) {
   
    MailMessage message = new MailMessage()
   
    messagesetFrom(caih****
   
    messagesetTo(*****
   
    messagesetSubject(這個是一個郵件發送測試
   
    messagesetUser(caih****
   
    messagesetContent(Hellothis is a mail send test\n你好這是一個郵件發送測試
   
    messagesetDatafrom(caih****
   
    messagesetDatato(****
   
    messagesetPassword(*****
   
    SendMail send = SendMailImpgetInstance(SendMailImpWANGYIsetMessage(message)
   
    try {
   
    sendsendMail()
   
    }
   
    catch (IOException e) {
   
    eprintStackTrace()
   
    }
   
    }}
   
    要注意的是setUser()裡面的字符信息是郵件源地址的前綴
   
    程序運行效果

  


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25888.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.