1. 程式人生 > >Java寫郵件多人傳送及附件

Java寫郵件多人傳送及附件

maven匯入jar包

    <modelVersion>4.0.0</modelVersion>
    <groupId>MailTest</groupId>
    <artifactId>MailTest</artifactId>
    <packaging>WAR</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>MailTest Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <jstl.version>1.2</jstl.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
        <!-- jstl jsp標籤 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>${jstl.version}</version>
        </dependency>
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!-- servlet  -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.1.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
            <scope>provided</scope>
        </dependency>
        <!-- commons jar -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
        </plugins>
    </build>

建立專案 

C:\Users\THTF\Desktop

編輯MailInfo

package util;

import java.util.List;
import java.util.Properties;

public class MailInfo {
    private String mailServerHost; // 傳送郵件的伺服器的IP
    private String mailServerPort = "587"; // 傳送郵件的伺服器埠
    private String userName; // 登陸郵件傳送伺服器的使用者名稱
    private String userPassword; // 登陸郵件傳送伺服器的密碼
    private String fromAddress; // 郵件傳送者的地址
    private String toAddress; // 郵件接收者的地址管控
    private String ccAddress; // 郵件抄送者的地址
    private String fromUserName = "郵件測試"; // 郵件傳送者的名稱,顯示在他人郵件的發件人
    private String mailSubject; // 郵件主題
    private String mailContent;// 郵件的文字內容
    private String filename;//檔案路徑
    private boolean authValidate = true; // 是否需要身份驗證
    private Properties properties; // 郵件會話屬性

    public String getFilename() {
        return filename;
    }

    public void setFilename(String filename) {
        this.filename = filename;
    }

    public MailInfo() {
    }
    public MailInfo(String serverHost, String user, String password, String fromAddress, String title, String content, List<String> receiver, List<String> ccList, String filename) {
        this.mailServerHost = serverHost;
        this.userName = user;
        this.userPassword = password;
        this.fromAddress = fromAddress;
        this.toAddress = listToStringFormat(receiver);
        this.ccAddress = ccList == null ? "" : listToStringFormat(ccList);
        this.mailSubject = title;
        this.mailContent = content;
        this.filename = filename;
    }

    private synchronized String listToStringFormat(List<String> list) {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            if (i == list.size() - 1) {
                stringBuilder.append(list.get(i));
            } else {
                stringBuilder.append(list.get(i)).append(",");
            }
        }
        return stringBuilder.toString();
    }
    public String getMailServerHost() {
        return mailServerHost;
    }
    public void setMailServerHost(String mailServerHost) {
        this.mailServerHost = mailServerHost;
    }
    public String getMailServerPort() {
        return mailServerPort;
    }
    public void setMailServerPort(String mailServerPort) {
        this.mailServerPort = mailServerPort;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getUserPassword() {
        return userPassword;
    }
    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }
    public String getFromAddress() {
        return fromAddress;
    }
    public void setFromAddress(String fromAddress) {
        this.fromAddress = fromAddress;
    }
    public String getToAddress() {
        return toAddress;
    }
    public void setToAddress(String toAddress) {
        this.toAddress = toAddress;
    }
    public String getCcAddress() {
        return ccAddress;
    }
    public void setCcAddress(String ccAddress) {
        this.ccAddress = ccAddress;
    }
    public String getMailSubject() {
        return mailSubject;
    }
    public void setMailSubject(String mailSubject) {
        this.mailSubject = mailSubject;
    }
    public String getMailContent() {
        return mailContent;
    }
    public void setMailContent(String mailContent) {
        this.mailContent = mailContent;
    }
    public String getFromUserName() {
        return fromUserName;
    }
    public void setFromUserName(String fromUserName) {
        this.fromUserName = fromUserName;
    }


    public boolean isAuthValidate() {
        return authValidate;
    }
    public void setAuthValidate(boolean authValidate) {
        this.authValidate = authValidate;
    }
    public Properties getProperties() {
        Properties p = new Properties();
        p.put("mail.smtp.host", this.mailServerHost);
        p.put("mail.smtp.port", this.mailServerPort);
        p.put("mail.smtp.auth", authValidate ? "true" : "false");
        p.put("mail.smtp.starttls.enable", "true");
        return p;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }

}

編輯MessageSender


package util;



import org.apache.commons.lang.StringUtils;

import org.apache.log4j.Logger;


import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;

import javax.mail.internet.*;


import java.io.UnsupportedEncodingException;

import java.util.ArrayList;

import java.util.Date;

import java.util.List;

import java.util.Properties;



/**

 *傳送郵件工具類

 */



public class MessageSender {

    private static final Logger logger = Logger.getLogger(MessageSender.class);
    /**
     *
     * 傳送郵件-郵件內容為文字格式
     * @param mailInfo
     * @return
     */
    public static boolean sendMail(MailInfo mailInfo) {
        try {
            Message mailMessage = generateBaseInfo(mailInfo);
            // 建立訊息部分
            BodyPart messageBodyPart = new MimeBodyPart();
            messageBodyPart.setText(mailInfo.getMailContent());



            // 建立多重訊息
            Multipart multipart = new MimeMultipart();

            // 設定文字訊息部分
            multipart.addBodyPart(messageBodyPart);

            // 附件部分
            messageBodyPart = new MimeBodyPart();
            // 設定要傳送附件的檔案路徑
            DataSource source = new FileDataSource(mailInfo.getFilename());
            messageBodyPart.setDataHandler(new DataHandler(source));

            // messageBodyPart.setFileName(filename);
            // 處理附件名稱中文(附帶檔案路徑)亂碼問題
            messageBodyPart.setFileName(MimeUtility.encodeText(mailInfo.getFilename()));
            multipart.addBodyPart(messageBodyPart);

            // 傳送完整訊息
            mailMessage.setContent(multipart);
           // mailMessage.setText(mailInfo.getMailContent());// 設定郵件訊息的主要內容
            Transport.send(mailMessage); // 傳送郵件
            System.out.println("【 TEXT 郵件傳送完畢,成功時間: " + System.currentTimeMillis()+ " 】");
            return true;
        } catch (MessagingException ex) {
            ex.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }



    /**
     * 郵件內容為html格式
     * @param mailInfo
     * @return
     */

    public static boolean sendHtmlMail(MailInfo mailInfo) {
        try {
            Message mailMessage = generateBaseInfo(mailInfo);
            Multipart mainPart = new MimeMultipart();// MiniMultipart類是一個容器類,包含MimeBodyPart型別的物件
            BodyPart html = new MimeBodyPart();// 建立一個包含HTML內容的MimeBodyPart
            html.setContent(mailInfo.getMailContent(), "text/html; charset=utf-8");// 設定HTML內容
            mainPart.addBodyPart(html);
            mailMessage.setContent(mainPart);// 將MiniMultipart物件設定為郵件內容

            Transport.send(mailMessage);// 傳送郵件
            System.out.println("【 HTML 郵件傳送完畢,成功時間: " + System.currentTimeMillis() + " 】");
            System.out.println("send ok!");
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }



    /**
     * 郵件資訊保安轉換
     * @param mailInfo
     * @return
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     */

    public static Message generateBaseInfo(MailInfo mailInfo) throws UnsupportedEncodingException, MessagingException {
        // 判斷是否需要身份認證
        MailAuthenticator authenticator = null;
        Properties pro = mailInfo.getProperties();
       // pro.getProperty()
        // 如果需要身份認證,則建立一個密碼驗證器
        if (mailInfo.isAuthValidate()) {
            authenticator = new MailAuthenticator(mailInfo.getUserName(),
                    mailInfo.getUserPassword());
        }

        // 根據郵件會話屬性和密碼驗證器構造一個傳送郵件的session
        Session sendMailSession = Session.getInstance(pro, authenticator);
        Message mailMessage = null;
        mailMessage = new MimeMessage(sendMailSession); // 根據session建立一個郵件訊息
        Address from = new InternetAddress(mailInfo.getFromAddress(), mailInfo.getFromUserName()); // 建立郵件傳送者地址
        mailMessage.setFrom(from); // 設定郵件訊息的傳送者
        if (mailInfo.getToAddress() != null && mailInfo.getToAddress().contains(",")) {
            mailMessage.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mailInfo.getToAddress()));// Message.RecipientType.TO屬性表示接收者的型別為TO
        } else {
            Address to = new InternetAddress(mailInfo.getToAddress()); // 建立郵件的接收者地址,並設定到郵件訊息中
            mailMessage.setRecipient(Message.RecipientType.TO, to);// Message.RecipientType.TO屬性表示接收者的型別為TO
        }
        if (StringUtils.isNotBlank(mailInfo.getCcAddress())) {
            if (mailInfo.getCcAddress().contains(",")) {
                mailMessage.setRecipients(Message.RecipientType.CC, InternetAddress.parse(mailInfo.getCcAddress())); // Message.RecipientType.CC屬性表示接收者的型別為CC
            } else {
                Address cc = new InternetAddress(mailInfo.getCcAddress()); // 建立郵件的抄送者地址,並設定到郵件訊息中
                mailMessage.setRecipient(Message.RecipientType.CC, cc); // Message.RecipientType.CC屬性表示接收者的型別為CC
            }
        }
        mailMessage.setSubject(mailInfo.getMailSubject());// 設定郵件訊息的主題
        mailMessage.setSentDate(new Date());// 設定郵件訊息傳送的時間
        return mailMessage;
    }

}

編輯MailAuthenticator

package util;

import javax.mail.Authenticator;

import javax.mail.PasswordAuthentication;

/**

 * 郵件安全認證

 */

public class MailAuthenticator extends Authenticator {

    String userName;

    String userPassword;



    public MailAuthenticator() {

        super();

    }



    public MailAuthenticator(String user, String pwd) {

        super();

        userName = user;

        userPassword = pwd;

    }



    public PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication(userName, userPassword);

    }



}




寫一個MailDemo進行測試


package test;

import java.util.ArrayList;
import java.util.List;




import util.MailInfo;
import util.MessageSender;

public class MailDemo {


    public static void main(String[] args) {
        mail();
    }

    public static void mail(){
        String serverHost="smtp.qq.com";
        String user="[email protected]";  //使用者名稱
        String password="chcvuocdaffbbhfh";  //密碼
        String fromAddress=user;  //郵件地址
        String title="郵件測試Demo";
        String content="郵件測試成功";
        String fileName="E:\\a.txt";
        List<String> receiver=new ArrayList<String>();
        receiver.add("[email protected]");
        List<String> ccReceiver=new ArrayList<String>();
        //新增抄送人
        ccReceiver.add("[email protected]");
        ccReceiver.add("[email protected]");
        MailInfo mailInfo = new MailInfo(serverHost,user,password,fromAddress,title,content,receiver,ccReceiver, fileName);
        MessageSender.sendMail(mailInfo);

    }





}