1. 程式人生 > >使用JavaMail群發郵件

使用JavaMail群發郵件

很多時候我們有群發郵件的需求,雖然大多數郵箱都支援群發功能,但是還是有點繁雜,JavaMail提供的API功能強大,可能很方便的解決我們的問題

下面我們就開始來寫我們的程式碼吧
首先需要準備好下面兩個jar包

用於獲得收件人的方法:

    public String[] getRecipients() {
        File recipientsFile = new File("E:Recipients.txt");
        InputStream in = null;
        BufferedReader br = null;
        try
{ in = new FileInputStream(recipientsFile); br = new BufferedReader(new InputStreamReader(in)); String line = null; StringBuilder builder = new StringBuilder(); // 讀入聯絡人 while ((line = br.readLine()) != null) { builder.append(line); builder.append(","
); } // 將聯絡人分割為陣列返回 return builder.toString().split(","); } catch (IOException e) { e.printStackTrace(); } finally { try { if (br != null) br.close(); if (in != null) in
.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }

用於傳送郵件的方法:

    public void sendGroupMail() throws AddressException, MessagingException {
        // 得到Session
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.163.com");
        props.setProperty("mail.smtp.auth", "true");
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //郵箱的使用者名稱和密碼
                return new PasswordAuthentication("gyx2110", "********");
            }
        };
        Session session = Session.getInstance(props, authenticator);

        //傳送郵件
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("[email protected]"));
        String[] recipients = getRecipients();
        for (String rec : recipients) {
            //設定收件人
            message.setRecipient(RecipientType.TO, new InternetAddress(rec));
            //設定標題
            message.setSubject("JavaMail測試郵件!");
            //設定正文
            message.setContent("群發郵件,如有打擾請見諒!", "text/html;charset=utf-8");
            //傳送
            Transport.send(message);
        }
    }

值得一提的是我們群發的時候為了隱私,這裡使用的傳送方式是逐條傳送,而不是批量傳送,這樣在正文頁面就看不到有哪些人收到這封郵件了。


到這裡我們只是傳送了普通文體資訊,大多數時我們的郵件是帶有附件的,下面的我們來為郵件中新增附件。

新增附件的方法:

    public void setMultipart(MimeMessage msg) throws MessagingException,
            IOException {
        // 一個Multipart物件包含一個或多個BodyPart物件,來組成郵件的正文部分(包括附件)。
        MimeMultipart multiPart = new MimeMultipart();

        // 新增正文
        MimeBodyPart partText = new MimeBodyPart();
        partText.setContent("這是一封含有附件的群發郵件!", "text/html;charset=utf-8");

        // 新增檔案 也就 是附件
        MimeBodyPart partFile = new MimeBodyPart();
        File file = new File("E:mail.jar");
        partFile.attachFile(file);
        // 設定在收件箱中和附件名 並進行編碼以防止中文亂碼
        partFile.setFileName(MimeUtility.encodeText(file.getName()));

        multiPart.addBodyPart(partText);
        multiPart.addBodyPart(partFile);
        msg.setContent(multiPart);
    }

傳送帶附件的郵件:

    public void sendMultipartMail() throws AddressException, MessagingException,
            IOException {
        // 得到Session
        Properties props = new Properties();
        props.setProperty("mail.host", "smtp.163.com");
        props.setProperty("mail.smtp.auth", "true");
        Authenticator authenticator = new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                // 郵箱的使用者名稱和密碼
                return new PasswordAuthentication("gyx2110", "********");
            }
        };
        Session session = Session.getInstance(props, authenticator);

        // 傳送郵件
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress("[email protected]"));
        // 設定收件人
        message.setRecipient(RecipientType.TO, new InternetAddress(
                "[email protected]"));
        // 設定標題
        message.setSubject("JavaMail帶附件的測試郵件!");
        // 設定郵件主體
        setMultipart(message);
        // 傳送
        Transport.send(message);
    }