茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671839 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_60D_00113.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [分享]JavaMail

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]JavaMail

JavaMail API的使用:

  • 建置JavaMail的開發環境:
    (1)下載mail.jar:至 http://java.sun.com/products/javamail/downloads/index.html 下載JavaMail 1.3.2 API(或至本站下載)
    (2)下載activation.jar:至 http://java.sun.com/products/javabeans/glasgow/jaf.html 下載JAF 1.0.2(或至本站下載)
    (3)解壓縮JavaMail,將mail.jar複製到到應用程式目錄下的WEB-INFO/lib目錄中即可
    (4)解壓縮JAF,將activation.jar複製到到應用程式目錄下的WEB-INFO/lib目錄中即可
  • 撰寫簡單輸入介面程式及寄信程式:(取自JSP 2.0技術手冊)

  • 簡單的郵件訊息輸入介面:
    <html>
    <head>
      <title>JavaMail.html</title>
    <meta http-equiv="Content-Type" content="text/html; charset=big5">
    </head>
    <body>
    
    <h2>利用JavaMail來傳送電子郵件</h2>
    <form name="Form" method="post" action="JavaMail.jsp">
      <p>寄信人:<input type="text" name="From" size="30" maxlength="30"></p>
      <p>收信人:<input type="text" name="To" size="30" maxlength="30"></p>
      <p>主題:<input type="text" name="Subject" size="30" maxlength="30"></p>
      <p>內容:</p><p><textarea name="Message" cols=40 rows=5></textarea></p>
      <input type="submit" value="傳送">  <input type="reset" value="清除">
    </form>
    </body>
    </html>
    

    信件寄出::
    <%@ page import="javax.mail.*" %>                        <==?#93;含在mail.jar
    <%@ page import="javax.mail.internet.*" %>            <==?#93;含在mail.jar
    <%@ page import="javax.activation.*" %>                <==?#93;含在activation.jar
    <%@ page import="java.util.*,java.io.*" %>
    <%@ page contentType="text/html;charset=big5" %>
    
    <html>
    <head>
      <title>JavaMail.jsp</title>
    </head>
    <body>
     <h2>利用JavaMail來傳送電子郵件 </h2>
    <%
        InternetAddress[] address = null;
        request.setCharacterEncoding("big5");
        String mailserver   = "mail.dwu.edu.tw";                           <=此處所?#93;必須和寄件人的信箱同一台伺服器,
        String From         = request.getParameter("From");                    並且必須考?#123;伺服器是否會mail-rely
        String to           = request.getParameter("To");
        String Subject      = request.getParameter("Subject");
        String messageText  = request.getParameter("Message");
        boolean sessionDebug = false;
    
    try {
      // ?#93;定所要用的Mail 伺服器和所使用的傳送協定
      java.util.Properties props = System.getProperties();
      props.put("mail.host",mailserver);
      props.put("mail.transport.protocol","smtp");           <=?#93;定所使用的protocol為SMTP(Small Mail Transfer Protocol)
      // 產生新的Session 服務
      javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
      mailSession.setDebug(sessionDebug);
      Message msg = new MimeMessage(mailSession);
      // ?#93;定傳送郵件的發信人
      msg.setFrom(new InternetAddress(From));
      // ?#93;定傳送郵件至收信人的信箱
      address = InternetAddress.parse(to,false);
      msg.setRecipients(Message.RecipientType.TO, address);
      // ?#93;定信中的主題
      msg.setSubject(Subject);
      // ?#93;定送信的時間
      msg.setSentDate(new Date());
      // ?#93;定傳送信的MIME Type
      msg.setText(messageText);
      // 送信
      Transport.send(msg);
      out.println("郵件己順利傳送");
    }
        catch (MessagingException mex) {
        mex.printStackTrace();
        }
    %>
     </body>
    </html>
    

    簡單的郵件訊息輸入介面+附加檔案功能+可用HTML格式:
    <html>
    <head>
      <title>JavaMail.html</title>
    <meta http-equiv="Content-Type" content="text/html; charset=big5">
    </head>
    <body>
    
    <h2>利用JavaMail來傳送電子郵件 - 附?#91;檔案</h2>
    <form name="SendMessage" Method="post" action="JavaMail3.jsp" enctype="multipart/form-data">
      <p>寄信人:<input type="text" name="From" size="30" maxlength="30"></p>
      <p>收信人:<input type="text" name="To" size="30" maxlength="30"></p>
      <p>主題:<input type="text" name="Subject" size="30" maxlength="30"></p>
      <p>格式:<select name="Type" size="1">
            <option value="text/plain">Text</option>
            <option value="text/html">HTML</option>
               </select></p>
      <p>附?#91;檔案:<input type="file" name="FileName" size="20" maxlength="20"></p>
      <p>內容:</p><p><textarea name="Message" cols=40 rows=5></textarea></p>
        <input type="submit" value="傳送">
      <input type="reset" value="清除">
    </form>
    </body>
    </html>
    

    信件寄出--(JavaMail3.jsp):
    <%@ page import="javax.mail.*" %>
    <%@ page import="javax.mail.internet.*" %>
    <%@ page import="javax.activation.*" %>
    <%@ page import="java.util.*,java.io.*" %>
    <%@ page import="com.oreilly.servlet.MultipartRequest" %>
    <%@ page contentType="text/html;charset=big5" %>
    
    <html>
    <head>
      <title>JavaMail.jsp</title>
    </head>
    <body>
    
    <h2>利用JavaMail來傳送電子郵件 - 附?#91;檔案</h2>
    
    <%
        InternetAddress[] address = null;
    
        request.setCharacterEncoding("big5");
        MultipartRequest multi = new MultipartRequest(request , "." , 5*1024*1024 , "big5");
    
        String mailserver   = "mail.dwu.edu.tw";
        String From         = multi.getParameter("From");
        String to           = multi.getParameter("To");
        String Subject      = multi.getParameter("Subject");
        String type     = multi.getParameter("Type");
        String messageText  = multi.getParameter("Message");
        String FileName     = multi.getFilesystemName("FileName");
    
        boolean sessionDebug = false;
    
        try {
    
            // ?#93;定所要用的Mail 伺服器和所使用的傳送協定
            java.util.Properties props = System.getProperties();
    
            props.put("mail.host",mailserver);
            props.put("mail.transport.protocol","smtp");
    
            // 產生新的Session 服務
            javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
            mailSession.setDebug(sessionDebug);
    
            Message msg = new MimeMessage(mailSession);
    
            // ?#93;定傳送郵件的發信人
             msg.setFrom(new InternetAddress(From));
    
            // ?#93;定傳送郵件至收信人的信箱
            address = InternetAddress.parse(to,false);
            msg.setRecipients(Message.RecipientType.TO, address);
    
            // ?#93;定信中的主題
            msg.setSubject(Subject);
    
            // ?#93;定送信的時間
            msg.setSentDate(new Date());
    
            if (FileName != null)
            {
                    File file = new File(FileName);
    
                // 如果有附?#91;檔案時,先將郵件內容部份先存起來
                    MimeBodyPart mbp1 = new MimeBodyPart();
    
                // ?#93;定郵件內容的型態為 text/plain 或 text/html
                mbp1.setContent(messageText, type + ";charset=big5");
    
                    // 再來對檔案作處理
                    MimeBodyPart mbp2 = new MimeBodyPart();
                    FileDataSource fds = new FileDataSource(FileName);
                    mbp2.setDataHandler(new DataHandler(fds));
                    mbp2.setFileName(MimeUtility.encodeText(fds.getName(), "big5", "B"));
    
                    // 最後再將二者整合起來,當作一份郵件送出
                    Multipart mp = new MimeMultipart();
                    mp.addBodyPart(mbp1);
                    mp.addBodyPart(mbp2);
                    msg.setContent(mp);
            }
            else
            {
                    // 若沒有檔案時,就直接存郵件內容
                     msg.setContent(messageText,type + ";charset=big5");
            }
    
            Transport.send(msg);
            out.println("郵件己順利傳送");
    
        }
            catch (MessagingException mex)
            {
            mex.printStackTrace();
        }
    %>
    
    </body>
    </html>
    
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]java mail來寄電子賀卡
此處利用java mail來寄信,java mail是J2EE中較晚加入的API,使用時需另外安裝Java Mail和JavaBeans Activation Framework兩個package。
<%@ page contentType="text/html; charset=big5" language="java" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>

impor Java Mail和JavaBeans Activation Framework兩個package中需要用到的class
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>

<%

利用session得到validate.jsp所傳遞過來的資料
String username = (String) session.getAttribute("a");
String body = (String) session.getAttribute("b");
String myname = (String) session.getAttribute("c");
String toaddress = (String) session.getAttribute("d");
String fromaddress = (String) session.getAttribute("e");
String picture = (String) session.getAttribute("f");
String mypicture = (String) session.getAttribute("g");

template.txt中記錄著電子賀卡外?#91;的樣板,以下?#123;式將使用者輸入的資料套入樣板,最後結果存入變數content中
FileInputStream fin = new FileInputStream(new File("D:\\jakarta-tomcat-5.0.16\\webapps\\ecard\\template.txt")) ;
BufferedReader reader = new BufferedReader(new InputStreamReader(fin));
StringBuffer message = new StringBuffer();
Calendar rightnow = Calendar.getInstance();
rightnow.setTime(new Date());
String content = null,line = null;
int index = 0;
StringBuffer line1 = null;
while ((line = reader.readLine()) != null)
{
if (line.indexOf("%getpic%") > 0 )
{
index = line.indexOf("%getpic%");
line1 = new StringBuffer(line);

if(picture.equals("other"))
{
line1.replace(index,index+8, mypicture);
}
else
{
line1.replace(index,index+8,"http://140.116.72.112:8080/ecard/image/" + picture);
}
message.append(line1);
}

if (line.indexOf("%getusername%") > 0 )
{
index = line.indexOf("%getusername%");
line1 = new StringBuffer(line);
line1.replace(index,index+13, username);
message.append(line1);

}else if (line.indexOf("%getbody%") > 0 )
{
index = line.indexOf("%getbody%");
line1 = new StringBuffer(line);
line1.replace(index,index+9, body);

message.append(line1);
} else if (line.indexOf("%getfromaddress%") > 0 )
{
index = line.indexOf("%getfromaddress%");
line1 = new StringBuffer(line);
line1.replace(index,index+16, fromaddress);

message.append(line1);
} else if (line.indexOf("%getmyname%") > 0 )
{
index = line.indexOf("%getmyname%");
line1 = new StringBuffer(line);
line1.replace(index,index+12, myname);

message.append(line1);
} else if (line.indexOf("%getyear%") > 0 )
{
index = line.indexOf("%getyear%");
line1 = new StringBuffer(line);
line1.replace(index,index+9, String.valueOf(rightnow.get(Calendar.YEAR)));

message.append(line1);
} else if (line.indexOf("%getmonth%") > 0 )
{
index = line.indexOf("%getmonth%");
line1 = new StringBuffer(line);
line1.replace(index,index+10, String.valueOf(rightnow.get(Calendar.MONTH)+1));

message.append(line1);
} else if (line.indexOf("%getdate%") > 0 )
{
index = line.indexOf("%getdate%");
line1 = new StringBuffer(line);
line1.replace(index,index+9, String.valueOf(rightnow.get(Calendar.DAY_OF_MONTH)));

message.append(line1);
}else{
line1 = new StringBuffer(line);

message.append(line1);

}
content = message.toString();

}

%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<title>sent</title>
</head>
<body>

<%-- 以下為送信部分的?#123;式碼 --%>式
<%
boolean sessionDebug = false;
InternetAddress[] address;
//?#93;定所要用的Mail伺服器和所使用的傳輸協定
java.util.Properties props = System.getProperties();
props.put("mail.host","turtle.ee.ncku.edu.tw");
props.put("mail.transport.protocol","smtp");
//產生新的maill session
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
mailSession.setDebug(sessionDebug);
MimeMessage msg = new MimeMessage(mailSession);
//?#93;定傳送郵件的發信人
msg.setFrom(new InternetAddress(fromaddress));
//?#93;定收信人的信箱
address = InternetAddress.parse(toaddress,false);
msg.setRecipients(Message.RecipientType.TO, address);
//?#93;定郵件主題
msg.setSubject("電子賀卡");
//?#93;定發信時間
msg.setSentDate(new java.util.Date());
//?#93;定郵件內容
msg.setContent(content,"text/html");
//傳送郵件
Transport.send(msg);
out.print("<center> "+ "已順利送達"+ "</center> <br>");
out.print("<center> <a href=\"input.jsp\">返回</a></center>");
%>

</body>
</html>
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]Java Mail內付的範例(sendhtml.java)
	import java.io.*;
	import java.util.Properties;
	import java.util.Date;

	import javax.mail.*;
	import javax.activation.*;
	import javax.mail.internet.*;
	import javax.mail.util.*;

public class sendHTML {

	/*
	 * @(#)sendhtml.java 1.10 05/08/17
	 * 
	 * Copyright 1998-2005 Sun Microsystems, Inc. All Rights Reserved.
	 * 
	 * Redistribution and use in source and binary forms, with or without
	 * modification, are permitted provided that the following conditions are
	 * met:
	 *  - Redistributions of source code must retain the above copyright notice,
	 * this list of conditions and the following disclaimer.
	 *  - Redistribution in binary form must reproduce the above copyright
	 * notice, this list of conditions and the following disclaimer in the
	 * documentation and/or other materials provided with the distribution.
	 * 
	 * Neither the name of Sun Microsystems, Inc. or the names of contributors
	 * may be used to endorse or promote products derived from this software
	 * without specific prior written permission.
	 * 
	 * This software is provided "AS IS," without a warranty of any kind. ALL
	 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
	 * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
	 * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT
	 * BE LIABLE FOR ANY DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT
	 * OF OR RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
	 * ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY
	 * LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL,
	 * CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND
	 * REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR
	 * INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
	 * POSSIBILITY OF SUCH DAMAGES.
	 * 
	 * You acknowledge that Software is not designed, licensed or intended for
	 * use in the design, construction, operation or maintenance of any nuclear
	 * facility.
	 */


	/**
	 * Demo app that shows how to construct and send a single part html message.
	 * Note that the same basic technique can be used to send data of any type.
	 * 
	 * @author John Mani
	 * @author Bill Shannon
	 * @author Max Spivak
	 */

	    public static void main(String[] argv) {
		new sendHTML(argv);
	    }

	    public sendHTML(String[] argv) {

		String  to, subject = null, from = null, 
			cc = null, bcc = null, url = null;
		String mailhost = null;
		String mailer = "sendhtml";
		String protocol = null, host = null, user = null, password = null;
		String record = null;	// name of folder in which to record mail
		boolean debug = false;
		BufferedReader in =
				new BufferedReader(new InputStreamReader(System.in));
		int optind;

		for (optind = 0; optind < argv.length; optind++) {
		    if (argv[optind].equals("-T")) {
			protocol = argv[++optind];
		    } else if (argv[optind].equals("-H")) {
			host = argv[++optind];
		    } else if (argv[optind].equals("-U")) {
			user = argv[++optind];
		    } else if (argv[optind].equals("-P")) {
			password = argv[++optind];
		    } else if (argv[optind].equals("-M")) {
			mailhost = argv[++optind];
		    } else if (argv[optind].equals("-f")) {
			record = argv[++optind];
		    } else if (argv[optind].equals("-s")) {
			subject = argv[++optind];
		    } else if (argv[optind].equals("-o")) { // originator
			from = argv[++optind];
		    } else if (argv[optind].equals("-c")) {
			cc = argv[++optind];
		    } else if (argv[optind].equals("-b")) {
			bcc = argv[++optind];
		    } else if (argv[optind].equals("-L")) {
			url = argv[++optind];
		    } else if (argv[optind].equals("-d")) {
			debug = true;
		    } else if (argv[optind].equals("--")) {
			optind++;
			break;
		    } else if (argv[optind].startsWith("-")) {
			System.out.println(
	"Usage: sendhtml [[-L store-url] | [-T prot] [-H host] [-U user] [-P passwd]]");
			System.out.println(
	"\t[-s subject] [-o from-address] [-c cc-addresses] [-b bcc-addresses]");
			System.out.println(
	"\t[-f record-mailbox] [-M transport-host] [-d] [address]");
			System.exit(1);
		    } else {
			break;
		    }
		}

		try {
		    if (optind < argv.length) {
			// XXX - concatenate all remaining arguments
			to = argv[optind];
			System.out.println("To: " + to);
		    } else {
			System.out.print("To: ");
			System.out.flush();
			to = in.readLine();
		    }
		    if (subject == null) {
			System.out.print("Subject: ");
			System.out.flush();
			subject = in.readLine();
		    } else {
			System.out.println("Subject: " + subject);
		    }

		    Properties props = System.getProperties();
		    // XXX - could use Session.getTransport() and Transport.connect()
		    // XXX - assume we're using SMTP
		    if (mailhost != null)
			props.put("mail.smtp.host", mailhost);

		    // Get a Session object
		    Session session = Session.getInstance(props, null);
		    if (debug)
			session.setDebug(true);

		    // construct the message
		    Message msg = new MimeMessage(session);
		    if (from != null)
			msg.setFrom(new InternetAddress(from));
		    else
			msg.setFrom();

		    msg.setRecipients(Message.RecipientType.TO,
						InternetAddress.parse(to, false));
		    if (cc != null)
			msg.setRecipients(Message.RecipientType.CC,
						InternetAddress.parse(cc, false));
		    if (bcc != null)
			msg.setRecipients(Message.RecipientType.BCC,
						InternetAddress.parse(bcc, false));

		    msg.setSubject(subject);

		    collect(in, msg);

		    msg.setHeader("X-Mailer", mailer);
		    msg.setSentDate(new Date());

		    // send the thing off
		    Transport.send(msg);

		    System.out.println("\nMail was sent successfully.");

		    // Keep a copy, if requested.

		    if (record != null) {
			// Get a Store object
			Store store = null;
			if (url != null) {
			    URLName urln = new URLName(url);
			    store = session.getStore(urln);
			    store.connect();
			} else {
			    if (protocol != null)		
				store = session.getStore(protocol);
			    else
				store = session.getStore();

			    // Connect
			    if (host != null || user != null || password != null)
				store.connect(host, user, password);
			    else
				store.connect();
			}

			// Get record Folder. Create if it does not exist.
			Folder folder = store.getFolder(record);
			if (folder == null) {
			    System.err.println("Can't get record folder.");
			    System.exit(1);
			}
			if (!folder.exists())
			    folder.create(Folder.HOLDS_MESSAGES);

			Message[] msgs = new Message[1];
			msgs[0] = msg;
			folder.appendMessages(msgs);

			System.out.println("Mail was recorded successfully.");
		    }

		} catch (Exception e) {
		    e.printStackTrace();
		}
	    }

	    public void collect(BufferedReader in, Message msg)
						throws MessagingException, IOException {
		String line;
		String subject = msg.getSubject();
		StringBuffer sb = new StringBuffer();
		sb.append("<HTML>\n");
		sb.append("<HEAD>\n");
		sb.append("<TITLE>\n");
		sb.append(subject + "\n");
		sb.append("</TITLE>\n");
		sb.append("</HEAD>\n");

		sb.append("<BODY>\n");
		sb.append("<H1>" + subject + "</H1>" + "\n");

		while ((line = in.readLine()) != null) {
		    sb.append(line);
		    sb.append("\n");
		}

		sb.append("</BODY>\n");
		sb.append("</HTML>\n");

		msg.setDataHandler(new DataHandler(
			new ByteArrayDataSource(sb.toString(), "text/html")));
	    }
	}
}
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]人家寫好的Class
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class sendMail {
    private String SMTP,mailFrom,mailTo,mailCC,mailTitle,mailBody,mailEncode;
    private String userName,userPass;
    private Object[] attachFileList;
    private boolean isAuthentic = false;
    
    public sendMail(){
        this.SMTP = "";
        this.mailFrom ="";
        this.mailTo = "";
        this.mailCC = "";
        this.mailTitle = "";
        this.mailBody = "";
        this.mailEncode = "BIG5";
    }

    public void setFrom(String from){this.mailFrom = from;}
    public void setTo(String to){this.mailTo = to;}
    public void setCC(String cc){this.mailCC = cc;}
    public void setBody(String body){this.mailBody = body;}
    public void setTitle(String title){this.mailTitle = title;}
    public void setSMTP(String smtp){this.SMTP = smtp;}
    public void setUserName(String userName){this.userName = userName;}
    public void setPassword(String pass){this.userPass = pass;}
    public void setAttachFile(Object[] fileListAry){this.attachFileList = fileListAry;}
    public void setEncode(String encode){this.mailEncode = encode;}
    
    
    /*錯誤訊息對應
     * 0 = 沒有錯誤
     * 1 = 參數不齊全
     * 2 = 送信失敗(有驗證)
     * 3 = 送信失敗(不驗證)
     * 4 = 其他失敗
     * */
    
    public int send(boolean hasSMTPAuth){
        this.isAuthentic = hasSMTPAuth;
        
        //檢查參數是否齊全
        if(!checkParameters(isAuthentic)){
            return 1;
        }else{
            Properties prop = new Properties();
            //?#93;定SMTP Server
            prop.put("mail.smtp.host",this.SMTP);
            Session mailConn = Session.getDefaultInstance(prop,null);

            Message msg = new MimeMessage(mailConn);

            try{
                //?#93;定信件編碼
                msg.setHeader("Content-Transfer-Encoding",this.mailEncode);
                
                //將參數修正編碼
                reEncode();
                
                //Set Sender e-mail Address and nickname
                msg.setFrom(new InternetAddress(this.mailFrom));

                //Set reciever e-mail address and nickname
                msg.setRecipient(Message.RecipientType.TO, 
                        new InternetAddress(this.mailTo));
                
                if(this.mailCC.trim().length()!=0){
                    msg.setRecipient(Message.RecipientType.CC,
                            new InternetAddress(this.mailCC));
                }
                
                //?#93;定信件標題
                if(this.mailTitle.trim().length()==0){
                    msg.setSubject("[無標題信件]");
                }else{
                    msg.setSubject(this.mailTitle);
                }

                //attach content with MIME
                Multipart mp = new MimeMultipart();
                MimeBodyPart mbpBody = new MimeBodyPart();

                //mbpBody.setContent(Message,MIME_Type);
                mbpBody.setContent(this.mailBody,"text/html; charset=" + this.mailEncode);
                
                //Attach files
                MimeBodyPart mbpFile;
                
                for(int i=0;i<attachFileList.length;i++){
                    String fullPath = this.toBIG5(attachFileList[i].toString());
                    mbpFile = new MimeBodyPart();
                    FileDataSource fds = new FileDataSource(fullPath);
                    mbpFile.setDataHandler(new DataHandler(fds));
                    mbpFile.setFileName(fds.getName());
                    mp.addBodyPart(mbpFile);
                }
                
                //將內容?#91;入
                mp.addBodyPart(mbpBody);
                msg.setContent(mp);

                //送信
                if(isAuthentic){
                    prop.put("mail.smtp.auth",isAuthentic);
                    Transport trans = mailConn.getTransport("smtp");
                    
                    try{
                        trans.connect(this.SMTP,this.userName,this.userPass);
                        trans.sendMessage(msg,msg.getAllRecipients());
                        return 0;
                    }catch(Exception ex){
                        ex.printStackTrace();
                        return 2;
                    }finally{
                        trans.close();
                    }
                }else{
                    try{
                        Transport.send(msg);
                        return 0;
                    }catch(SendFailedException ex){
                        System.out.println(ex.toString());
                        return 3;
                    }
                }
            }catch(Exception ex){
                ex.printStackTrace();
                return 4;
            }
        }
    }
    
    private boolean checkParameters(boolean hasSMTPAuth){
        if(SMTP.trim().length()==0 || mailFrom.trim().length()==0 
                || mailTo.trim().length()==0)
            return false;
        else
            if(hasSMTPAuth){
                if(this.userName.trim().length()==0)
                    return false;
                else
                    return true;
            }else{
                return true;
            }
    }
    
    private void reEncode(){
        if(this.mailEncode.toUpperCase()=="BIG5"){
            this.mailFrom = toBIG5(mailFrom);
            this.mailTo = toBIG5(mailTo);
            this.mailTitle = toBIG5(mailTitle);
            this.mailBody = toBIG5(mailBody);
        }else if(this.mailEncode.toUpperCase()=="UTF8"){
            this.mailFrom = toUTF8(mailFrom);
            this.mailTo = toUTF8(mailTo);
            this.mailTitle = toUTF8(mailTitle);
            this.mailBody = toUTF8(mailBody);
        }
    }
    
    private String toUTF8(String str){
        try {
            str = MimeUtility.encodeText(str,"UTF-8", "B");
            return str;
        } catch (Exception ex){
            return str;
        }
    }
    private String toBIG5(String str){
        try {
            str = MimeUtility.encodeText(str,"Big5", null);
            return str;
        } catch (Exception ex){
            return str;
        }
    }
}
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]JavaMail 中文亂碼的問題
JavaMail中文亂碼的問題....

於 2003-07-23 15:38 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. ie only, sorry for netscape users:-)add this post to my favorite list 小弟在google上找了相關的資料來測試了...
但是一直無法讓Subject及信件內容用中文顯示出來...
不知是什麼問題?
<%@ page contentType="text/html; charset=big5"%>
<%@ page language="java" import="java.util.*,java.io.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%!
InternetAddress[] address = null ;
final String charset="big5";
%>
<html>
<head>
<title>:::寄信:::</title>
</head>

<body>

<%
String mailserver = "mail.cyut.edu.tw";
String From = "s8914020@mail.cyut.edu.tw";
String to = request.getParameter("ToMailAddress");
String Subject = new String((request.getParameter("ToMailSubject")).getBytes());
String messageText = request.getParameter("ToMailMsg");
String name=request.getParameter("ToMailName");

boolean sessionDebug = false;

try {

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();

// 設定所要用的Mail 伺服器和所使用的傳送協定
java.util.Properties props = System.getProperties();
props.put("mail.host",mailserver);
props.put("mail.transport.protocol","smtp");

// 產生新的Session 服務
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
mailSession.setDebug(sessionDebug);

Message msg = new MimeMessage(mailSession);

// 設定傳送郵件的發信人
InternetAddress ia = new InternetAddress(From);
ia.setPersonal(name, "Big5");
msg.setFrom(ia);
// 設定傳送郵件至收信人的信箱
address = InternetAddress.parse(to,false);
msg.setRecipients(Message.RecipientType.TO, address);

// 設定信中的主題
msg.setSubject("=?GB2312?B?"+enc.encode(Subject.getBytes())+"?=");

// 設定送信的時間
msg.setSentDate(new Date());

// 設定傳送信的MIME Type
msg.setText(messageText);

// 送信
Transport.send(msg);

out.println("郵件己順利傳送");

}
catch (MessagingException mex) {

mex.printStackTrace();
}

%>

</body>
</html>


--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

JavaMail中的郵件主題需要進行BASE64編碼,格式形如:
=?GB2312?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?=

在設置郵件主題前需要將主題字串的位元組編碼爲BASE64格式,並添加編碼頭,示例代碼如下:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?=");


--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

註解:
GB2312是大陸國標碼,請改成相應臺灣需要的編碼.

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

那如果要改成台灣的編碼...
是不是要改成Big5還是UTF-8呢...???

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

不是還有另一個MimeMessage.setSubject(String subject, String charset)可以用嗎?應該不需要自己用BASE64Encoder,使用的編碼就看收信對象的讀信程式能不能處理UTF-8了,否則用Big5或MS950是比較安全的

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

Forth wrote:
不是還有另一個MimeMessage.setSubject(String subject, String charset)可以用嗎?應該不需要自己用BASE64Encoder,使用的編碼就看收信對象的讀信程式能不能處理UTF-8了,否則用Big5或MS950是比較安全的

我支持用這個方法 .....
比較簡單囉 ....

老實說 ... 看到 龍大蝦的高級解法 .. 用到 BASE64Encoder ...
我瞬間不敢回應 ...... ^^

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

ChungChuanChen wrote:
那如果要改成台灣的編碼...
是不是要改成Big5還是UTF-8呢...???

Mm... =編碼 似乎是M$ 專有的格式
version 1.3 已經有修正了, 請下載
否則抓出來的無法做正確的解碼
http://java.sun.com/products/javamail/

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

以下是某個大大的文章
來源不詳
不過說出了 M$ Outlook MIME 攻城掠地的歷史了
現在 javamail 1.3 也 support 了.... 唉....
果然軟體業有市場有本錢就可以亂搞

== 某前輩的文章.( 很久以前收到的 ) 如果有版權上的問題, 請告知 =====
一、前言:
  您還記不記得,在多年以前,在Microsoft Internet Explorer尚未流行之前,大家收發信件所使用的工具,不是Netscape就是Eudora;那時大家在寫中文信時,並沒有發生什麼困難。直到Internet Explorer出現之後,大家發現,收回來的信件中,總是在主旨欄內看不到正常的中文字,而是看到以=Big5為開頭的一些亂碼,後來慢慢地發現所收的信件中,主旨欄以=Big5為開頭亂碼愈來愈多,逼得到最後,心不甘情不願地將自己原來習慣使用的郵件工具改換為Outlook Express。

二、說明:
  到底為什麼大家非得使用Outlook Express作為收發郵件工具不可呢?得簡單,它預設的信件傳送格式是獨有的,Microsoft老大哥絕對不會遵循大家既有且通用的格式,如此才能慢慢地將大家同化,而改用它的產品,而目前這個目標就快達成了!
  原來Microsoft運用了小技巧,讓我來詳細說明吧!

  在原本Internet世界中,所有的Server幾乎都是Unix的天下,若了解Internet的發展史,應該說是在Unix環境下,才產生Internet的。

  信件在遠端收送時,必須透過一個大家共同遵循的協定,如此大家才能順利地將信件正確的收發。信件在達端收送,可分為兩部分,一是送信,一是收信;送信協定為SMTP(Simple Mail Transhfer Protocol),收信協定則是POP(Post Office Protocol)。

  一般在歐美國家的環境中,所有文字只用到7Bit,所以在整個傳送的協定,都只有7Bit來傳送;但Internet發展到其他各地時,因各地文字之關係,文字有的使用到第8Bit,因此在送信協定(SMTP)中又增加了擴充的功能叫ESMTP(Extented Simple Mail Transfer Protocol),其增加了額外的命令及編碼的功能,讓8Bit的資料能以7Bit編碼的方式來傳送信件。

  在擴充的送信協定(ESMTP)中,提供了MIME(Multiparpose Internet Mail Extersion)的編碼方式,但只是針對信件內容(body)而言;對信件的header(含To:,From:,Message ID:,Subject:,Status:...等)部份,若有用到8Bit文字時,則採用UUencode編碼。

  再來我們介紹一下MIME格式: =?國家碼代號?編碼方式?內容.....?=
國家碼代號=>英文:US-900A,中文(Big5內碼):big5
編碼方式===>Q:Quoted-Printable,B:Base-64
以中文字為例,您看到的MIME編碼後為=?big5?B?...........?=這行文字看起來有沒有很熟悉呢?

  接下來我們看一下由Outlook Express所寄出來的Header部份: Message-ID: <004401bf0562$db9b86c0$18e412a3@manager>
From: =?big5?B?vbKrVKhr?= <jnans@mail.hshanps.kh.edu.tw>
To: =?big5?B?sWmnu6n6?= <jang@mail.nsysu.edu.tw>
References: <000201bf0514$ec8e5960$0c0aa8c0@jang-home>
Subject: =?big5?B?UmU6IKZVpuyl66bxLKdAt36o06RGLi4u?=
Date: Thu, 23 Sep 1999 09:27:53 +0800
MIME-Version: 1.0
Content-Type: multipart/alternative;
boundary="----=_NextPart_000_0041_01BF05A5.E99D3500"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 5.00.2314.1300
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2314.1300
Status: RO
不論是From:,To:,Subject:,看到的均為=?big5?B?......?=,這是什麼意義呢?原來Outlook Express將整個Header部份,全部以MIME格式編碼。
問題就在這邊,以ESMTP協定來看,Header部份是UUencode,body部份才是MIME,Microsoft這會兒都用MIME編碼!所以大家看到的主旨才會是=?big?B?.......?=,而不是中文字!

  想當初大家都用 Eudora 或 Netscape 收信,都沒什麼問題,主旨使用中文完全沒有問題,遇到中文就用Uuencode,中文完全沒問題;可是Outlook Express一出現,軟微老大他在”主旨”方面的編碼,也給你用Mime格式編碼,大家原本使用的Eudora或Netscape收信,主旨從此就看不到正確的中文字,只看到=Big5.....?=這些亂碼了,被迫得大家非得使用Outlook 或 Outlook Express看信不可。


三、設定方法:
  將 Outlook 信件處理中,信件傳送格式不論是純文字或HTML(預設是HTML格式),MIME格式必須將編碼關掉(不選Quoted Printable或Base 64,要選"無"),且須設定"表頭容許8位元字元";或是乾脆許取選取Uuencode方式;如此便能正常地顯示中文字!
  現在請大家廣為推行,每次設定Outlook時,信件傳送格式若用Mime格式,就不要編碼且須設定"表頭容許8位元字元",或大家乾脆使用Uuencode編碼,讓非Microsoft的信件處理程式,也能順利地看到中文字,不再受軟微老大的壓榨!

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

如jini大大所說,JavaMail API 1.3.1 好像已對此問題做修正,但如果你一定要用舊版的API來做的話,可以參考以下的 code :
            String subject = msg.getHeader("subject")[0];
            if (subject != null) {
                if (subject.indexOf("=?") != -1) {
                    subject = MimeUtility.decodeText(subject);
                }
                else {
                    subject = new String(subject.getBytes("ISO-8859-1"),"big5");
                }
            }

 
不知道你的問題是指寄信時無法寄出正確的內容還是讀信時無法讀出正確的內容,而以上的sample code僅供讀信∼

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

http://www.ietf.org/rfc/rfc2047.txt

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

為什麼我執行這個程式會有錯呢???
Error: 500
Location: /mail.jsp
Internal Servlet Error:

javax.servlet.ServletException
  at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:460)
  at mail_5._jspService(mail_5.java:144)
  at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java)
  at org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:574)
  at org.apache.tomcat.core.Handler.invoke(Handler.java:322)
  at org.apache.tomcat.core.Handler.service(Handler.java:235)
  at org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:485)
  at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:917)
  at org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
  at org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10Interceptor.java:176)
  at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:494)
  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:516)
  at java.lang.Thread.run(Thread.java:534)
Root cause:
java.lang.NullPointerException
  at mail_5._jspService(mail_5.java:86)
  at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java)
  at org.apache.tomcat.facade.ServletHandler.doService(ServletHandler.java:574)
  at org.apache.tomcat.core.Handler.invoke(Handler.java:322)
  at org.apache.tomcat.core.Handler.service(Handler.java:235)
  at org.apache.tomcat.facade.ServletHandler.service(ServletHandler.java:485)
  at org.apache.tomcat.core.ContextManager.internalService(ContextManager.java:917)
  at org.apache.tomcat.core.ContextManager.service(ContextManager.java:833)
  at org.apache.tomcat.modules.server.Http10Interceptor.processConnection(Http10Interceptor.java:176)
  at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:494)
  at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:516)
  at java.lang.Thread.run(Thread.java:534)


--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....
<%@ page language="java" import="java.util.*,java.io.*" %>
<%@ page import="javax.mail.*" %>
<%@ page import="javax.mail.internet.*" %>
<%@ page import="javax.activation.*" %>
<%@ page contentType="text/html; charset=big5"%>

<%!
InternetAddress[] address = null ;
%>
<%

String mailserver = "msk.pchome.com.tw";
String From = request.getParameter("From");
String to = request.getParameter("To");
String Subject = request.getParameter("Subject");
String messageText = request.getParameter("Message");

boolean sessionDebug = false;

try {

// 設定所要用的Mail 伺服器和所使用的傳送協定
java.util.Properties props = System.getProperties();
props.put("mail.host",mailserver);
props.put("mail.transport.protocol","smtp");

// 產生新的Session 服務
javax.mail.Session mailSession = javax.mail.Session.getDefaultInstance(props,null);
mailSession.setDebug(sessionDebug);

Message msg = new MimeMessage(mailSession);

// 設定傳送郵件的發信人
msg.setFrom(new InternetAddress(From));

// 設定傳送郵件至收信人的信箱
address = InternetAddress.parse(to,false);
msg.setRecipients(Message.RecipientType.TO, address);

// 設定信中的主題
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); msg.setSubject("=?GB2312?B?"+enc.encode(Subject.getBytes())+"?=");

// 設定送信的時間
msg.setSentDate(new Date());

// 設定傳送信的MIME Type
msg.setText(messageText);

// 送信
Transport.send(msg);

out.println("郵件己順利傳送");

}
catch (MessagingException mex) {

mex.printStackTrace();
}

%>


-------------------------------------
這個程式寄發email給人啊
內容雖有中文
但是,後面卻出現
豬 ?/tt>
^^^^^
是什麼問題呢???

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

各位高手:
MimeMessage.setSubject(String subject, String charset);

我寫:
Message Msg = new MimeMessage(mailSession);
Msg.setSubject(Subject,"Big5");

仍不能, 不知是否我下錯語法, 懇請回應, 感謝!!

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

你可以show一下你的error message 嗎 ?

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

錯誤訊息如下:
org.apache.jasper.JasperException: Unable to compile class for JSP

An error occurred at line: 10 in the jsp file: /mail.jsp

Generated servlet error:
[javac] Since fork is true, ignoring compiler setting.
[javac] Compiling 1 source file
[javac] Since fork is true, ignoring compiler setting.
[javac] /usr/local/jakarta-tomcat-4.1.24/work/Standalone/localhost/moe/mail_jsp.java:115: setSubject(java.lang.String) in javax.mail.Message cannot be applied to (java.lang.String,java.lang.String)
[javac] Msg.setSubject(Subject,"Big5");
[javac] ^
[javac] 1 error


--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

你確定一下你的javamail版本是否正確 , 找找看setSubject 有沒有支援 setSubject(Subject,encoding) Smile

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

你好, 版本如下:
javamail-1.3.1
jaf-1.0.2
OS:Linux
在安裝後的javaMail的說明文件中,可以找到該語法:
MimeMessage.setSubject(java.lang.String subject, java.lang.String charset)


這樣應代表,是支援的,對吧!?

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

就error mesg 並沒有這一個method 可以用,會不會是你的javamail不是用到那ㄧ個(1.3.1) ?

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

JavaMail有很多不同的版本嗎 - -?
我在我裝好的 JavaMail 的 README.txt 檔案中,看到第一行寫著"JavaMail(TM) API 1.3.1 release"...

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

ally wrote:
snpshu 你好, 版本如下:
javamail-1.3.1
jaf-1.0.2
OS:Linux
在安裝後的javaMail的說明文件中,可以找到該語法:
    MimeMessage.setSubject(java.lang.String subject, java.lang.String charset)


這樣應代表,是支援的,對吧!?



JavaMail 1.3.1 確實沒有
MimeMessage.setSubject(java.lang.String subject, java.lang.String charset)


我猜測你的中文問題是表單傳送資料時
在接收之前,忘了加上
request.setCharacterEncoding("MS950");


--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....
Message Msg = new MimeMessage(mailSession);
^^^^^

你宣告的是 Message class, 不是 MimeMessage class
所以當然不會有 setSubject(subject, charset) 這個method
(我是看1.2 API, 不知道1.3 API有沒有)

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

其實大家可以去看原始碼是如何處理!我也被這問題困擾很久,後來才找出來。

原本使用
Message msg = new MimeMessage(mailSession);
msg.setSubject("中文主題");

改成
msg.setHeader("Subject", MimeUtility.encodeText("中文主題", "big5", null));

只要你的收信軟體是設成 big5,應該可以正常看到。
我是使用 Mozilla 收信,之前測試時應為發信系統標題編碼是MS950,所以都是亂碼。

提供大家參考。

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

ally wrote:
各位高手:
    MimeMessage.setSubject(String subject, String charset);

我寫:
    Message Msg = new MimeMessage(mailSession);
    Msg.setSubject(Subject,"Big5");

仍不能, 不知是否我下錯語法, 懇請回應, 感謝!!

MimeMessage mesg = new MimeMessage(MailSession);

這樣子宣告就可以用了

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....
// 設定傳送信的MIME Type 為 html格式
MimeMultipart mm = new MimeMultipart();
MimeBodyPart mbp = new MimeBodyPart();
mbp.setContent(messageText, "text/html;charset=Big5");
mm.addBodyPart(mbp);
msg.setContent(mm);

用這個方法,信件內容若是以html格式,也會變成中文喔!

--------------------------------------------------------------------------------

Re:JavaMail中文亂碼的問題....

bensu wrote:
原本使用
    Message msg = new MimeMessage(mailSession);
    msg.setSubject("中文主題");

改成
    msg.setHeader("Subject", MimeUtility.encodeText("中文主題", "big5", null));

只要你的收信軟體是設成 big5,應該可以正常看到。
我是使用 Mozilla 收信,之前測試時應為發信系統標題編碼是MS950,所以都是亂碼。

其實,在 Create MimeMessage 前,先設定一下系統參數就不用再去管編碼的問題... ( 這是 JavaMail 1.3 還是 1.2 後才提供的,請看一下 ChangeLog 確定使用中的 JavaMail 版本是否支援! )
  System.setProperty( "mail.mime.charset", "big5" );


另外若是要建立 HTML 信件時,最好記得設定一下 Content Type:
msg.setContent( body, "text/html; charset=big5" );


最近在搞寄信的作業,深覺 M$ Outlook 超喜歡惡搞,而這個責任個人認為是台灣微軟要負責!

在M$ Outlook 2000 中文版中有一個 郵件標幟 的信件屬性,可以讓 Outlook 作為提示之用 ( Reminder ),結果 Outlook 把那個 Mail Header 的值用純 Big5 碼方式輸入,格式像這樣:
Reply-By: Thu, 25 Mar 2004 17:00:00 +0800
X-Message-Flag: 待處理


若是像這樣則 Outlook 不會啟動提示機制,且 Outlook 會出現如附圖的亂碼!
X-Message-Flag: =?big5?B?q92zQrJ6?=
Reply-By: Thu, 25 Mar 2004 11:55:37 +0800 (CST)


為什麼會認為這是台灣微軟的問題呢?
在 M$ Outlook 2003 英文版中的 X-Message-Flag 後面接的是英文訊息,此時若用中、英文版互寄待辦訊息時,很抱歉,兩版本都不會出現時間提示... Confused

另外,Outlook 寄出的信件似乎也不會 Subject 做編碼作業,搞的 Mail Server 常會丟出這個警告:
X-Amavis-Alert: BAD HEADER Non-encoded 8-bit data (char AB hex) in message header 'Subject' Subject: \253\335\263B\262z\n ^


原文出處:JWorld@TW Java論壇 - JavaMail中文亂碼的問題....
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]javaMail 標題亂碼說明及處理

javaMail 標題亂碼說明及處理











原文如下,(作者未知)


使用java mail 包收發中文郵件的編碼,解碼問題以及解決方法












編碼



郵件頭(參見RFC822,RFC2047)只能包含US-ASCII字符。郵件頭中任何包含非US-ASCII字符的部分必須進行編碼,使其只包含US-ASCII字符。所以使用java mail發送中文郵件必須經過編碼,否則別人收到你的郵件只能是亂碼一堆。不過使用java mail 包的解決方法很簡單,用它自帶的MimeUtility工具中encode開頭的方法(如encodeText)對中文信息進行編碼就可以了。



例子:




MimeMessage mimeMsg = new MimeMessage(mailSession);



//讓javamail決定用什麼方式來編碼 ,編碼內容的字符集是系統字符集


mimeMsg.setSubject( MimeUtility.encodeText( Subject) );





//使用指定的base64方式編碼,並指定編碼內容的字符集是gb2312



mimeMsg.setSubject( MimeUtility.encodeText( Subject,”gb2312”,”B”));







通常對郵件頭的編碼方式有2種,一種是base64方式編碼,一種是QP(quoted-printable)方式編碼,javamail根據具體情況來選擇編碼方式。





如“txt測試”編碼後內容如下:



=?GBK?Q?Txt=B2=E2=CA=D4







裡面有個=?GBK?Q?,GBK表示的是內容的字符集,?Q?表示的是以QP方式編碼的,後面緊跟的才是編碼後的中文字符。所以用MimeUtility工具編碼後的信息裡包含了編碼方式的信息。




郵件的正文也要進行編碼,但它不能用MimeUtility裡的方法來編碼。郵件正文的編碼方式的信息是要放在Content-Transfer-Encoding這個郵件頭參數中的,而MimeUtility裡面的方法是將編碼方式的信息放在編碼後的正文內容中。所以如果你對正文也用MimeUtility進行處理,那麼其他郵件程序就不會正常顯示你編碼的郵件,因為其他郵件軟件如outlook,foxmail只會根據Content-Transfer-Encoding這個裡面的信息來對郵件正文進行解碼。



其實,郵件正文部分的編碼javamail已經自動幫你做了,當你發送郵件的時候,它會自己決定編碼方式,並把編碼方式的信息放入Content-Transfer-Encoding這個郵件頭參數中,然後再發送。所以你所要做的就是直接把郵件正文的內容放入郵件中就可以了。



對郵件正文的編碼方式比較多,包括了base64和QP方式,還有一些如7bit,8bit等等,因為javamail自動為郵件正文編碼,所以我就不一一祥敘了。





例子:



//處理郵件正文



MimeBodyPart mbp=new MimeBodyPart();



if ( ContentType() == null || ContentType.equals(""))



mbp.setText( Content );



else



mbp.setContent( Content, Content );








解碼





javamail包中的MimeUtility工具中也提供了對郵件信息解碼的方法,都是以decode開頭的一些方法(如decodeText)



例子:



String Subject = mimemsg.getSubject();



String ChSubject = MimeUtility.decodeText(Subject);



對於base64和QP編碼後信息,decode* 方法能將他們正確的解碼,但是,如果指定的字符集不對,那麼javamail就會出現錯誤,不能正確地將其解碼。



如有的郵件系統將”txt測試”編碼後如下:



=?x-unkown?Q?Txt=B2=E2=CA=D4



這裡指定的字符集是x-unknown,是非明確的字符集,javamail就不能正確的處理了,但是”測試”這兩個中文字還是按照gbk字符集編碼的,所以你可以手工的將編碼方式信息改正確,再用decode*方法來解碼。





例子:



if ( str.indexOf("=?x-unknown?") >=0 ){



str = str.replaceAll("x-unknown","gbk" ); // 將編碼方式的信息由x-unkown改為gbk



try{




str = MimeUtility.decodeText( str ); //再重新解碼



}catch( Exception e1){



return str ;



}



decode*方法都是根據在編碼信息中包含的編碼方式的信息來解碼,所以decode*方法對郵件正文解碼是無效的,因為郵件正文中不包含編碼方式的信息。

同編碼一樣,郵件正文的解碼也是由javamail做了。Javamail根據Content-Transfer-Encoding裡的信息,來對郵件的正文解碼。

客戶程序從javamail取得的正文內容字符集為iso-8859-1,所以還要將字符集轉換一下,例:



String CorrectContent = new String( Content.getbytes(“iso-8859-1”),”gb2312”);



CorrentContent為正確的郵件正文了 。


本人測試了一下,發送郵件時沒有什麼問題,javaMail會自動為你加上編碼信息


接收時發現subject的編碼一般與正文相同,需要做字符串轉換。


相關代碼如下:

        String contenttype = part.getContentType();


        System.out.println("CONTENTTYPE:  " + contenttype);

        int icharset = contenttype.toLowerCase().indexOf("charset");

        if (icharset != -1) {

            System.out.println(contenttype.charAt(icharset + 8));

            if (contenttype.charAt(icharset + 8) == '"') {

                int iend = contenttype.lastIndexOf("\"");

                if (iend > icharset + 9) {


                    bodyCharset = contenttype.substring(icharset + 9, iend);

                }

            }

            else {

                bodyCharset = contenttype.substring(icharset + 8);

            }

        }


取得正文編碼信息。Foxmail發送的郵件一般為text/html;charset="GB2312",其他的為text/html;charset=GB2312,差了一個引號。還有一些郵件沒有編碼信息,此時bodyCharset默認為ISO-8859-1。



            subject = MimeUtility.decodeText(mimeMessage.getSubject());

            if (subject == null) {

                subject = "";

            }

            subject = new String(subject.getBytes(bodyCharset), "GBK");


內容解碼同上。


試了試FoxMail,WEB,javamail等方式發送的郵件,MimeUtility.decodeText(mimeMessage.getSubject())與mimeMessage.getSubject()的值是相等的。





原文出處:javaMail 標題亂碼說明及處理 @ 狼翔天地 :: 痞客邦 ::
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]詳解 Java 程式設計中 JavaMail API 的使用

詳解Java程式設計中JavaMail API的使用

一、JavaMail API簡介

JavaMail API是讀取、撰寫、傳送電子資訊的可選包。我們可用它來建立如Eudora、Foxmail、MS Outlook Express一般的郵件使用者代理程式(Mail User Agent,簡稱MUA)。而不是像sendmail或者其它的郵件傳輸代理(Mail Transfer Agent,簡稱MTA)程式那樣可以傳送、遞送、轉發郵件。從另外一個角度來看,我們這些電子郵件使用者日常用MUA程式來讀寫郵件,而MUA依賴著MTA處理郵件的遞送。

在清楚了到MUA與MTA之間的關係後,讓我們看看JavaMail API是如何提供資訊訪問功能的吧!JavaMail API被設計用於以不依賴協議的方式去傳送和接收電子資訊,這個API被分為兩大部分:

基本功能:如何以不依賴於協議的方式傳送接收電子資訊,這也是本文所要描述的,不過在下文中,大家將看到這只是一廂情願而已。

第二個部分則是依賴特定協議的,比如SMTP、POP、IMAP、NNTP協議。在這部分的JavaMail API是為了和伺服器通訊,並不在本文的內容中。

二、相關協議一覽

在我們步入JavaMail API之前,先看一下API所涉及的協議。以下便是大家日常所知、所樂於使用的4大資訊傳輸協議:

SMTP

POP

IMAP

MIME

當然,上面的4個協議,並不是全部,還有NNTP和其它一些協議可用於傳輸資訊,但是由於不常用到,所以本文便不提及了。理解這4個基本的協議有助於我們更好的使用JavaMail API。然而JavaMail API是被設計為與協議無關的,目前我們並不能克服這些協議的束縛。確切的說,如果我們使用的功能並不被我們選擇的協議支援,那麼JavaMail API並不可能如魔術師一樣神奇的賦予我們這種能力。

1.SMTP


簡單郵件傳輸協議定義了遞送郵件的機制。在下文中,我們將使用基於Java-Mail的程式與公司或者ISP的SMTP伺服器進行通訊。這個SMTP伺服器將郵件轉發到接收者的SMTP伺服器,直至最後被接收者通過POP或者IMAP協議獲取。這並不需要SMTP伺服器使用支援授權的郵件轉發,但是卻的確要注意SMTP伺服器的正確設定(SMTP伺服器的設定與JavaMail API無關)。

2.POP

POP是一種郵局協議,目前為第3個版本,即眾所周知的POP3。POP定義了一種使用者如何獲得郵件的機制。它規定了每個使用者使用一個單獨的郵箱。大多數人在使用POP時所熟悉的功能並非都被支援,例如檢視郵箱中的新郵件數量。而這個功能是微軟的Outlook內建的,那麼就說明微軟Outlook之類的郵件客戶端軟體是通過查詢最近收到的郵件來計算新郵件的數量來實現前面所說的功能。因此在我們使用JavaMail API時需要注意,當需要獲得如前面所講的新郵件數量之類的資訊時,我們不得不自己進行計算。

3.IMAP

IMAP使用在接收資訊的高階協議,目前版本為第4版,所以也被稱為IMAP4。需要注意的是在使用IMAP時,郵件伺服器必須支援該協議。從這個方面講,我們並不能完全使用IMAP來替代POP,不能期待IMAP在任何地方都被支援。假如郵件伺服器支援IMAP,那麼我們的郵件程式將能夠具有以下被 IMAP所支援的特性:每個使用者在伺服器上可具有多個目錄,這些目錄能在多個使用者之間共享。

其與POP相比高階之處顯而易見,但是在嘗試採取IMAP時,我們認識到它並不是十分完美的:由於IMAP需要從其它伺服器上接收新資訊,將這些資訊遞送給使用者,維護每個使用者的多個目錄,這都為郵件伺服器帶來了高負載。並且IMAP與POP的一個不同之處是POP使用者在接收郵件時將從郵件伺服器上下載郵件,而IMAP允許使用者直接訪問郵件目錄,所以在郵件伺服器進行備份作業時,由於每個長期使用此郵件系統的使用者所用的郵件目錄會佔有很大的空間,這將直接導致郵件伺服器上磁碟空間暴漲。

4.MIME


MIME並不是用於傳送郵件的協議,它作為多用途郵件的擴充套件定義了郵件內容的格式:資訊格式、附件格式等等。一些RFC標準都涉及了MIME:RFC 822, RFC 2045, RFC 2046, RFC 2047,有興趣的Matrixer可以閱讀一下。而作為JavaMail API的開發者,我們並不需關心這些格式定義,但是這些格式被用在了程式中。

5.NNTP和其它的第三方協議

正因為JavaMail API在設計時考慮到與第三方協議實現提供商之間的分離,故我們可以很容易的新增一些第三方協議。SUN維護著一個第三方協議實現提供商的列表:http://java.sun.com/products/javamail/Third_Party.html,通過此列表我們可以找到所需要的而又不被SUN提供支援的第三方協議:比如NNTP這個新聞組協議和S/MIME這個安全的MIME協議。

三、安裝

1.安裝JavaMail

為了使用JavaMail API,需要從http://java.sun.com/products/javamail/downloads/index.html下載檔名格式為javamail-[version].zip的檔案(這個檔案中包括了JavaMail實現),並將其中的mail.jar檔案新增到CLASSPATH中。這個實現提供了對SMTP、IMAP4、POP3的支援。

注意:在安裝JavaMail實現之後,我們將在demo目錄中發現許多有趣的簡單例項程式。

在安裝了JavaMail之後,我們還需要安裝JavaBeans Activation Framework,因為這個框架是JavaMail API所需要的。如果我們使用J2EE的話,那麼我們並無需單獨下載JavaMail,因為它存在於J2EE.jar中,只需將J2EE.jar加入到CLASSPATH即可。

2.安裝JavaBeans Activation Framework


http://java.sun.com/products/javabeans/glasgow/jaf.html下載JavaBeans Activation Framework,並將其新增到CLASSPATH中。此框架增加了對任何資料塊的分類、以及對它們的處理的特性。這些特性是JavaMail API需要的。雖然聽起來這些特性非常模糊,但是它對於我們的JavaMail API來說只是提供了基本的MIME型別支援。

到此為止,我們應當把mail.jar和activation.jar都新增到了CLASSPATH中。

當然如果從方便的角度講,直接把這兩個Jar檔案複製到JRE目錄的lib/ext目錄中也可以。

四、初次認識JavaMail API

1.瞭解我們的JavaMail環境

A.縱覽JavaMail核心類結構

開啟JavaMail.jar檔案,我們將發現在javax.mail的包下面存在著一些核心類:Session、Message、Address、 Authenticator、Transport、Store、Folder。而且在javax.mail.internet包中還有一些常用的子類。

B.Session

Session類定義了基本的郵件會話。就像Http會話那樣,我們進行收發郵件的工作都是基於這個會話的。Session物件利用了java.util.Properties物件獲得了郵件伺服器、使用者名稱、密碼資訊和整個應用程式都要使用到的共享資訊。

Session類的構造方法是私有的,所以我們可以使用Session類提供的getDefaultInstance()這個靜態工廠方法獲得一個預設的Session物件:



Properties props = new Properties();
// fill props with any information
Session session = Session.getDefaultInstance(props, null);

或者使用getInstance()這個靜態工廠方法獲得自定義的Session:



Properties props = new Properties();
// fill props with any information
Session session = Session.getInstance(props, null);

從上面的兩個例子中不難發現,getDefaultInstance()和getInstance()方法的第二個引數都是null,這是因為在上面的例子中並沒有使用到郵件授權,下文中將對授權進行詳細介紹。

從很多的例項看,在對mail server進行訪問的過程中使用共享的Session是足夠的,即使是工作在多個使用者郵箱的模式下也不例外。

C.Message

當我們建立了Session物件後,便可以被髮送的構造資訊體了。在這裡SUN提供了Message型別來幫助開發者完成這項工作。由於Message是一個抽象類,大多數情況下,我們使用javax.mail.internet.MimeMessage這個子類,該類是使用MIME型別、MIME資訊頭的郵箱資訊。資訊頭只能使用US-ASCII字元,而非ASCII字元將通過編碼轉換為ASCII的方式使用。

為了建立一個MimeMessage物件,我們必須將Session物件作為MimeMessage構造方法的引數傳入:

MimeMessage message = new MimeMessage(session);

注意:對於MimeMessage類來講存在著多種構造方法,比如使用輸入流作為引數的構造方法。

在建立了MimeMessage物件後,我們需要設定它的各個part,對於MimeMessage類來說,這些part就是MimePart介面。最基本的設定資訊內容的方法就是通過表示資訊內容和米麼型別的引數呼叫setContent()方法:



message.setContent("Hello", "text/plain");

然而,如果我們所使用的MimeMessage中資訊內容是文字的話,我們便可以直接使用setText()方法來方便的設定文字內容。



message.setText("Hello");

前面所講的兩種方法,對於文字資訊,後者更為合適。而對於其它的一些資訊型別,比如HTML資訊,則要使用前者。

別忘記了,使用setSubject()方法對郵件設定郵件主題:



message.setSubject("First");

D.Address

到這裡,我們已經建立了Session和Message,下面將介紹如何使用郵件地址類:Address。像Message一樣,Address類也是一個抽象類,所以我們將使用javax.mail.internet.InternetAddress這個子類。

通過傳入代表郵件地址的字串,我們可以建立一個郵件地址類:



Address address = new InternetAddress("president@whitehouse.gov");

如果要在郵件地址後面增加名字的話,可以通過傳遞兩個引數:代表郵件地址和名字的字串來建立一個具有郵件地址和名字的郵件地址類:



Address address = new InternetAddress("president@whitehouse.gov", "George Bush");

本文在這裡所講的郵件地址類是為了設定郵件資訊的發信人和收信人而準備的,在建立了郵件地址類後,我們通過message的setFrom()和setReplyTo()兩種方法設定郵件的發信人:



message.setFrom(address);message.setReplyTo(address);

若在郵件中存在多個發信人地址,我們可用addForm()方法增加發信人:



Address address[] = ...;message.addFrom(address);

為了設定收信人,我們使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量來區分收信人的型別:



message.addRecipient(type, address)

下面是Message.RecipientType的三個常量:



Message.RecipientType.TO
Message.RecipientType.CC
Message.RecipientType.BCC

因此,如果我們要傳送郵件給總統,併發用一個副本給第一夫人的話,下面的方法將被用到:



Address toAddress = new InternetAddress(vice.president@whitehouse.gov);
Address ccAddress = new InternetAddress(first.lady@whitehouse.gov);
message.addRecipient(Message.RecipientType.TO, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);

JavaMail API並沒有提供檢查郵件地址有效性的機制。當然我們可以自己完成這個功能:驗證郵件地址的字元是否按照RFC822規定的格式書寫或者通過DNS伺服器上的MX記錄驗證等。

E.Authenticator

像java.net類那樣,JavaMail API通過使用授權者類(Authenticator)以使用者名稱、密碼的方式訪問那些受到保護的資源,在這裡“資源”就是指郵件伺服器。在javax.mail包中可以找到這個JavaMail的授權者類(Authenticator)。

在使用Authenticator這個抽象類時,我們必須採用繼承該抽象類的方式,並且該繼承類必須具有返回PasswordAuthentication物件(用於儲存認證時要用到的使用者名稱、密碼)getPasswordAuthentication()方法。並且要在Session中進行註冊,使Session能夠了解在認證時該使用哪個類。

下面程式碼片斷中的MyAuthenticator就是一個Authenticator的子類。



Properties props = new Properties();
// fill props with any information
Authenticator auth = new MyAuthenticator();
Session session = Session.getDefaultInstance(props, auth);

F.Transport
在傳送資訊時,Transport類將被用到。這個類實現了傳送資訊的協議(通稱為SMTP),此類是一個抽象類,我們可以使用這個類的靜態方法send()來傳送訊息:



Transport.send(message);

當然,方法是多樣的。我們也可由Session獲得相應協議對應的Transport例項。並通過傳遞使用者名稱、密碼、郵件伺服器主機名等引數建立與郵件伺服器的連線,並使用sendMessage()方法將資訊傳送,最後關閉連線:



message.saveChanges();
// implicit with send()
Transport transport = session.getTransport("smtp");
transport.connect(host, username, password);
transport.sendMessage(message, message.getAllRecipients());
transport.close();

評論:上面的方法是一個很好的方法,尤其是在我們在同一個郵件伺服器上傳送多個郵件時。因為這時我們將在連線郵件伺服器後連續傳送郵件,然後再關閉掉連線。send()這個基本的方法是在每次呼叫時進行與郵件伺服器的連線的,對於在同一個郵件伺服器上傳送多個郵件來講可謂低效的方式。
注意:如果需要在傳送郵件過程中監控mail命令的話,可以在傳送前設定debug標誌:
session.setDebug(true)。

G.Store和Folder
接收郵件和傳送郵件很類似都要用到Session。但是在獲得Session後,我們需要從Session中獲取特定型別的Store,然後連線到 Store,這裡的Store代表了儲存郵件的郵件伺服器。在連線Store的過程中,極有可能需要用到使用者名稱、密碼或者Authenticator。



// Store store = session.getStore("imap");
Store store = session.getStore("pop3");
store.connect(host, username, password);

在連線到Store後,一個Folder物件即目錄物件將通過Store的getFolder()方法被返回,我們可從這個Folder中讀取郵件資訊:



Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();

上面的例子首先從Store中獲得INBOX這個Folder(對於POP3協議只有一個名為INBOX的Folder有效),然後以只讀(Folder.READ_ONLY)的方式開啟Folder,最後呼叫Folder的getMessages()方法得到目錄中所有Message的陣列。

注意:對於POP3協議只有一個名為INBOX的Folder有效,而對於IMAP協議,我們可以訪問多個Folder(想想前面講的IMAP協議)。而且SUN在設計Folder的getMessages()方法時採取了很智慧的方式:首先接收新郵件列表,然後再需要的時候(比如讀取郵件內容)才從郵件伺服器讀取郵件內容。
在讀取郵件時,我們可以用Message類的getContent()方法接收郵件或是writeTo()方法將郵件儲存,getContent()方法只接收郵件內容(不包含郵件頭),而writeTo()方法將包括郵件頭。



System.out.println(((MimeMessage)message).getContent());

在讀取郵件內容後,別忘記了關閉Folder和Store。



folder.close(aBoolean);
store.close();

傳遞給Folder.close()方法的boolean 型別參數列示是否在刪除操作郵件後更新Folder。

H.繼續向前進!
在講解了以上的七個Java Mail核心類定義和理解了簡單的程式碼片斷後,下文將詳細講解怎樣使用這些類實現JavaMail API所要完成的高階功能。

五、使用JavaMail API
在明確了JavaMail API的核心部分如何工作後,本人將帶領大家學習一些使用Java Mail API任務案例。
1.傳送郵件
在獲得了Session後,建立並填入郵件資訊,然後傳送它到郵件伺服器。這便是使用Java Mail API傳送郵件的過程,在傳送郵件之前,我們需要設定SMTP伺服器:通過設定Properties的mail.smtp.host屬性。



String host = ...;
String from = ...;
String to = ...;
// Get system properties
Properties props = System.getProperties();
// Setup mail server
props.put("mail.smtp.host", host);
// Get session
Session session = Session.getDefaultInstance(props, null);
// Define message
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Hello JavaMail");
message.setText("Welcome to JavaMail");
// Send message
Transport.send(message);

由於建立郵件資訊和傳送郵件的過程中可能會丟擲異常,所以我們需要將上面的程式碼放入到try-catch結構塊中。

2.接收郵件
為了在讀取郵件,我們獲得了session,並且連線到了郵箱的相應store,開啟相應的Folder,然後得到我們想要的郵件,當然別忘記了在結束時關閉連線。



String host = ...;
String username = ...;
String password = ...;
// Create empty properties
Properties props = new Properties();
// Get session
Session session = Session.getDefaultInstance(props, null);
// Get the store
Store store = session.getStore("pop3");
store.connect(host, username, password);
// Get folder
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_ONLY);
// Get directory
Message message[] = folder.getMessages();

上面的程式碼所作的是從郵箱中讀取每個郵件,並且顯示郵件的發信人地址和主題。從技術角度講,這裡存在著一個異常的可能:當發信人地址為空時,getFrom()[0]將丟擲異常。

下面的程式碼片斷有效的說明了如何讀取郵件內容,在顯示每個郵件發信人和主題後,將出現使用者提示從而得到使用者是否讀取該郵件的確認,如果輸入YES的話,我們可用Message.writeTo(java.io.OutputStream os)方法將郵件內容輸出到控制檯上,關於Message.writeTo()的具體用法請看JavaMail API。



BufferedReader reader = new BufferedReader ( new InputStreamReader(System.in));
// Get directory
Message message[] = folder.getMessages();

3.刪除郵件和標誌
設定與message相關的Flags是刪除郵件的常用方法。這些Flags表示了一些系統定義和使用者定義的不同狀態。在Flags類的內部類Flag中預定義了一些標誌:

Flags.Flag.ANSWERED
Flags.Flag.DELETED
Flags.Flag.DRAFT
Flags.Flag.FLAGGED
Flags.Flag.RECENT
Flags.Flag.SEEN
Flags.Flag.USER

但需要在使用時注意的:標誌存在並非意味著這個標誌被所有的郵件伺服器所支援。例如,對於刪除郵件的操作,POP協議不支援上面的任何一個。所以要確定哪些標誌是被支援的??通過訪問一個已經開啟的Folder物件的getPermanetFlags()方法,它將返回當前被支援的Flags類物件。

刪除郵件時,我們可以設定郵件的DELETED標誌:
message.setFlag(Flags.Flag.DELETED, true);
但是首先要採用READ_WRITE的方式開啟Folder:
folder.open(Folder.READ_WRITE);
在對郵件進行刪除操作後關閉Folder時,需要傳遞一個true作為對刪除郵件的擦除確認。
folder.close(true);
Folder類中另一種用於刪除郵件的方法expunge()也同樣可刪除郵件,但是它並不為sun提供的POP3實現支援,而其它第三方提供的POP3實現支援或者並不支援這種方法。
另外,介紹一種檢查某個標誌是否被設定的方法:Message.isSet(Flags.Flag flag)方法,其中引數為被檢查的標誌。


4.郵件認證
我們在前面已經學會了如何使用Authenticator類來代替直接使用使用者名稱和密碼這兩字串作為 Session.getDefaultInstance()或者Session.getInstance()方法的引數。在前面的小試牛刀後,現在我們將瞭解到全面認識一下郵件認證。
我們在此取代了直接使用郵件伺服器主機名、使用者名稱、密碼這三個字串作為連線到POP3 Store的方式,使用儲存了郵件伺服器主機名資訊的屬性檔案,並在獲得Session時傳入自定義的Authenticator例項:



// Setup properties
Properties props = System.getProperties();
props.put("mail.pop3.host", host);
// Setup authentication, get session
Authenticator auth = new PopupAuthenticator();
Session session = Session.getDefaultInstance(props, auth);
// Get the store
Store store = session.getStore("pop3");
store.connect();

PopupAuthenticator類繼承了抽象類Authenticator,並且通過過載Authenticator類的getPasswordAuthentication()方法返回PasswordAuthentication類物件。而getPasswordAuthentication()方法的引數param是以逗號分割的使用者名稱、密碼組成的字串。



import javax.mail.*;
import java.util.*;
public class PopupAuthenticator extends Authenticator {
public PasswordAuthentication getPasswordAuthentication(String param)
{ String username, password;
StringTokenizer st = new StringTokenizer(param, ",");
username = st.nextToken();
password = st.nextToken();
return new PasswordAuthentication(username, password);
}}

5.回覆郵件
回覆郵件的方法很簡單:使用Message類的reply()方法,通過配置回覆郵件的收件人地址和主題(如果沒有提供主題的話,系統將預設將“Re:” 作為郵件的主體),這裡不需要設定任何的郵件內容,只要複製發信人或者reply-to到新的收件人。而reply()方法中的boolean參數列示是否將郵件回覆給傳送者(引數值為false),或是恢復給所有人(引數值為true)。
補充一下,reply-to地址需要在發信時使用setReplyTo()方法設定。



MimeMessage reply = (MimeMessage)message.reply(false);
reply.setFrom(new InternetAddress(president@whitehouse.gov);
reply.setText("Thanks");
Transport.send(reply);

6.轉發郵件
轉發郵件的過程不如前面的回覆郵件那樣簡單,它將建立一個轉發郵件,這並非一個方法就能做到。
每個郵件是由多個部分組成,每個部分稱為一個郵件體部分,是一個BodyPart類物件,對於MIME型別郵件來講就是MimeBodyPart類物件。這些郵件體包含在成為Multipart的容器中對於MIME型別郵件來講就是MimeMultiPart類物件。在轉發郵件時,我們建立一個文字郵件體部分和一個被轉發的文字郵件體部分,然後將這兩個郵件體放到一個Multipart中。說明一下,複製一個郵件內容到另一個郵件的方法是僅複製它的 DataHandler(資料處理者)即可。這是由JavaBeans Activation Framework定義的一個類,它提供了對郵件內容的操作命令的訪問、管理了郵件內容操作,是不同的資料來源和資料格式之間的一致性介面。



// Create the message to forward
Message forward = new MimeMessage(session);
// Fill in header
forward.setSubject("Fwd: " message.getSubject());
forward.setFrom(new InternetAddress(from));
forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Create your new message part
BodyPart messageBodyPart = new MimeBodyPart();messageBodyPart.setText("Here you go with the original message:\n\n");
// Create a multi-part to combine the parts
Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);
// Create and fill part for the forwarded content
messageBodyPart = new MimeBodyPart();
messageBodyPart.setDataHandler(message.getDataHandler());
// Add part to multi part
multipart.addBodyPart(messageBodyPart);
// Associate multi-part with message
forward.setContent(multipart);
// Send message
Transport.send(forward);

7.使用附件
附件作為與郵件相關的資源經常以文字、表格、圖片等格式出現,如流行的郵件客戶端一樣,我們可以用JavaMail API從郵件中獲取附件或是傳送帶有附件的郵件。

A.傳送帶有附件的郵件
傳送帶有附件的郵件的過程有些類似轉發郵件,我們需要建立一個完整郵件的各個郵件體部分,在第一個部分(即我們的郵件內容文字)後,增加一個具有DataHandler的附件而不是在轉發郵件時那樣複製第一個部分的DataHandler。

如果我們將檔案作為附件傳送,那麼要建立FileDataSource型別的物件作為附件資料來源;如果從URL讀取資料作為附件傳送,那麼將要建立URLDataSource型別的物件作為附件資料來源。

然後將這個資料來源(FileDataSource或是URLDataSource)物件作為DataHandler類構造方法的引數傳入,從而建立一個DataHandler物件作為資料來源的DataHandler。

接著將這個DataHandler設定為郵件體部分的DataHandler。這樣就完成了郵件體與附件之間的關聯工作,下面的工作就是BodyPart的setFileName()方法設定附件名為原檔名。

最後將兩個郵件體放入到Multipart中,設定郵件內容為這個容器Multipart,傳送郵件。



// Define message
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.setSubject("Hello JavaMail Attachment");
// Create the message part BodyPart
messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText("Pardon Ideas");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
// Part two is attachment
messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multipart.addBodyPart(messageBodyPart);
// Put parts in message
message.setContent(multipart);
// Send the message
Transport.send(message);

如果我們使用servlet實現傳送帶有附件的郵件,則必須上傳附件給servlet,這時需要注意提交頁面form中對編碼型別的設定應為multipart/form-data。
   

B.讀取郵件中的附件
讀取郵件中的附件的過程要比傳送它的過程複雜一點。因為帶有附件的郵件是多部分組成的,我們必須處理每一個部分獲得郵件的內容和附件。
但是如何辨別郵件資訊內容和附件呢?Sun在Part類(BodyPart類實現的介面類)中提供了getDisposition()方法讓開發者獲得郵件體部分的部署型別,當該部分是附件時,其返回之將是Part.ATTACHMENT。但附件也可以沒有部署型別的方式存在或者部署型別為 Part.INLINE,無論部署型別為Part.ATTACHMENT還是Part.INLINE,我們都能把該郵件體部分匯出儲存。



Multipart mp = (Multipart)message.getContent();
for (int i=0, n=multipart.getCount();

下列程式碼中使用了saveFile方法是自定義的方法,它根據附件的檔名建立一個檔案,如果本地磁碟上存在名為附件的檔案,那麼將在檔名後增加數字表示區別。然後從郵件體中讀取資料寫入到本地檔案中(程式碼省略)。



// from saveFile()
File file = new File(filename);
for (int i=0; file.exists(); i )
{ file = new File(filename i);}

以上是郵件體部分被正確設定的簡單例子,如果郵件體部分的部署型別為null,那麼我們通過獲得郵件體部分的MIME型別來判斷其型別作相應的處理,程式碼結構框架如下:



if (disposition == null) {
// Check if plain
MimeBodyPart mbp = (MimeBodyPart)part;
if (mbp.isMimeType("text/plain")) {
// Handle plain
} else {
// Special non-attachment cases here of
// image/gif, text/html,
... }...}

8.處理HTML郵件
前面的例子中傳送的郵件都是以文字為內容的(除了附件),下面將介紹如何接收和傳送基於HTML的郵件。
A.傳送HTML郵件
假如我們需要傳送一個HTML檔案作為郵件內容,並使郵件客戶端在讀取郵件時獲取相關的圖片或者文字的話,只要設定郵件內容為html程式碼,並設定內容型別為text/html即可:



String htmlText = "
Hello
" "";
message.setContent(htmlText, "text/html"));

請注意:這裡的圖片並不是在郵件中內嵌的,而是在URL中定義的。郵件接收者只有線上時才能看到。
在接收郵件時,如果我們使用JavaMail API接收郵件的話是無法實現以HTML方式顯示郵件內容的。因為JavaMail API郵件內容視為二進位制流。所以要顯示HTML內容的郵件,我們必須使用JEditorPane或者第三方HTML展現元件。

以下程式碼顯示瞭如何使用JEditorPane顯示郵件內容:



if (message.getContentType().equals("text/html"))
{ String content = (String)message.getContent();
JFrame frame = new JFrame();
JEditorPane text = new JEditorPane("text/html", content);
text.setEditable(false);
JScrollPane pane = new JScrollPane(text);
frame.getContentPane().add(pane);
frame.setSize(300, 300);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.show();}

B.在郵件中包含圖片
如果我們在郵件中使用HTML作為內容,那麼最好將HTML中使用的圖片作為郵件的一部分,這樣無論是否線上都會正確的顯示HTML中的圖片。處理方法就是將HTML中用到的圖片作為郵件附件並使用特殊的cid URL作為圖片的引用,這個cid就是對圖片附件的Content-ID頭的引用。
處理內嵌圖片就像向郵件中新增附件一樣,不同之處在於我們必須通過設定圖片附件所在的郵件體部分的header中Content-ID為一個隨機字串,並在HTML中img的src標記中設定為該字串。這樣就完成了圖片附件與HTML的關聯。



String file = ...;
// Create the message
Message message = new MimeMessage(session);
// Fill its headers
message.setSubject("Embedded Image");
message.setFrom(new InternetAddress(from));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
// Create your new message partBodyPart
messageBodyPart = new MimeBodyPart();
String htmlText = "
Hello
" "";
messageBodyPart.setContent(htmlText, "text/html");
// Create a related multi-part to combine the parts
MimeMultipart multipart = new MimeMultipart("related");
multipart.addBodyPart(messageBodyPart);
// Create part for the image
messageBodyPart = new MimeBodyPart();
// Fetch the image and associate to part
DataSource fds = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(fds));
messageBodyPart.setHeader("Content-ID","");
// Add part to multi-part
multipart.addBodyPart(messageBodyPart);
// Associate multi-part with message
message.setContent(multipart);

9.在郵件中搜尋短語
JavaMail API提供了過濾器機制,它被用來建立搜尋短語。這個短語由javax.mail.search包中的SearchTerm抽象類來定義,在定義後我們便可以使用Folder的Search()方法在Folder中查詢郵件:
SearchTerm st = …;Message[] msgs = folder.search(st);
下面有22個不同的類(繼承了SearchTerm類)供我們使用:

AND terms (class AndTerm)
OR terms (class OrTerm)
NOT terms (class NotTerm)
SENT DATE terms (class SentDateTerm)
CONTENT terms (class BodyTerm)
HEADER terms (FromTerm / FromStringTerm, RecipientTerm / RecipientStringTerm, SubjectTerm, etc.)

使用這些類定義的斷語集合,我們可以構造一個邏輯表示式,並在Folder中進行搜尋。下面是一個例項:在Folder中搜尋郵件主題含有“ADV”字串或者發信人地址為friend@public.com的郵件。



SearchTerm st = new OrTerm( new SubjectTerm("ADV:"), new FromStringTerm("friend@public.com"));Message[] msgs = folder.search(st);

六、POP3協議判斷新郵件
POP3無法判斷某一封郵件是否已讀,雖然JavaMail的某些類中也有這樣的方法,但是這些方法只是在使用IMAP的時候有效,為了使JavaMail針對不同協議有統一的介面,因此它包容著不同協議的功能,是一套抽象的關於郵件系統的API。舉個例子,Folder類中關於新郵件的幾個方法對POP3協議都是無效的。既然無效我們怎麼解決在使用POP3協議的時候判斷是否為新郵件的這樣一個要求呢?——我們必須在客戶端做點手腳。

一個郵件伺服器在處理每封郵件的時候會給它分配一個獨一無二的編號(UID),這個編號是一個正的長整數,一般這是一個遞增的值,有關於這個UID可以參照RFC 2060的詳細說明。利用這個UID我們就可以實現郵件的讀狀態的處理。首先我們必須在客戶端儲存一個一對多的關係表,也就是一個郵箱地址對應多個郵件的UID,以後在收取每封郵件的時候判斷該郵件的UID是否已經在本地儲存,如果已儲存則該郵件已讀,否則的話這是一封新郵件,並把該新郵件的UID加入本地繼續儲存。可能你會覺得這樣的話豈不是要儲存很多郵件的編號,會不會佔用空間之類的懷疑,我想這應該是一個權宜之策,不過UID僅僅是一個長整數,浪費不了多大的空間。

在獲取郵件UID的時候還需要有一個注意的地方不再囉嗦,請看下面程式片斷中的紅色粗體字。



URLName url = new URLName("pop3", host, port, "", user, passWord);
session session = Session.getInstance(System.getPRoperties(),null);
Store store = session.getStore(url);
POP3Folder inbox = null;
try {
store.connect();
inbox = (POP3Folder) store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
FetchProfile profile = new FetchProfile();
profile.add(UIDFolder.FetchProfileItem.UID);
profile.add(FetchProfile.Item.ENVELOPE);
Message[] messages = inbox.getMessages();
inbox.fetch(messages, profile);
int j = messages.length - 1;
for (int i = 0; i < messages.length; i ,j--)
System.out.println(inbox.getUID(messages[i]));
} finally {
try{
inbox.close(false);
}catch(Exception e){}
try{
store.close();
}catch(Exception e){}
}


原文出處:詳解Java程式設計中JavaMail API的使用 │ 程式前沿
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]JavaMail 郵件開發

JavaMail郵件開發

(api + 配置)

開發中,郵件的應用?

-à 註冊,填寫生日; 後期系統會自動傳送生日祝賀

-à 發貨,發貨提醒!郵件提醒!

郵件:

1.發郵件;【程式中如何發郵件!】

2.收郵件;【很多客戶端工具, foxmail 】

郵件開發準備:

準備工作, 環境搭建:

1. 本地搭建一個郵件伺服器

-à 易郵伺服器,eyoumailserversetup.exe

2. 新建郵箱賬號

張三給李四發郵件。

步驟1:

新建域名: 工具, 伺服器設定, 單域名框中輸入 itcast.com

步驟2:

新建郵箱賬號: zhangsan@itcast.com、 lisi@itcast.com

3. 安裝foxmail

配置郵件傳送伺服器(smtp): localhost 25

郵件接收伺服器(pop3): localhost 110

再新建賬號,就可以接收郵件了!



郵件開發之普通郵件:

JavaMail開發,先引入jar檔案:


activation.jar 【如果使用jdk1.6或以上版本,可以不用這個jar檔案】

mail.jar 【郵件傳送核心包】


package cn.itcast.mail;
import java.util.Date;
import java.util.Properties;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeMessage.RecipientType;
import org.junit.Test;
/**
* 1. 傳送一封普通郵件
* @author Jie.Yuan
*
*/
public class App_1SendMail {
@Test
public void testSend() throws Exception {
//0. 郵件引數
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定協議
prop.put("mail.smtp.host", "localhost"); // 主機 stmp.qq.com
prop.put("mail.smtp.port", 25); // 埠
prop.put("mail.smtp.auth", "true"); // 使用者密碼認證
prop.put("mail.debug", "true"); // 除錯模式
//1. 建立一個郵件的會話
Session session = Session.getDefaultInstance(prop);
//2. 建立郵件體物件 (整封郵件物件)
MimeMessage message = new MimeMessage(session);
//3. 設定郵件體引數:
//3.1 標題
message.setSubject("我的第一封郵件 ");
//3.2 郵件傳送時間
message.setSentDate(new Date());
//3.3 發件人
message.setSender(new InternetAddress("zhangsan@itcast.com"));
//3.4 接收人
message.setRecipient(RecipientType.TO, new InternetAddress("lisi@itcast.com"));
//3.5內容
//message.setText("你好,已經發送成功! 正文...."); // 簡單純文字郵件
// 郵件中含有超連結
//message.setText("百度");
message.setContent("百度", "text/html;charset=UTF-8");
message.saveChanges(); // 儲存郵件(可選)
//4. 傳送
Transport trans = session.getTransport();
trans.connect("zhangsan", "123");
// 傳送郵件
trans.sendMessage(message, message.getAllRecipients());
trans.close();
}
}
Junit測試資訊:
DEBUG: JavaMail version 1.4.1
DEBUG: not loading file: C:\myclipse\binary\com.sun.java.jdk8.win32.x86_64_1.8.0.v112\jre\lib\javamail.providers
DEBUG: java.io.FileNotFoundException: C:\myclipse\binary\com.sun.java.jdk8.win32.x86_64_1.8.0.v112\jre\lib\javamail.providers (系統找不到指定的檔案。)
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.providers
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc],
com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc],
com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc],
com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc],
com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc],
com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc],
imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc],
smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc],
pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc],
pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc],
smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.address.map
DEBUG: not loading file: C:\myclipse\binary\com.sun.java.jdk8.win32.x86_64_1.8.0.v112\jre\lib\javamail.address.map
DEBUG: java.io.FileNotFoundException: C:\myclipse\binary\com.sun.java.jdk8.win32.x86_64_1.8.0.v112\jre\lib\javamail.address.map (系統找不到指定的檔案。)
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "localhost", port 25, isSSL false
220 ESMTP 易郵郵件伺服器 5.2.2004.02.18 SMTP Service Ready
DEBUG SMTP: connected to host "localhost", port: 25
EHLO I0QZ95XPAAXLPJP
250-AUTH=LOGIN
250 AUTH LOGIN
DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 VXNlcm5hbWU6
emhhbmdzYW4=
334 UGFzc3dvcmQ6
MTIz
235 OK
DEBUG SMTP: use8bit false
MAIL FROM:<zhangsan@itcast.com>
250 OK
RCPT TO:<lisi@itcast.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP: lisi@itcast.com
DATA
354 send the mail data, end with .
Date: Tue, 28 Nov 2017 23:30:42 +0800 (CST)
Sender: lisi@itcast.com
To: lisi@itcast.com
Message-ID: <1617791695.0.1511883042518.JavaMail.Administrator@I0QZ95XPAAXLPJP>
Subject: =?GBK?B?ztK1xLXa0ru34tPKvP4J?=
MIME-Version: 1.0
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: quoted-printable
=E7=99=BE=E5=BA=A6
.
250
QUIT
221 SMTP SERVICE CLOSED



郵件開發之帶圖片 App_2SendWithImg.java
package cn.itcast.mail;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeMessage.RecipientType;
import org.junit.Test;
/**
* 帶圖片資源的郵件
* @author Jie.Yuan
*
*/
public class App_2SendWithImg {
// 初始化引數
private static Properties prop;
// 發件人
private static InternetAddress sendMan = null;
static {
prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定協議
prop.put("mail.smtp.host", "localhost"); // 主機 stmp.qq.com
prop.put("mail.smtp.port", 25); // 埠
prop.put("mail.smtp.auth", "true"); // 使用者密碼認證
prop.put("mail.debug", "true"); // 除錯模式
try {
sendMan = new InternetAddress("zhangsan@itcast.com");
} catch (AddressException e) {
throw new RuntimeException(e);
}
}
@Test
public void testSend() throws Exception {
// 1. 建立郵件會話
Session session = Session.getDefaultInstance(prop);
// 2. 建立郵件物件
MimeMessage message = new MimeMessage(session);
// 3. 設定引數:標題、發件人、收件人、傳送時間、內容
message.setSubject("帶圖片郵件");
message.setSender(sendMan);
message.setRecipient(RecipientType.TO, new InternetAddress("zhangsan@itcast.com"));
message.setSentDate(new Date());
/***************設定郵件內容: 多功能使用者郵件 (related)*******************/
// 4.1 構建一個多功能郵件塊
MimeMultipart related = new MimeMultipart("related");
// 4.2 構建多功能郵件塊內容 = 左側文字 + 右側圖片資源
MimeBodyPart content = new MimeBodyPart();
MimeBodyPart resource = new MimeBodyPart();
// 設定具體內容: a.資源(圖片)
String filePath = App_2SendWithImg.class.getResource("8.jpg").getPath();
DataSource ds = new FileDataSource(new File(filePath));
DataHandler handler = new DataHandler(ds);
resource.setDataHandler(handler);
resource.setContentID("8.jpg"); // 設定資源名稱,給外來鍵引用
// 設定具體內容: b.文字
content.setContent(" 好哈哈!", "text/html;charset=UTF-8");
related.addBodyPart(content);
related.addBodyPart(resource);
/*******4.3 把構建的複雜郵件快,新增到郵件中********/
message.setContent(related);
// 5. 傳送
Transport trans = session.getTransport();
trans.connect("zhangsan", "123");
trans.sendMessage(message, message.getAllRecipients());
trans.close();
}
}


郵件開發之帶圖片 + 附件App_3ImgAndAtta.java
package cn.itcast.mail;
import java.io.File;
import java.util.Date;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeMessage.RecipientType;
import org.junit.Test;
/**
* 3. 帶圖片資源以及附件的郵件
* @author Jie.Yuan
*
*/
public class App_3ImgAndAtta {
// 初始化引數
private static Properties prop;
// 發件人
private static InternetAddress sendMan = null;
static {
prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定協議
prop.put("mail.smtp.host", "localhost"); // 主機 stmp.qq.com
prop.put("mail.smtp.port", 25); // 埠
prop.put("mail.smtp.auth", "true"); // 使用者密碼認證
prop.put("mail.debug", "true"); // 除錯模式
try {
sendMan = new InternetAddress("zhangsan@itcast.com");
} catch (AddressException e) {
throw new RuntimeException(e);
}
}
@Test
public void testSend() throws Exception {
// 1. 建立郵件會話
Session session = Session.getDefaultInstance(prop);
// 2. 建立郵件物件
MimeMessage message = new MimeMessage(session);
// 3. 設定引數:標題、發件人、收件人、傳送時間、內容
message.setSubject("帶圖片郵件");
message.setSender(sendMan);
message.setRecipient(RecipientType.TO, new InternetAddress("zhangsan@itcast.com"));
message.setSentDate(new Date());
/*
* 帶附件(圖片)郵件開發
*/
// 構建一個總的郵件塊
MimeMultipart mixed = new MimeMultipart("mixed");
// ---> 總郵件快,設定到郵件物件中
message.setContent(mixed);
// 左側: (文字+圖片資源)
MimeBodyPart left = new MimeBodyPart();
// 右側: 附件
MimeBodyPart right = new MimeBodyPart();
// 設定到總郵件塊
mixed.addBodyPart(left);
mixed.addBodyPart(right);
/******附件********/
String attr_path = this.getClass().getResource("a.docx").getPath();
DataSource attr_ds = new FileDataSource(new File(attr_path));
DataHandler attr_handler = new DataHandler(attr_ds);
right.setDataHandler(attr_handler);
right.setFileName("a.docx");
/***************設定郵件內容: 多功能使用者郵件 (related)*******************/
// 4.1 構建一個多功能郵件塊
MimeMultipart related = new MimeMultipart("related");
// ----> 設定到總郵件快的左側中
left.setContent(related);
// 4.2 構建多功能郵件塊內容 = 左側文字 + 右側圖片資源
MimeBodyPart content = new MimeBodyPart();
MimeBodyPart resource = new MimeBodyPart();
// 設定具體內容: a.資源(圖片)
String filePath = App_3ImgAndAtta.class.getResource("8.jpg").getPath();
DataSource ds = new FileDataSource(new File(filePath));
DataHandler handler = new DataHandler(ds);
resource.setDataHandler(handler);
resource.setContentID("8.jpg"); // 設定資源名稱,給外來鍵引用
// 設定具體內容: b.文字
content.setContent(" 好哈哈!", "text/html;charset=UTF-8");
related.addBodyPart(content);
related.addBodyPart(resource);
// 5. 傳送
Transport trans = session.getTransport();
trans.connect("zhangsan", "888");
trans.sendMessage(message, message.getAllRecipients());
trans.close();
}
}





原文出處: JavaMail郵件開發 - IT閱讀
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]javaMail 使用 javax.mail 自動讀取郵件
javaMail使用javax.mail自動讀取郵件,並下載解析附件,IMAP/POP3協議等

搜索網上各個案例,總結的一套比較全面且行之有效的方法。供大家參考使用!

使用javax.mail自動讀取郵件,並下載解析附件,IMAP/POP3協議等!

直接上代碼如下:
package ***

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import javax.mail.search.AndTerm;
import javax.mail.search.ComparisonTerm;
import javax.mail.search.FromStringTerm;
import javax.mail.search.SearchTerm;
import javax.mail.search.SentDateTerm;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.Date;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 */
@Component
public class BlacklistCodeTask {

    private static Logger logger = LoggerFactory.getLogger(BlacklistCodeTask.class);

    @Autowired
    private blacklistService blacklistService;

    // 郵箱附件保存路徑
    private static String FILE_SAVE_PATH = ConfigProperties.getProperties("blacklist.emailFilePath");
    // 讀取的發件人
    private static String fromEmail = ConfigProperties.getProperties("blacklist.fromEmail");
    // 收件服務器
    private static String hostServer = ConfigProperties.getProperties("blacklist.hostServer");
    private static String protocol = ConfigProperties.getProperties("blacklist.protocol");
    private static String port = ConfigProperties.getProperties("blacklist.port");
    private static String username = ConfigProperties.getProperties("blacklist.username");
    private static String password = ConfigProperties.getProperties("blacklist.password");

    // 執行日期標識
    String dateTimeFlag;
    // 附件名稱關鍵詞
    private static String FILE_NAME_FLAG1 = "加黑***明細";
    private static String FILE_NAME_FLAG2 = "加黑";

    // Runtime.getRuntime().availableProcessors()
    public static ExecutorService threadPool = Executors.newFixedThreadPool(1);

    /**
     * 定時任務獲取前一天郵件,並解析保存黑端口號碼
     */
    public void acquireXinAnEmails() {
        try {
            // 1. 設置連接信息, 生成一個 Session
            // 獲取連接
            Session session;
            if ("pop3".equalsIgnoreCase(protocol)) {
                session = Session.getInstance(getPOP3());
//                session = Session.getDefaultInstance(getPOP3());
            } else {
//                session = Session.getDefaultInstance(getIMAP());
                session = Session.getInstance(getIMAP());
            }
            session.setDebug(false);
            // 2. 獲取Store, 並連接到服務器
            Store store = session.getStore(protocol);
            store.connect(hostServer, username, password); // POP3服務器的登陸認證
            //
            Folder defaultFolder = store.getDefaultFolder();// 默認父目錄
            if (defaultFolder == null) {
                logger.error("服務器不可用! hostServer:{}", hostServer);
                return;
            }
            //
            Folder folder = defaultFolder.getFolder("INBOX");// 獲取收件箱
            folder.open(Folder.READ_WRITE);// 可讀郵件,可以刪郵件的模式打開目錄
            // 取出來郵件數
            logger.info("folder urlName: {}, 共有郵件: {}封, UnreadMessages: {}, NewMessages: {}...", folder.getURLName().toString(),
                    folder.getMessageCount(), folder.getUnreadMessageCount(), folder.getNewMessageCount());
            //
            dateTimeFlag = DateTimeUtil.formatDateTime(new Date(), DateTimeUtil.DATA_FORMAT_yyyyMMdd);
            searchMails(folder);

            // 7. 關閉 Folder 會真正刪除郵件, false 不刪除
            folder.close(false);
            // 8. 關閉 store, 斷開網絡連接
            store.close();

        } catch (NoSuchProviderException e) {
            logger.error(e.getMessage(), e);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
//        // 統一處理下載好的的Excel文件
//        dealAndGetBlacklist();
    }

    /**
     * 獲取POP3收信配置 995
     *
     * @return
     */
    private Properties getPOP3() {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", protocol);
        props.setProperty("mail.pop3.host", hostServer); // 按需要更改
        props.setProperty("mail.pop3.port", port);
        // SSL安全連接參數
        props.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.pop3.socketFactory.fallback", "false");
        props.setProperty("mail.pop3.socketFactory.port", port);
        // 解決DecodingException: BASE64Decoder: but only got 0 before padding character (=)
        props.setProperty("mail.mime.base64.ignoreerrors", "true");
        return props;
    }

    /**
     * 獲取IMAP收信配置 993
     *
     * @return
     */
    private Properties getIMAP() {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", protocol);
        props.setProperty("mail.imap.host", hostServer); // 按需要更改
        props.setProperty("mail.imap.port", port);
        // SSL安全連接參數
        props.setProperty("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.imap.socketFactory.fallback", "false");
        props.setProperty("mail.imap.socketFactory.port", port);
        props.setProperty("mail.mime.base64.ignoreerrors", "true");
        return props;
    }

    /**
     * 創建搜索條件,並獲取郵件...第二天凌晨10分之後執行,查詢前一天零點到今天零點的數據
     *
     * @param folder
     * @throws Exception
     */
    private void searchMails(Folder folder) throws Exception {
        //建立搜索條件繼承自SearchTerm,像根據發件人,主題搜索,郵件標記FlagTerm等,
        // FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false); //false代表未讀,true代表已讀
        // 搜索昨天收到的的所有郵件
        Calendar calendar = Calendar.getInstance();
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date start = calendar.getTime();
        calendar.setTime(new Date());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        Date end = calendar.getTime();
        SearchTerm comparisonTermGe = new SentDateTerm(ComparisonTerm.GE, start);
        SearchTerm comparisonTermLe = new SentDateTerm(ComparisonTerm.LE, end);
        FromStringTerm fromStringTerm = new FromStringTerm(fromEmail);
        SearchTerm andTerm = new AndTerm(new SearchTerm[]{comparisonTermGe, comparisonTermLe, fromStringTerm});
        logger.info("SearchTerm start: {}, end: {}, fromEmail: {}", DateTimeUtil.formatDateTime(start, DateTimeUtil.DATA_FORMAT_yyyy_MM_dd_HH_mm_ss),
                DateTimeUtil.formatDateTime(end, DateTimeUtil.DATA_FORMAT_yyyy_MM_dd_HH_mm_ss), fromEmail);
        //
        Message[] messages = folder.search(andTerm); //根據設置好的條件獲取message
        logger.info("search郵件: " + messages.length + "封, SearchTerm:" + andTerm.getClass());
        // FetchProfile fProfile = new FetchProfile(); // 選擇郵件的下載模式,
        // fProfile.add(FetchProfile.Item.ENVELOPE); // 根據網速選擇不同的模式
        // folder.fetch(messages, fProfile);// 選擇性的下載郵件
        // 5. 循環處理每個郵件並實現郵件轉爲新聞的功能
        for (int i = 0; i < messages.length; i++) {
            // 單個郵件
            logger.info("---第" + i + "郵件開始------------");
            mailReceiver(messages[i]);
            logger.info("---第" + i + "郵件結束------------");
            // 郵件讀取備份保存,用來校驗
//            messages[i].writeTo(new FileOutputStream(FILE_SAVE_PATH + "pop3Mail_" + messages[i].getMessageNumber() + ".eml"));
        }
    }

    /**
     * 解析郵件
     *
     * @param msg 郵件對象
     * @throws Exception
     */
    private void mailReceiver(Message msg) {
        try {
            // 發件人信息
            Address[] froms = msg.getFrom();
            String mailSubject = transferChinese(msg.getSubject());
            if (froms != null) {
                InternetAddress addr = (InternetAddress) froms[0];
                logger.info("發件人地址:" + addr.getAddress() + ", 發件人顯示名:" + transferChinese(addr.getPersonal()));
            } else {
                logger.error("msg.getFrom() is null... subject:" + mailSubject);
            }
            Date sentDate = msg.getSentDate();
            logger.info("郵件主題: {}, sentDate: {}", mailSubject,
                    sentDate == null ? null : DateTimeUtil.formatDateTime(sentDate, DateTimeUtil.DATA_FORMAT_yyyy_MM_dd_HH_mm_ss));

            // getContent() 是獲取包裹內容, Part相當於外包裝
            Object content = msg.getContent();
            if (content instanceof Multipart) {
                Multipart multipart = (Multipart) content;
                reMultipart(multipart);
            } else if (content instanceof Part) {
                Part part = (Part) content;
                rePart(part);
            } else {
                String contentType = msg.getContentType();
                if (contentType != null && contentType.startsWith("text/html")) {
                    logger.warn("---類型:" + contentType);
                } else {
                    logger.warn("---類型:" + contentType);
                    logger.warn("---內容:" + msg.getContent());
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }

    /**
     * 把郵件主題轉換爲中文.
     *
     * @param strText the str text
     * @return the string
     */
    public String transferChinese(String strText) {
        try {
            if (StringUtils.isBlank(strText)) {
                return null;
            }
            strText = MimeUtility.encodeText(new String(strText.getBytes(),
                    "UTF-8"), "UTF-8", "B");
            strText = MimeUtility.decodeText(strText);
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
        return strText;
    }

    /**
     * @param part 解析內容
     * @throws Exception
     */
    private void rePart(Part part) {
        String tempFilePath = null;
        try {
            // 附件
            if (part.getDisposition() != null) {
                // 郵件附件
                String strFileName = MimeUtility.decodeText(part.getFileName()); //MimeUtility.decodeText解決附件名亂碼問題
                logger.info("發現附件: {}, 內容類型: {} ", strFileName, MimeUtility.decodeText(part.getContentType()));
                // 讀取附件字節並存儲到文件中. xls/xlsx
                String fileType = strFileName.substring(strFileName.lastIndexOf(".") + 1);
                if ((fileType.equals("xlsx") || fileType.equals("xls")) &&
                        (strFileName.contains(FILE_NAME_FLAG1) || strFileName.contains(FILE_NAME_FLAG2))) {
                    InputStream in = part.getInputStream();// 打開附件的輸入流
                    tempFilePath = FILE_SAVE_PATH + dateTimeFlag + strFileName;
                    FileOutputStream out = new FileOutputStream(tempFilePath);
                    int data;
                    while ((data = in.read()) != -1) {
                        out.write(data);
                    }
                    in.close();
                    out.close();
                } else {
                    logger.info("not what we need file, discard it: {}", strFileName);
                }
            } else {
                // 郵件內容
                if (part.getContentType().startsWith("text/plain") || part.getContentType().startsWith("Text/Plain")) {
                    logger.info("Content文本內容:" + part.getContent());
                } else if (part.getContentType().startsWith("text/html")) {
//                    logger.info("HTML內容:" + part.getContent());
                    logger.debug("HTML內容,,不記錄日誌展示。。");
                } else {
                    logger.debug("!其它ContentType:" + part.getContentType() + " ?內容:" + part.getContent());
                }
            }
        } catch (MessagingException e) {
            logger.error(e.getMessage(), e);
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
        } finally {
            // 單個處理黑名單文件,放入線程池處理
            String finalTempFilePath = tempFilePath;
            threadPool.execute(() -> {
                        dealBlacklist(finalTempFilePath);
                    }
            );
        }
    }

    /**
     * @param multipart // 接卸包裹(含所有郵件內容(包裹+正文+附件))
     * @throws Exception
     */
    private void reMultipart(Multipart multipart) throws Exception {
        logger.debug("Multipart郵件共有" + multipart.getCount() + "部分組成");
        // 依次處理各個部分
        for (int j = 0, n = multipart.getCount(); j < n; j++) {
            Part part = multipart.getBodyPart(j);
            // 解包, 取出 MultiPart的各個部分, 每部分可能是郵件內容, 也可能是另一個小包裹(MultipPart)
            if (part.getContent() instanceof Multipart) {
                logger.debug("部分" + j + "的ContentType: " + part.getContentType() + ", to reMultipart() ");
                Multipart p = (Multipart) part.getContent();// 轉成小包裹
                //遞歸迭代
                reMultipart(p);
            } else {
                logger.debug("部分" + j + "的ContentType: " + part.getContentType() + ", to rePart() ");
                rePart(part);
            }
        }
    }

    /**
     * 單個處理下載好的文件
     *
     * @param tempFilePath
     */
    private void dealBlacklist(String tempFilePath) {
        if (StringUtil.isBlank(tempFilePath)) {
            return;
        }
        logger.info("to deal with blacklist Excel file: {}", tempFilePath);
        blacklistService.dealBlacklist(tempFilePath);

    }

}


原文出處:javaMail使用javax.mail自動讀取郵件,並下載解析附件,IMAP/POP3協議等 - 台部落
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]JavaMail - How to download attachments in e-mails
JavaMail - How to download attachments in e-mails

In this tutorial, I will guide you how to write Java code to download attachments from emails programmatically, using JavaMail API.

The article Receive e-mail messages from a POP3-IMAP server describes necessary steps to download e-mail messages from mail server, but only basic information of a message is retrieved, such as header fields (from, to, cc, subject…) and body message. However, the attachment is skipped. So this article is a complement which focuses on how to download attachments in an e-mail message.

A message may contain one or several attachments. As discussed in the article Send e-mail with attachment in Java, if a message contains attachments, its content must be of type MultiPart, and the part contains a file must be of type MimeBodyPart. So it’s important to determine if a message may contain attachments using the following code:
// suppose 'message' is an object of type Message
String contentType = message.getContentType();

if (contentType.contains("multipart")) {
    // this message may contain attachment
}

Then we must iterate through each part in the multipart to identify which part contains the attachment, as follows:
Multipart multiPart = (Multipart) message.getContent();

for (int i = 0; i < multiPart.getCount(); i++) {
    MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
    if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
        // this part is attachment
        // code to save attachment...
    }
}

The MimeBodyPart class provides methods for retrieving and storing attached file, but the way is different between JavaMail 1.3 and JavaMail 1.4.

In JavaMail 1.3, we have to read bytes from an InputStream which can be obtained from the method getInputStream() of the class MimeBodyPart, and write those bytes into an OutputStream, for example:
// save an attachment from a MimeBodyPart to a file
String destFilePath = "D:/Attachment/" + part.getFileName();

FileOutputStream output = new FileOutputStream(destFilePath);

InputStream input = part.getInputStream();

byte[] buffer = new byte[4096];

int byteRead;

while ((byteRead = input.read(buffer)) != -1) {
    output.write(buffer, 0, byteRead);
}
output.close();

In JavaMail 1.4, the MimeBodyPart class introduces two convenient methods that save us a lot of time:

- void saveFile(File file)

- void saveFile(String file)

So saving attachment from a part to a file is as easy as:
part.saveFile("D:/Attachment/" + part.getFileName());

or:
part.saveFile(new File(part.getFileName()));


And following is code of sample program that connects to a mail server via POP3 protocol, downloads new messages and save attachments to files on disk, if any. And it follows JavaMail 1.4 approach:
package net.codejava.mail;

import java.io.File;
import java.io.IOException;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.MimeBodyPart;

/**
 * This program demonstrates how to download e-mail messages and save
 * attachments into files on disk.
 *
 * @author www.codejava.net
 *
 */
public class EmailAttachmentReceiver {
    private String saveDirectory;

    /**
     * Sets the directory where attached files will be stored.
     * @param dir absolute path of the directory
     */
    public void setSaveDirectory(String dir) {
        this.saveDirectory = dir;
    }

    /**
     * Downloads new messages and saves attachments to disk if any.
     * @param host
     * @param port
     * @param userName
     * @param password
     */
    public void downloadEmailAttachments(String host, String port,
            String userName, String password) {
        Properties properties = new Properties();

        // server setting
        properties.put("mail.pop3.host", host);
        properties.put("mail.pop3.port", port);

        // SSL setting
        properties.setProperty("mail.pop3.socketFactory.class",
                "javax.net.ssl.SSLSocketFactory");
        properties.setProperty("mail.pop3.socketFactory.fallback", "false");
        properties.setProperty("mail.pop3.socketFactory.port",
                String.valueOf(port));

        Session session = Session.getDefaultInstance(properties);

        try {
            // connects to the message store
            Store store = session.getStore("pop3");
            store.connect(userName, password);

            // opens the inbox folder
            Folder folderInbox = store.getFolder("INBOX");
            folderInbox.open(Folder.READ_ONLY);

            // fetches new messages from server
            Message[] arrayMessages = folderInbox.getMessages();

            for (int i = 0; i < arrayMessages.length; i++) {
                Message message = arrayMessages[i];
                Address[] fromAddress = message.getFrom();
                String from = fromAddress[0].toString();
                String subject = message.getSubject();
                String sentDate = message.getSentDate().toString();

                String contentType = message.getContentType();
                String messageContent = "";

                // store attachment file name, separated by comma
                String attachFiles = "";

                if (contentType.contains("multipart")) {
                    // content may contain attachments
                    Multipart multiPart = (Multipart) message.getContent();
                    int numberOfParts = multiPart.getCount();
                    for (int partCount = 0; partCount < numberOfParts; partCount++) {
                        MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(partCount);
                        if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
                            // this part is attachment
                            String fileName = part.getFileName();
                            attachFiles += fileName + ", ";
                            part.saveFile(saveDirectory + File.separator + fileName);
                        } else {
                            // this part may be the message content
                            messageContent = part.getContent().toString();
                        }
                    }

                    if (attachFiles.length() > 1) {
                        attachFiles = attachFiles.substring(0, attachFiles.length() - 2);
                    }
                } else if (contentType.contains("text/plain")
                        || contentType.contains("text/html")) {
                    Object content = message.getContent();
                    if (content != null) {
                        messageContent = content.toString();
                    }
                }

                // print out details of each message
                System.out.println("Message #" + (i + 1) + ":");
                System.out.println("\t From: " + from);
                System.out.println("\t Subject: " + subject);
                System.out.println("\t Sent Date: " + sentDate);
                System.out.println("\t Message: " + messageContent);
                System.out.println("\t Attachments: " + attachFiles);
            }

            // disconnect
            folderInbox.close(false);
            store.close();
        } catch (NoSuchProviderException ex) {
            System.out.println("No provider for pop3.");
            ex.printStackTrace();
        } catch (MessagingException ex) {
            System.out.println("Could not connect to the message store");
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Runs this program with Gmail POP3 server
     */
    public static void main(String[] args) {
        String host = "pop.gmail.com";
        String port = "995";
        String userName = "your_email";
        String password = "your_password";

        String saveDirectory = "E:/Attachment";

        EmailAttachmentReceiver receiver = new EmailAttachmentReceiver();
        receiver.setSaveDirectory(saveDirectory);
        receiver.downloadEmailAttachments(host, port, userName, password);

    }
}

The program above will save attachments into a specified directory, and print out details of each received message, including file names of the attachments.

NOTES:

You need to use JavaMail jar files. If you use Maven, add the following dependency to the pom.xml file:
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

This will add the javax.mail-VERSION.jar and activation-VERSION.jar to the project's classpath. If you have to add them manually, download from JavaMail Project page.

Other JavaMail Tutorials:
How to send plain text email using JavaMail
How to send email in HTML format using JavaMail
How to send email with attachments using JavaMail
How to insert images into email for sending with JavaMail
How to receive emails from server using JavaMail
How to search email messages using JavaMail
How to delete emails programmatically using JavaMail

原文出處:JavaMail - How to download attachments in e-mails
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|