1. 程式人生 > >spring通過QQ郵箱傳送Email

spring通過QQ郵箱傳送Email

本文簡要介紹如何通過Spring框架的支援,通過QQ郵箱來發送郵件,包括簡單文字,附件、以及內聯圖片、HTML以及HTTP圖片。

spring-context-support很早就內建支援郵件傳送。

當然, 官方文件明確指出, 需要依賴 JavaMail 這個庫。

在這個年代, 我們很少自己搭建 smtp 伺服器來發送郵件, 一般都是使用郵件提供商的服務。 例如 QQ郵箱, 企業郵箱, 163, 或者阿里雲之類的廠商。

註冊一個賬號, 然後參考郵件服務商的幫助中心, 以及賬戶設定頁面, 獲取smtp伺服器埠資訊, 以及你註冊的賬號和密碼, 儲存到一個比較安全的地方。

相關依賴。

pom.xml中的依賴如下:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.0.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId
>
mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.2</version> </dependency>

其中, commons-io 根據需要決定, 本文中使用了 IOUtils工具類, 提供了很多方便又強大的IO工具方法, 有興趣可以研究一下。

Spring-Mail 相關的介面與實現類

  • MailSender , 傳送簡單郵件的頂層介面。
  • JavaMailSender , 繼承頂層介面, 支援傳送 MIME 郵件。
  • JavaMailSenderImpl 實現類, 顧名思義。
  • SimpleMailMessage 類, 簡單郵件資訊, 包括 from, to, cc, subject 以及 text 欄位。
  • MimeMessagePreparator 介面, 用於 MIME 郵件回撥。
  • MimeMessageHelper 輔助類, 可用於建立 MIME 郵件。支援圖片、附件、以及 HTML 樣式等。

簡單測試程式碼

下面是簡單的測試程式碼。 實際使用時請參考本文末尾的相關連結。把程式碼組織好看一點,好用一點。

package com.cncounter.test.spring;

import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;

public class TestSpringEmail {
    public static void main(String[] args) {
        //
        sendTextEmail();
    }
    public static void sendTextEmail() {
        //
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        // 參考QQ郵箱幫助中心
        mailSender.setHost("smtp.qq.com"); // QQ郵箱smtp傳送伺服器地址
        //mailSender.setPort(465); // QQ這個埠不可用
        mailSender.setPort(587);// 埠號
        mailSender.setUsername("[email protected]"); // 使用你自己的賬號
        mailSender.setPassword("usbusbcnzztbsbtob"); // 授權碼-發簡訊獲取
        // 郵件資訊
        SimpleMailMessage msg = new SimpleMailMessage();
        msg.setFrom("[email protected]"); // 發件人郵箱
        msg.setTo("[email protected]"); // 收件人郵箱
        msg.setSubject("測試Spring郵件"); // 標題
        msg.setText("您的訂單號碼: 20181120075; 請勿告訴別人!"); // 文字資訊
        try {
            mailSender.send(msg);
            System.out.println("郵件傳送成功!"); // 沒有報錯就是好訊息 :-)
        } catch (MailException ex) {
            System.err.println("傳送失敗:" + ex.getMessage());
        }
    }
}

測試結果如下圖所示:

05_01_text_mail.png

可以看到, 簡單驗證碼之類的文字, 通過這些封裝好的工具類, 程式碼編寫很容易。

傳送附件示例

以下是傳送附件的示例。 根據需要, 可以傳送多個附件。

package com.cncounter.test.spring;

import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.*;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.*;
import java.util.Properties;

public class TestSpringAttachEmail {
    public static void main(String[] args) throws Exception {
        // 傳送帶附件的MIME郵件
        sendAttachmentEmail();
    }

    // 傳送帶附件的MIME郵件
    public static void sendAttachmentEmail() throws MessagingException, IOException {
        // 郵件傳送器
        JavaMailSender mailSender = getJavaMailSender();
        // MIME 郵件
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 輔助類; 明確使用 UTF-8 編碼; 否則HTML報中文亂碼
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        //
        boolean isHTML = true;
        // 郵件資訊
        helper.setFrom("[email protected]"); // 發件人郵箱
        helper.setTo("[email protected]"); // 收件人郵箱
        helper.setSubject("測試Spring傳送附件-1"); // 標題
        helper.setText("請點選: <a href='http://www.yuledanao.com/dl/PWA_INTRO.zip'><b>PWA開發簡介.zip</b></a>;" +
                " 或者下載附件!", isHTML); // HTML-資訊

        // 增加1個附件; 可以使用多種資源API
        String fileName1 = "E:/PWA開發簡介.zip";
        InputStream inputStream1 = new FileInputStream(fileName1);
        //
        // Java Mail 會開啟2次 InputStreamResource
    // 第一次確定編碼, 第二次才執行編碼。
        ByteArrayResource byteResource1 =
                new ByteArrayResource(IOUtils.toByteArray(inputStream1));
        // 所以不能使用 InputStreamResource
        // InputStreamResource attachment1 = new InputStreamResource(inputStream1);
        helper.addAttachment("PWA開發簡介.zip", byteResource1);
        try {
            mailSender.send(mimeMessage);
            System.out.println("郵件傳送成功!"); // 沒有報錯就是好訊息 :-)
        } catch (MailException ex) {
            System.err.println("傳送失敗:" + ex.getMessage());
        } finally {
            IOUtils.closeQuietly(inputStream1);
        }
    }

    // 獲取郵件傳送器
    public static JavaMailSender getJavaMailSender() {
        //
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        // 參考QQ郵箱幫助中心
        mailSender.setHost("smtp.qq.com"); // QQ郵箱smtp傳送伺服器地址
        //mailSender.setPort(465); // QQ這個埠不可用? 為什麼?
        mailSender.setPort(587);// 埠號
        mailSender.setUsername("[email protected]"); // 使用你自己的賬號
        mailSender.setPassword("usbusbcnzztbsbtob"); // 授權碼-發簡訊獲取
        //
        // 相關屬性配置, 也可以不修改,使用預設值
        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");// 協議
        props.put("mail.smtp.auth", "true");// 登入
        props.put("mail.smtp.starttls.enable", "true");//使用SSL
        props.put("mail.debug", "true");// 除錯資訊輸出
        //
        return mailSender;
    }
}

當然, 具體的程式碼請根據需要進行適當的封裝。 比如自定義工具類。

結果如下圖所示:

05_02_attachment_email.png

傳送內聯圖片示例

有兩種手段,請根據需要選擇:

  1. HTML嵌入http路徑的圖片。
  2. 以內聯資源的方式傳送圖片。

以下是這兩種內聯圖片的示例:

package com.cncounter.test.spring;

import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class TestSpringImageEmail {
    public static void main(String[] args) throws Exception {
        // 傳送帶內聯圖片的MIME郵件
        sendImageEmail();
    }

    // 傳送帶內聯圖片的MIME郵件
    public static void sendImageEmail() throws MessagingException, IOException {
        // 郵件傳送器
        JavaMailSender mailSender = getJavaMailSender();
        // MIME 郵件
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        // 輔助類; 明確使用 UTF-8 編碼; 否則HTML報中文亂碼
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
        //
        boolean isHTML = true;
        // 郵件資訊
        helper.setFrom("[email protected]"); // 發件人郵箱
        helper.setTo("[email protected]"); // 收件人郵箱
        helper.setSubject("測試Spring傳送內聯圖片-3"); // 標題
        helper.setText("<h1>測試圖片</h1>" +
                "海信電視-InLine:" +
                "<br/>" +
                "<a target='_blank' href='http://www.yuledanao.com/dl/haixin.png'><img src='cid:image1' /></a>" +
                "<br/>" +
                "img-src-http資源:" +
                "<br/>" +
                "<a target='_blank' href='http://www.yuledanao.com/dl/haixin.png'><img src='http://www.yuledanao.com/dl/haixin.png' /></a>" +
                "<br/>" +
                "<br/>" +
                "請點選: <a target='_blank' href='http://www.yuledanao.com/dl/PWA_INTRO.zip'><b>PWA開發簡介.zip</b></a>;" +
                " 或者下載附件!", isHTML); // HTML-資訊
        // cid - content-ID
        // 增加內聯圖片:
        // 不作為附件傳送
        String imageName1 = "E:/haixin.png";
        InputStream imageInputStream1 = new FileInputStream(imageName1);
        ByteArrayResource imageResource1 =
                new ByteArrayResource(IOUtils.toByteArray(imageInputStream1));
        helper.addInline("image1", imageResource1, "image/png");

        // 增加1個附件; 可以使用多種資源API
        String fileName1 = "E:/PWA開發簡介.zip";
        InputStream inputStream1 = new FileInputStream(fileName1);
        //
        // Java Mail 會開啟2次 InputStreamResource;
        // 第一次確定編碼, 第二次才執行編碼。
        ByteArrayResource byteResource1 =
                new ByteArrayResource(IOUtils.toByteArray(inputStream1));
        // 所以不能直接使用 InputStreamResource
        // InputStreamResource attachment1 = new InputStreamResource(inputStream1);
        helper.addAttachment("PWA開發簡介.zip", byteResource1);
        try {
            mailSender.send(mimeMessage);
            System.out.println("郵件傳送成功!"); // 沒有報錯就是好訊息 :-)
        } catch (MailException ex) {
            System.err.println("傳送失敗:" + ex.getMessage());
        } finally {
            IOUtils.closeQuietly(inputStream1);
        }
    }

    // 獲取郵件傳送器
    public static JavaMailSender getJavaMailSender() {
        //
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        // 參考QQ郵箱幫助中心
        mailSender.setHost("smtp.qq.com"); // QQ郵箱smtp傳送伺服器地址
        //mailSender.setPort(465); // QQ這個埠不可用? 為什麼?
        mailSender.setPort(587);// 埠號
        mailSender.setUsername("[email protected]"); // 使用你自己的賬號
        mailSender.setPassword("usbusbcnzztbsbtob"); // 授權碼-發簡訊獲取
        //
        // 相關屬性配置, 也可以不修改,使用預設值
        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");// 協議
        props.put("mail.smtp.auth", "true");// 登入
        props.put("mail.smtp.starttls.enable", "true");//使用SSL
        //props.put("mail.debug", "true");// 除錯資訊輸出
        //
        return mailSender;
    }
}

如果在公網上沒有固定的HTTP伺服器或者CDN伺服器, 則需要使用內聯的方式來發送圖片。

可以從網路上下載到圖片資源, 則引用 HTTP 資源更簡單便捷。

需要CSS樣式則設定HTML元素的style屬性即可。

執行結果如下圖所示:

05_03_image_mail.png

和傳送附件並不衝突。如果需要傳送很多圖片, 可以使用模板技術, 以及 Map/Bean來封裝傳入的資料。

更多資訊, 請參考相關連結。

相關連結

日期: 2018年4月8日

相關推薦

spring通過QQ郵箱傳送Email

本文簡要介紹如何通過Spring框架的支援,通過QQ郵箱來發送郵件,包括簡單文字,附件、以及內聯圖片、HTML以及HTTP圖片。 spring-context-support很早就內建支援郵件傳送。 當然, 官方文件明確指出, 需要依賴 JavaMa

java實現通過QQ郵箱傳送啟用郵件 springBoot

使用者郵件啟用 通過QQ郵箱傳送啟用郵件 soringBoot 本文主要介紹了使用java 呼叫郵箱傳送郵件的功能 首先新建一個springboot專案  pom依賴如下 <parent> <groupId>org.springframewor

這裡是通過QQ郵箱 sina新浪郵箱 163郵箱的簡單傳送Email

1.首先去官網下載傳送Email的相應的jar檔案如 smtp.jar mailapi.jar等 2.去QQ  sina 163中的設定裡開啟POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV  一些你傳送Email的服務歇協議  及生成授權碼等

Python使用QQ郵箱傳送多收件人email

實際開發過程中使用到郵箱的概率很高,那麼如何藉助python使用qq郵箱傳送郵件呢? 程式碼很簡單,短短几行程式碼就可以實現這個功能。 使用到的模組有smtplib和email這個兩個模組,關於這兩個模組的方法就不多說了。 程式碼如下: #codin

PHP通過PHPMailer類庫實現QQ郵箱傳送方法

其實PHP郵箱傳送功能並非每個專案都一定用得到,但其實每個完整的專案,一般都會包含一個PHP郵箱傳送功能。 一般郵箱傳送功能普遍用於註冊啟用,密碼找回,以及留言回覆等等功能上。而且這也是很多人頭疼的問

Spring Boot學習(十四)之Spring boot中使用QQ郵箱傳送郵件

相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。在Spring Boot的Starter模組中也為此提供了自動化配置。下面通過例項看看如

Jsp 實現Email傳送,QQ郵箱傳送時530錯誤的解決

1.163郵箱與QQ郵箱進行測試 * 163郵箱的安全驗證沒有那麼嚴格 ,所以可以忽略一下操作.直接看程式碼 1.1.首先確定你需要用來發送的qq,進入QQ郵箱開啟ssl.               * qq郵箱 > 賬戶  >圖中箭頭位置         

java 通過QQ郵箱發郵件

public static void main(String[] args) throws Exception {         Properties props = System.getProperties();  &

Springboot2.0.4呼叫qq郵箱傳送郵件

開場白:沒記錯的話,用不同框架開發一個發郵箱的功能,都會遇到多多少少的問題,這次也不能例外,否則就沒有意義了。 今天用springboot2.0.4開發發郵件功能,遇到了以下三個坑 專案中添加了該依賴,但是仍舊找不到 下面的物件,一直說該物件沒有被發現,後來

py3傳送使用QQ郵箱傳送html附件

        #html附件  下面是將測試報告放到附件中傳送         email_text = MIMEText('測試報告')         att1 = MIMEText(mailbody,'base64','utf-8')         att1['Content-Type'] = '

CI框架中QQ郵箱傳送郵件

public function qq(){       $this->load->library('email');       $config['protocol'] = 'smtp';

flask_email實現QQ郵箱傳送郵件

直接上程式碼 from flask import Flask from flask_mail import Mail, Message from threading import Thread #

java實現qq郵箱傳送註冊驗證碼

import javax.mail.*; import javax.mail.internet.MimeMessage;/** * * @param email 傳送郵箱驗證碼(註冊) * @return 驗證碼給前段 */ @RequestMapping(valu

Python SMTP模組使用QQ郵箱傳送郵件

前言:    嘗試實現《Python程式設計快速上手  讓繁瑣工作自動化》書籍中的第十六章習題部分,使用python傳送email資訊,嘗試傳送Html,附件和正文都同時存在的郵件,使用QQ郵箱,最終實現根據表格標記對不同使用者發不同郵件功能。(根據之前編寫的讀取表格示例可以

Java 基於JavaMail實現向QQ郵箱傳送郵件

需求 最近專案在做新聞爬蟲,想實現這個功能:爬蟲某個頁面失敗後,把這個頁面的 url 發到筆者的郵箱。最終實現的效果圖如下,後期可以加上過濾標籤、失敗狀態碼等,方便分類搜尋異常。 開發人員可以根據郵件裡的 url 和堆疊資訊,分析爬蟲失敗的原因。 是

java程式碼使用QQ郵箱傳送郵件

import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.

阿里雲上的使用QQ郵箱傳送郵件

直接上程式碼了 由於阿里雲禁用了25埠所以替換成465埠並修改協議為ssl才能傳送郵件 參考我的另一篇部落格 http://blog.csdn.net/u013412790/article/details/54912506 public class Se

Java使用QQ郵箱傳送郵件

本文介紹通過java,使用QQ郵箱進行傳送郵件。 首先要開啟郵箱的SMTP服務,騰訊會給一個授權碼。 package util; import java.util.Properties; import javax.mail.Authenticator; import

Python用QQ郵箱傳送郵件時授權碼問題

QQ郵箱最新推出了一個授權碼,需已驗證的手機號向QQ郵箱伺服器傳送一條簡訊獲得。該授權碼用於第三方客戶端登入,代替了第三方登入時使用的個人郵箱密碼。 在測試過程中遇到兩個問題: 1.提示需建立SSL安全連線。於是將smtplib.SMTP() 改成了smtplib.SMT

python 3.6.3 , 使用QQ 郵箱傳送郵件

示例程式碼:#coding=utf-8 import smtplib from email.mime.text import MIMEText msg_from='[email protec