Springboot+Javamail實現(xiàn)郵件發(fā)送

Springboot+Javamail實現(xiàn)郵件發(fā)送

使用的是spring-context-support-5.2.6.RELEASE.jar里的javamail

javamail 官方文檔:javamail

代碼在:gitee

官方代碼介紹

Sample code for an HTML mail with an inline image and a PDF attachment:

帶有圖像和PDF附件的HTML郵件的示例代碼:

mailSender.send(new MimeMessagePreparator() {
            public void prepare(MimeMessage mimeMessage) throws MessagingException {
                MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
                message.setFrom("me@mail.com");
                message.setTo("you@mail.com");
                message.setSubject("my subject");
                message.setText("my text <img src='cid:myLogo'>", true);
                message.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
                message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
            }
        });

MimeMessageHelper參數(shù)說明

  • from(發(fā)件人)
  • to(收件人)
  • subject(郵件主題)
  • text(內(nèi)容)
  • inline(內(nèi)嵌圖片或者圖片附件)
  • attachment(附件)
  • cc(抄送人)
  • bcc(密送人)

Springboot 代碼示例

開啟POP3/SMTP服務(wù)抽减,并拿到授權(quán)碼

首先登錄163郵箱 開啟POP3/SMTP服務(wù)

開啟POP3/SMTP服務(wù)

拿到授權(quán)碼

application.yml配置文件不要填郵箱密碼允青,要填授權(quán)碼,不然會報錯:535 Error: authentication failed

拿到授權(quán)碼

application.yml配置文件


spring:
  mail:
    default-encoding: UTF-8
    host: smtp.163.com
    username: owl_email@163.com
    # 不要填郵箱密碼胯甩,要填授權(quán)碼,不然會報錯:535 Error: authentication failed
    password: 
    protocol: smtp
    properties:
      mail:
        smtp:
          auth: true
          port: 994 #465或者994
          starttls:
            enable: true
            required: true
          ssl:
            enable: true
      display:
        sendmail: Javen
        sendname: Spring Boot Guide Email

MailDetail(參數(shù)封裝)

記得setter堪嫂、getter


public class MailDetail {
    /**
     * 發(fā)件人名稱
     */
    private String senderName;

    /**
     * 發(fā)件人郵件地址
     */
    private String senderMail;

    /**
     * 收件人地址
     */
    private String addresseeMail;

    /**
     * 郵件標(biāo)題
     */
    private String mailTitle;

    /**
     * 抄送人
     */
    private String[] cc;

    /**
     * 郵件內(nèi)容
     */
    private String content;

    /**
     * true內(nèi)容為HTML偎箫,false內(nèi)容為文本 默認文本
     */
    private Boolean html = false;

}


發(fā)送郵件Service層


@Service
public class MailServiceImpl implements MailService {
    private static final Logger log = LoggerFactory.getLogger(MailServiceImpl.class);

    private final JavaMailSender javaMailSender;

    @Autowired
    public MailServiceImpl(JavaMailSender javaMailSender) {
        this.javaMailSender = javaMailSender;
    }

    @Override
    public boolean sendMessage(MailDetail detail) {
        log.info("mailServiceImpl.sendMessage.request:{}", new Gson().toJson(detail));
        try {
            MimeMessage message = javaMailSender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(message, true);
            // 發(fā)件人地址
            InternetAddress fromAddress = new InternetAddress(MimeUtility.encodeText(detail.getSenderName()) + "<" + detail.getSenderMail() + ">");
            messageHelper.setFrom(fromAddress);
            // 收件人地址
            InternetAddress toAddress = new InternetAddress(MimeUtility.encodeText(detail.getAddresseeMail()) + "<" + detail.getAddresseeMail() + ">");
            messageHelper.setTo(toAddress);
            // 郵件名稱
            messageHelper.setSubject(detail.getMailTitle());
            // 第二個參數(shù)指定發(fā)送的是HTML格式
            messageHelper.setText(detail.getContent(), detail.getHtml());
            // 抄送人
            if (detail.getCc() != null && detail.getCc().length > 0) {
                messageHelper.setCc(detail.getCc());
            }
            // 測試圖片附件(ClassPathResource要把圖片放到resources,并且編譯代碼把圖片加載到target里)
//            messageHelper.addInline("myLogo", new ClassPathResource("WechatIMG2602.jpeg"));
            javaMailSender.send(message);
            return true;
        } catch (MessagingException | UnsupportedEncodingException e) {
            log.error("mailServiceImpl.sendMessage.error:{},{}", e.getMessage(), e.getStackTrace());
        }
        return false;
    }
}

發(fā)送郵件Controller層

主要controller實現(xiàn)類ApplicationRunner 的run 項目啟動則執(zhí)行


@RestController
public class MailController implements ApplicationRunner {
    private static final Logger log = LoggerFactory.getLogger(MailController.class);

    protected final MailService mailService;

    @Autowired
    public MailController(MailService mailService) {
        this.mailService = mailService;
    }


    @Override
    public void run(ApplicationArguments args) throws Exception {
        log.info("syncController.run");
        MailDetail mailDetail = new MailDetail();
        // 發(fā)件人名稱
        mailDetail.setSenderName("云深小麥");
        // 發(fā)件人郵箱
        mailDetail.setSenderMail("owl_email@163.com");
        // 郵件名稱
        mailDetail.setMailTitle("這里是測試");
        // 收件人郵箱
        mailDetail.setAddresseeMail("guoqingyan_email@163.com");
        // 發(fā)送純文本 setHtml(false) 默認false
//        mailDetail.setContent("你好皆串!我是云深小麥");

        // 發(fā)送HTML setHtml(true)
        mailDetail.setContent("<html><head></head><body><h1>你好淹办!我是云深小麥</h1></body></html>");
        // 內(nèi)容是否為HTML
        mailDetail.setHtml(true);

        boolean b = mailService.sendMessage(mailDetail);
        if (b) {
            log.info("發(fā)送成功");
        }
    }
}

結(jié)果

結(jié)果

一些問題

535 Error: authentication failed

Caused by: javax.mail.AuthenticationFailedException: 535 Error: authentication failed

調(diào)用163郵箱服務(wù)器來發(fā)送郵件,我們需要開啟POP3/SMTP服務(wù),這時163郵件會讓我們設(shè)置客戶端授權(quán)碼,這個授權(quán)碼替代上面代碼部分的passwd即可成功發(fā)送郵件

如何重置授權(quán)碼

550 Invalid User

com.sun.mail.smtp.SMTPSenderFailedException: 550 Invalid User

該錯誤表示:收件地址為無效帳號恶复。

建議:

1怜森,請檢查收件人地址是否存在語法錯誤,例如說有攜帶多余的標(biāo)點符號谤牡。地址與地址之間的分隔號是英文字符下的分號副硅。

2,請檢查收件人地址是否有錯誤翅萤,收件人不存在等情況恐疲。

3,請檢查發(fā)件人在系統(tǒng)的狀態(tài)套么,是否被刪除培己、禁用或者凍結(jié)狀態(tài)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胚泌,一起剝皮案震驚了整個濱河市省咨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玷室,老刑警劉巖零蓉,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異穷缤,居然都是意外死亡壁公,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門绅项,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紊册,“玉大人,你說我怎么就攤上這事∧叶福” “怎么了芳绩?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長撞反。 經(jīng)常有香客問我妥色,道長,這世上最難降的妖魔是什么遏片? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任嘹害,我火速辦了婚禮,結(jié)果婚禮上吮便,老公的妹妹穿的比我還像新娘笔呀。我一直安慰自己,他們只是感情好髓需,可當(dāng)我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布许师。 她就那樣靜靜地躺著,像睡著了一般僚匆。 火紅的嫁衣襯著肌膚如雪微渠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天咧擂,我揣著相機與錄音逞盆,去河邊找鬼。 笑死松申,一個胖子當(dāng)著我的面吹牛纳击,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播攻臀,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼焕数,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了刨啸?” 一聲冷哼從身側(cè)響起堡赔,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎设联,沒想到半個月后善已,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡离例,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年换团,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫蛆。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡艘包,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情想虎,我是刑警寧澤卦尊,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站舌厨,受9級特大地震影響岂却,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裙椭,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一躏哩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧揉燃,春花似錦屿岂、人聲如沸祈远。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆奥。三九已至侨糟,卻和暖如春婆硬,著一層夾襖步出監(jiān)牢的瞬間躺枕,已是汗流浹背肴颊。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工氓栈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婿着。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓授瘦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親竟宋。 傳聞我的和親對象是個殘疾皇子提完,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容