天天看點

JavaMail的使用之郵件發送

原文:http://www.javazy.com/contentex/2005916165628.shtml

上網看了些教程,發現網上的文章雖然很多,但大都有些問題,包括:有些文章寫得很全,但感覺太紛繁複雜,沒有個提綱,感覺很亂。有些文章沒有把問題寫全,對于很多情況,程式能運作,但郵件就是發不了。

對于JavaMail,最基礎的功能就是郵件的發送和接收,在這裡,我先講一講郵件的發送。

在寫具體的程式前,先講一些概念。1.郵件的發送:如果你的郵件位址是[email protected],而你要用這個郵箱發送一封郵件到[email protected],這個發送過程是怎樣的呢,你以為是先連接配接到tohost.com這伺服器上,然後把郵件發送出去嗎?其實不然。最初,你需要連接配接到伺服器host.com上,當然這個連接配接可能需要認證,然後是發送郵件到伺服器host.com上,關閉連接配接。在host.com上,你所發送的郵件進入發送隊列中,輪到你要發送的郵件時,host.com主機再聯系tohost.com,将郵件傳輸到伺服器tohost.com上。2.一些垃圾郵件的發送:在垃圾郵件中,可能大部分的發件人的位址都是假的,這是怎麼回事呢?實際上在發送這些垃圾郵件的時候,這裡的host.com有些特别,可能host.com不需要對使用者進行認證,也可能發送垃圾郵件的人本來就控制着伺服器host.com,然後控制着host.com向其他伺服器,如tohost.com,發送郵件,而發送郵件的内容可以被控制,發件人的位址就可以随便填寫。

發送郵件主要包括3個部分:建立連接配接,建立郵件體,發送郵件

JavaMail中,是使用會話(Session)來管理連接配接的。建立一個連接配接,就需要建立一個會話。在會話中,有兩個重要的因素,一是會話的屬性,二是會話的認證。在我們使用Hotmail等郵件工具的時候,就要設定”SMTP伺服器身份驗證”,也就是這裡的會話的認證。

首先,建立一個連接配接屬性。

Properties props = new Properties();

props.put("mail.smtp.host","smtp.126.com");  //設定smtp的伺服器位址是smtp.126.com

props.put("mail.smtp.auth","true");          //設定smtp伺服器要身份驗證。

在建立一個身份驗證。身份驗證稍微複雜一點,要建立一個Authenticator的子類,并重載getPasswordAuthentication()方法,代碼如下:

class PopupAuthenticator extends Authenticator {

    public PasswordAuthentication getPasswordAuthentication() {

        String username = "cqhcp"; //126郵箱登入帳号

        String pwd = "12345"; //登入密碼

        return new PasswordAuthentication(username, pwd);

    }

}

建立身份驗證的執行個體:

PopupAuthenticator auth = new PopupAuthenticator();

建立會話: 關于會話的建立,有兩種方法,具體請參看後續的文章,這裡隻簡單使用一種。

Session session = Session.getInstance(props, auth);

定義郵件位址:

//發送人位址

Address addressFrom = new InternetAddress("[email protected]", "George Bush");

//收件人位址

Address addressTo = new InternetAddress("[email protected]", "George Bush");

//抄送位址

Address addressCopy = new InternetAddress("[email protected]", "George Bush");

建立郵件體:

message.setContent("Hello", "text/plain");//或者使用message.setText("Hello");更詳細的資訊請參看後續文章.

message.setSubject("Title");

message.setFrom(addressFrom);

message.addRecipient(Message.RecipientType.TO,addressTo);

message.addRecipient(Message.RecipientType.CC,addressCopy);

message.saveChanges();

發送郵件的過程:

Transport transport = session.getTransport("smtp");//建立連接配接

transport.connect("smtp.126.com", "cqhcp", "12345");//連接配接伺服器

transport.send(message);//發送資訊

transport.close();//關閉連接配接

整體程式的代碼如下:

class PopupAuthenticator extends Authenticator {

    public PasswordAuthentication getPasswordAuthentication() {

        String username = "cqhcp"; //163郵箱登入帳号

        String pwd = "12345"; //登入密碼

        return new PasswordAuthentication(username, pwd);

    }

}

Properties props = new Properties();

props.put("mail.smtp.host","smtp.126.com");

props.put("mail.smtp.auth","true");

PopupAuthenticator auth = new PopupAuthenticator();

Session session = Session.getInstance(props, auth);

MimeMessage message = new MimeMessage(session);

Address addressFrom = new InternetAddress("[email protected]", "George Bush");

Address addressTo = new InternetAddress("[email protected]", "George Bush");

Address addressCopy = new InternetAddress("[email protected]", "George Bush");

message.setContent("Hello", "text/plain");//或者使用message.setText("Hello");

message.setSubject("Title");

message.setFrom(addressFrom);

message.addRecipient(Message.RecipientType.TO,addressTo);

message.addRecipient(Message.RecipientType.CC,addressCopy);

message.saveChanges();

Transport transport = session.getTransport("smtp");

transport.connect("smtp.126.com", "cqhcp", "12345");

transport.send(message);

transport.close();