JavaEmail發送郵件

引言
html

我已經好久沒有寫過博客了,之前在博客園有寫過一段時間,但後來由於工做的緣由,沒有更多的時間來寫博客。這是我在51cto上的第一篇博文,寫寫JavaEmail發送郵件吧。java


準備工做web

下載好:javaMail.jar包和commons-lang-x.x.jar(後面附件中,我會把包一併送上,commons-lang由於在案例當中會用到)
apache



案例介紹服務器

演示瞭如何使用javaMail發送郵件session


實踐app

首先,咱們去新建一個web項目。個人項目名字就叫email.建好項目事後,在WebContent\WEB-INF\lib下加入上面介紹的兩個包。給個圖片:socket


wKioL1R-nh6jpDGTAADCv1V8Uds698.jpg


而後添加一個config的源文件,用於放置配置文件,再到src源文件下添加一個包email。創那好事後,目錄結構以下:ide

wKiom1R-nmiAIN6OAADk_olEfk8689.jpg


好了,如今已經萬事俱備,只欠代碼了。可是在寫代碼以前,我想,簡單地對javaEmail做一點點介紹:函數

1.Java Mail是由Sun定義的一套收發電子郵件的API。

2.Java Mail服務程序能夠有選擇地實現某些郵件協議(smtp\pop3\imap),這三種協議都有對應SSL加密傳輸的協議,分別是SMTPSPOP3SIMAPS

3.用於郵件處理的,分別有兩個包:

mail. jar:此JAR文件包含 Java Mail APISun提供的SMTPIMAPPOP3服務提供程序。

activation. jar:此JAR文件包含JAF APISun的實現。

4.javaMail的關鍵對象,包括:Properties、Session、Message、Authenticator、Address。

Properties對象裏面主要是存放一些key-value,交給JavaMail識別如服務器地址、端口、用戶名、密碼等信息。

Properties對象,給定信息key列表:(例如:p.put("mail.smtp.port",25))

屬性名
 屬性類別
說明

mail.stmp.host

String

SMTP服務器地址,如smtp.sina.com.cn

mail.stmp.port

int

SMTP服務器端口號,默認爲25


mail.stmp.auth


boolean

SMTP服務器是否須要用戶認證,默認爲false


mail.stmp.from String 默認的郵件發送源地址
mail.stmp.socketFactory.class String socket工廠類類名,經過設置該屬性能夠覆蓋提供者默認的實現,必須實現javax.net.SocketFactory接口
mail.stmp.socketFactory.port int 指定socket工廠類所用的端口號,若是沒有規定,則使用默認的端口號
mail.smtp.socketFactory.fallback boolean 設置爲true時,當使用指定的socket類建立socket失敗後,將使用java.net.Socket建立socket,默認爲true
mail.stmp.timeout int

I/O鏈接超時時間,單位爲毫秒,默認爲永不超時

mail.stmp.user String

SMTP默認的登錄用戶名



Session對象

在javaEmail中,它表示與Email會話的對象,它須要經過Properties對象和認證者來初使化它。也就是說這個會話的產生,須要你作好相關Eail環境的配置。


Message對象主要是用於發送消息,和封裝發送或接收信息。


Authenticator對象是指認證者,這個認證者主要須要兩個東西,用戶名和密碼。通常咱們會自定義一個認證者 extends Authenticator;而後new PasswordAuthentication(userName, password)給它。



關於javaMail的介紹先到這裏。如今咱們思考一個問題:發送郵件會有哪些對象?

這是個人假設:首先有一個郵件包(或電子郵件包)。這個郵件包,包括這些東西:1.這個郵件包是哪一個機構發出來的(serverhost)2.這個機構的門牌號是什麼(serverPort) 3.機構在發送這個包的時候,要不要對寄件人作身份驗證。(isValidate) 4.寄件人身份信息是什麼?(假設就是用戶名和密碼) 5.郵件包上應該有寄件人的地址。6.郵件包上應該有收件人的地址(若是是電子郵件,會有多個收件人,抄送等)7.這個郵件主要描述 8.這個郵件裏裝的什麼東西。


好,如今根據上面的那些概念,咱們先建一個EmailPackage對象以下:

package email;

import java.io.InputStream;
import java.util.Arrays;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.internet.InternetAddress;

import org.apache.commons.lang.StringUtils;

/**
 * 表示一個郵件包 
 * 此包中包括髮送郵件的必備條件和郵件內容
 * 暫時不支持附件的發送 若是後期須要,則加入屬性
 * 而後將附件加入到mutipart中便可
 * @author 莊濮向
 *
 */
public class EmailPackage {

    /*
     * 爲你提供發送郵件的主機
     * 好比對象:申通,圓通,或順豐等機構
     * 電子郵件對象好比:QQ,163的主機等
     * like this:smtp.exmail.qq.com
     * 
     */
    private String serverHost;
    
    /*
     *發送郵件主機的端口
     *
     */
    private String serverPort;
    
    /*
     * 是否進行身份驗證
     * 若是進行驗證,則須要您在該機構的用戶名和密碼
     * 
     */
    private boolean isValidate;
    
    /*
     * 在該機構的用戶名
     * 
     */
    private String userName;
    
    /*
     * 在該機構的密碼
     */
    private String password;
    
    /*
     * 發送方郵件地址
     * 讓接收者知道這個郵件是從哪裏發過來的
     */
    private String fromAddress;
    
    /*
     * 接收方的郵件地址
     * 多個主送
     */
    private Address[] mainSendAddresses;
    
    /*
     * 接收方的郵件地址
     * 多個抄送
     */
    private Address[] copySendAddresses;
    
    /*
     * 發送的主題
     * 能夠理解爲郵件的標題
     */
    private String subject;
    
    /*
     * 發送郵件的主要內容
     * 
     */
    private StringBuilder content;
    
    
    /**
     * 構造函數
     * 注:此包在構造的時候,將會從配置文件中獲取除郵件內容之外的必備信息,就像一個清單
     * 郵件內容能夠自行放入
     */
    public EmailPackage(){
        PasteBill();
    }
    
    /**
     * 將發送內容一塊兒加入包中
     * @param content
     */
    public EmailPackage(StringBuilder content){
        PasteBill();
        this.content=content;
    }
    
    /**
     * 爲郵件包貼入清單
     * 或者說是爲發送郵件建立基礎信息
     * 
     */
    private void PasteBill(){
        Properties p = new Properties();
        InputStream in = EmailPackage.class.getClassLoader().getResourceAsStream("mail.properties");
        try {
            p.load(in);
            this.serverHost = StringUtils.trim(p.getProperty("ServerHost"));
            this.serverPort = StringUtils.trim(p.getProperty("ServerPort"));
            if("true".equals(StringUtils.trim(p.getProperty("Validate")))){
                this.isValidate = true;
            }else{
                this.isValidate = false;
            }
            this.userName = StringUtils.trim(p.getProperty("UserName"));
            this.password = StringUtils.trim(p.getProperty("Password"));
            this.fromAddress = StringUtils.trim(p.getProperty("FromAddress"));
            String[] mainStr = StringUtils.trim(p.getProperty("MainSendAddresses")).split(",");
            
            //設置主送地址
            this.mainSendAddresses = new InternetAddress[mainStr.length];
            for(int i=0;i<mainStr.length;i++){
                mainSendAddresses[i] = new InternetAddress(mainStr[i]);
            }
            
            //設置抄送地
            String cc = StringUtils.trim(p.getProperty("CopySendAddresses"));
            if(!StringUtils.isEmpty(cc)){
                String[] ccStr = cc.split(",");
                this.copySendAddresses = new InternetAddress[ccStr.length];
                for(int i=0;i<ccStr.length;i++){
                    copySendAddresses[i]=new InternetAddress(ccStr[i]);
                }
            }else{
                this.copySendAddresses = null;
            }
            this.subject = StringUtils.trim(p.getProperty("Subject"));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    //--------------setter and getter----------------------------------
    public String getServerHost() {
        return serverHost;
    }

    public void setServerHost(String serverHost) {
        this.serverHost = serverHost;
    }

    public String getServerPort() {
        return serverPort;
    }

    public void setServerPort(String serverPort) {
        this.serverPort = serverPort;
    }

    public boolean isValidate() {
        return isValidate;
    }

    public void setValidate(boolean isValidate) {
        this.isValidate = isValidate;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFromAddress() {
        return fromAddress;
    }

    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }

    public Address[] getMainSendAddresses() {
        return mainSendAddresses;
    }

    public void setMainSendAddresses(Address[] mainSendAddresses) {
        this.mainSendAddresses = mainSendAddresses;
    }

    public Address[] getCopySendAddresses() {
        return copySendAddresses;
    }

    public void setCopySendAddresses(Address[] copySendAddresses) {
        this.copySendAddresses = copySendAddresses;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public StringBuilder getContent() {
        return content;
    }

    public void setContent(StringBuilder content) {
        this.content = content;
    }


    @Override
    public String toString() {
        return "EmailPackage [serverHost=" + serverHost + ", serverPort="
                + serverPort + ", isValidate=" + isValidate + ", userName="
                + userName + ", password=" + password + ", fromAddress="
                + fromAddress + ", mainSendAddresses="
                + Arrays.toString(mainSendAddresses) + ", copySendAddresses="
                + Arrays.toString(copySendAddresses) + ", subject=" + subject
                + ", content=" + content + "]";
    }
    
    public static void  main(String[] args) {
        EmailPackage packages = new EmailPackage();
        System.out.println(packages);
    }
}

上述代碼中,在初使化對象的時候有去執行PasteBill方法,而這個方法是去讀取一個配置文件,那個這個配置文件裏面存放了,這個屬性須要的值,包括髮送人,發送地址等信息,之後要更改,那麼只須要改這個配置文件便可。新建文件mail.properties,放到config源文件下,配置文件內容以下:請根據提示作必定的更改

#############################################
# the receive server host  你的服務機構的host
#############################################
ServerHost=smtp.exmail.qq.com

#############################################
# the receive server Port Default 25 
#############################################
ServerPort=25

#############################################
# must validate the send user
# you should send the true value
#############################################
Validate=true

#############################################
#  send userName
#############################################
UserName=zhuangpx@2pol.cn

#############################################
#  send user password
#############################################
Password=請填寫你的密碼

#############################################
#  send user EailAddress
#############################################
FromAddress=zhuangpx@2pol.cn

#############################################
# main send  EailAddress
# if have more like this:xxx@resource.cn,xxx@resource.cn
# you shoud use ',' to split
#############################################
MainSendAddresses=zhuangpx@2pol.cn

#############################################
# copy send EailAddress
# if have more like this:xxx@resource.cn,xxx@resource.cn
# you shoud use ',' to split
#############################################
CopySendAddresses=zhuangpx@2pol.cn

#############################################
# set the defualt subject
# you can change in you project.
#############################################
Subject=這是你的主題內容


既然在發送郵件的過程當中,會對人進行認證,那麼咱們就要去新建一個認證者,而且告訴它相關用戶信息MyAuthenticator對象以下:

package email;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MyAuthenticator extends Authenticator{
    String userName = null;
    String password = null;
    public MyAuthenticator() {
    }
    public MyAuthenticator(String username, String password) {
        this.userName = username;
        this.password = password;
    }
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password);
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}


接下來,思考這個郵件包,確定是有一個郵件發送器來發的,那麼在這個發送器,確定要擁有這個郵件包,才能夠。因此咱們新建對象EmailSender:

package email;

import java.util.Date;
import java.util.Properties;

import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * 此類做爲郵件的發送類
 * 此類的使用必需要有一個EmailPackage包
 * @author 莊濮向
 *
 */
public class EmailSender {
    
    /*
     * 郵件包,包含了要發送的地址,信息等。
     */
    private EmailPackage emailPackage;

    /**
     * 要求必需要有一個包的傳入
     * @param emailPackage
     */
    public EmailSender(EmailPackage emailPackage){
        this.emailPackage = emailPackage;
    }
    
    /**
     * 執行發送的操做
     * @return
     */
    public boolean send(){
        if(this.emailPackage!=null){
            return sendMail();
        }else{
            return false;
        }
    }
    /**
     * 獲得發送服務機構的綜合信息
     */
    private Properties getServiceInfo(){
        Properties p = new Properties();
        p.put("mail.smtp.host", this.emailPackage.getServerHost());
        p.put("mail.smtp.port", this.emailPackage.getServerPort());
        p.put("mail.smtp.auth", this.emailPackage.isValidate() ? "true" : "false");
        return p;
    }
    
    /**
     * 發送郵件    
     */
    private boolean sendMail(){
        Authenticator auth = null;
        if(this.emailPackage.isValidate()){
            auth = new MyAuthenticator(emailPackage.getUserName(),emailPackage.getPassword());
        }
        Session sessionConfig = Session.getDefaultInstance(getServiceInfo(), auth);
        
        Message message = new MimeMessage(sessionConfig);
        try {
            Address from = new InternetAddress(this.emailPackage.getFromAddress());
            //來自哪裏
            message.setFrom(from);
            //主送哪些
            message.setRecipients(Message.RecipientType.TO,this.emailPackage.getMainSendAddresses());
            //抄送哪些
            if(this.emailPackage.getCopySendAddresses()!=null){
                message.addRecipients(Message.RecipientType.CC,this.emailPackage.getCopySendAddresses());
            }
            //發送主題
            message.setSubject(this.emailPackage.getSubject());
            //發送的時間0
            message.setSentDate(new Date());
            //發送內容
            //message.setText(this.emailPackage.getContent().toString());
            
            //若是說是以html方式來發送,請用下面這個方法取代setText
            message.setContent(getMainpart());
            //發送
            Transport.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
    public EmailPackage getEmailPackage() {
        return emailPackage;
    }

    public void setEmailPackage(EmailPackage emailPackage) {
        this.emailPackage = emailPackage;
    }
    
    @SuppressWarnings("unused")
    private Multipart getMainpart(){
        Multipart mainPart = new MimeMultipart();
        try{
        // 建立一個包含HTML內容的MimeBodyPart
        BodyPart html = new MimeBodyPart();
        // 設置HTML內容
        html.setContent(this.emailPackage.getContent().toString(), "text/html; charset=utf-8");
        mainPart.addBodyPart(html);
        // 將MiniMultipart對象設置爲郵件內容
        }catch(Exception e){
            e.printStackTrace();
        }
        return mainPart;
    }
    
}


寫一個測試類EmailTest:

public class EmailTest {

    public static void  main(String[] args) {
        StringBuilder content = new StringBuilder();
        content.append("時間到了,自動發郵件,,我發。dd。。。我發.sdddsccccs.發發發");
        boolean b = new EmailSender(new EmailPackage(content)).send();
        if(!b){
            System.out.println("發送子郵件不成功");
        }
    }
}

運行試試。

相關文章
相關標籤/搜索