Java發送郵件(帶附件)


實現java發送郵件的過程大體有以下幾步:

  1. 准備一個properties文件,該文件中存放SMTP服務器地址等參數。
  2. 利用properties創建一個Session對象
  3. 利用Session創建Message對象,然后設置郵件主題和正文
  4. 利用Transport對象發送郵件

需要的jar有2個:activation.jar和mail.jar

直接看個demo代碼

#----------------這兩個是構建session必須的字段----------
#smtp服務器
mail.smtp.host=smtp.qq.com
#身份驗證
mail.smtp.auth=true
#--------------------------------------------------------------

#發送者的郵箱用戶名
mail.sender.username=xxx@xx.com
#發送者的郵箱密碼
mail.sender.password=xxxxxxxxxx
MailServer.properties

下面是發送郵件的java代碼

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

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;


public class JavaMail {
    /**
     * Message對象將存儲我們實際發送的電子郵件信息,
     * Message對象被作為一個MimeMessage對象來創建並且需要知道應當選擇哪一個JavaMail session。
     */
    private MimeMessage message;
    
    /**
     * Session類代表JavaMail中的一個郵件會話。
     * 每一個基於JavaMail的應用程序至少有一個Session(可以有任意多的Session)。
     * 
     * JavaMail需要Properties來創建一個session對象。
     * 尋找"mail.smtp.host"    屬性值就是發送郵件的主機
     * 尋找"mail.smtp.auth"    身份驗證,目前免費郵件服務器都需要這一項
     */
    private Session session;
    
    /***
     * 郵件是既可以被發送也可以被受到。JavaMail使用了兩個不同的類來完成這兩個功能:Transport 和 Store。 
     * Transport 是用來發送信息的,而Store用來收信。對於這的教程我們只需要用到Transport對象。
     */
    private Transport transport;
    
    private String mailHost="";
    private String sender_username="";
    private String sender_password="";

    
    private Properties properties = new Properties();
    /*
     * 初始化方法
     */
    public JavaMail(boolean debug) {
        InputStream in = JavaMail.class.getResourceAsStream("MailServer.properties");
        try {
            properties.load(in);
            this.mailHost = properties.getProperty("mail.smtp.host");
            this.sender_username = properties.getProperty("mail.sender.username");
            this.sender_password = properties.getProperty("mail.sender.password");
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        session = Session.getInstance(properties);
        session.setDebug(debug);//開啟后有調試信息
        message = new MimeMessage(session);
    }

    /**
     * 發送郵件
     * 
     * @param subject
     *            郵件主題
     * @param sendHtml
     *            郵件內容
     * @param receiveUser
     *            收件人地址
     */
    public void doSendHtmlEmail(String subject, String sendHtml,
            String receiveUser) {
        try {
            // 發件人
            //InternetAddress from = new InternetAddress(sender_username);
            // 下面這個是設置發送人的Nick name
            InternetAddress from = new InternetAddress(MimeUtility.encodeWord("幻影")+" <"+sender_username+">");
            message.setFrom(from);
            
            // 收件人
            InternetAddress to = new InternetAddress(receiveUser);
            message.setRecipient(Message.RecipientType.TO, to);//還可以有CC、BCC
            
            // 郵件主題
            message.setSubject(subject);
            
            String content = sendHtml.toString();
            // 郵件內容,也可以使純文本"text/plain"
            message.setContent(content, "text/html;charset=UTF-8");
            
            // 保存郵件
            message.saveChanges();
            
            transport = session.getTransport("smtp");
            // smtp驗證,就是你用來發郵件的郵箱用戶名密碼
            transport.connect(mailHost, sender_username, sender_password);
            // 發送
            transport.sendMessage(message, message.getAllRecipients());
            //System.out.println("send success!");
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(transport!=null){
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        JavaMail se = new JavaMail(false);
        se.doSendHtmlEmail("郵件主題", "郵件內容", "xxx@XX.com");
    }
}

 

上面只能實現文本的發送,如果我們要發送附件,就需要用到Multipart對象了。

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

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
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;
import javax.mail.internet.MimeUtility;

public class JavaMailWithAttachment {
    private MimeMessage message;
    private Session session;
    private Transport transport;

    private String mailHost = "";
    private String sender_username = "";
    private String sender_password = "";

    private Properties properties = new Properties();

    /*
     * 初始化方法
     */
    public JavaMailWithAttachment(boolean debug) {
        InputStream in = JavaMailWithAttachment.class.getResourceAsStream("MailServer.properties");
        try {
            properties.load(in);
            this.mailHost = properties.getProperty("mail.smtp.host");
            this.sender_username = properties.getProperty("mail.sender.username");
            this.sender_password = properties.getProperty("mail.sender.password");
        } catch (IOException e) {
            e.printStackTrace();
        }

        session = Session.getInstance(properties);
        session.setDebug(debug);// 開啟后有調試信息
        message = new MimeMessage(session);
    }

    /**
     * 發送郵件
     * 
     * @param subject
     *            郵件主題
     * @param sendHtml
     *            郵件內容
     * @param receiveUser
     *            收件人地址
     * @param attachment
     *            附件
     */
    public void doSendHtmlEmail(String subject, String sendHtml, String receiveUser, File attachment) {
        try {
            // 發件人
            InternetAddress from = new InternetAddress(sender_username);
            message.setFrom(from);

            // 收件人
            InternetAddress to = new InternetAddress(receiveUser);
            message.setRecipient(Message.RecipientType.TO, to);

            // 郵件主題
            message.setSubject(subject);

            // 向multipart對象中添加郵件的各個部分內容,包括文本內容和附件
            Multipart multipart = new MimeMultipart();
            
            // 添加郵件正文
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setContent(sendHtml, "text/html;charset=UTF-8");
            multipart.addBodyPart(contentPart);
            
            // 添加附件的內容
            if (attachment != null) {
                BodyPart attachmentBodyPart = new MimeBodyPart();
                DataSource source = new FileDataSource(attachment);
                attachmentBodyPart.setDataHandler(new DataHandler(source));
                
                // 網上流傳的解決文件名亂碼的方法,其實用MimeUtility.encodeWord就可以很方便的搞定
                // 這里很重要,通過下面的Base64編碼的轉換可以保證你的中文附件標題名在發送時不會變成亂碼
                //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
                //messageBodyPart.setFileName("=?GBK?B?" + enc.encode(attachment.getName().getBytes()) + "?=");
                
                //MimeUtility.encodeWord可以避免文件名亂碼
                attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
                multipart.addBodyPart(attachmentBodyPart);
            }
            
            // 將multipart對象放到message中
            message.setContent(multipart);
            // 保存郵件
            message.saveChanges();

            transport = session.getTransport("smtp");
            // smtp驗證,就是你用來發郵件的郵箱用戶名密碼
            transport.connect(mailHost, sender_username, sender_password);
            // 發送
            transport.sendMessage(message, message.getAllRecipients());

            System.out.println("send success!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (transport != null) {
                try {
                    transport.close();
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        JavaMailWithAttachment se = new JavaMailWithAttachment(true);
        File affix = new File("c:\\測試-test.txt");
        se.doSendHtmlEmail("郵件主題", "郵件內容", "xxx@XXX.com", affix);//
    }
}
帶附件

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM