java發郵件,這個坑你能填嗎?

正文

今天利用java發郵件,本地windows上測試時發送ok的,部署到服務器上卻報異常,讓咱們走進異常,探索到底坑在哪裏,並填之。html

利用outlook發郵件代碼以下:前端

package com.website.service.impl;

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.internet.MimeMessage;
import java.util.Properties;

/**
* @program: WebSite
* @description: SpringMvc實現的發送email
* @author: smallsoup
* @create: 2018-06-30 20:29
**/
public class EmailServiceImpl {

   private static final Logger LOGGER = LoggerFactory.getLogger(Test.class);

   @Autowired
   @Qualifier("javaMailSender")
   private JavaMailSenderImpl sender;

   /**
    * @方法名: sendMail
    * @參數名:@param subject  郵件主題
    * @參數名:@param content 郵件內容
    * @參數名:@param to     收件人Email地址
    * @描述語: 發送郵件
    */
   public void sendMailHtml(String to, String subject, String content) throws Exception {

       sender.setUsername("yourusername@outlook.com");
       sender.setPassword("your_password");
       sender.setPort(587);

       Properties props = new Properties();
       props.setProperty("mail.transport.protocol", "smtp");
       props.setProperty("mail.smtp.host", "smtp-mail.outlook.com");
       props.setProperty("mail.smtp.starttls.enable", "true");
       props.setProperty("mail.smtp.auth", "true");
       props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
       props.setProperty("mail.smtp.socketFactory.port", "587");
       props.setProperty("mail.smtp.socketFactory.fallback", "true");
       props.setProperty("mail.smtp.auth.ntlm.domain", "THING");

       sender.setJavaMailProperties(props);

       //創建郵件消息,發送簡單郵件和html郵件的區別
       MimeMessage mailMessage = sender.createMimeMessage();
       MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage);

       messageHelper.setFrom("smallsoup@outlook.com");

       //用於接收郵件的郵箱
       messageHelper.setTo(to);
       //郵件的主題
       messageHelper.setSubject(subject);
       //郵件的正文,第二個boolean類型的參數表明html格式
       messageHelper.setText(content, true);

       LOGGER.info("----------sendMailHtml-----------------");
       LOGGER.info("----------mailMessage is------------FROM:{}, Subject:{}, content:{}, AllRecipients:{}", mailMessage.getFrom(), mailMessage.getSubject(), mailMessage.getContent(), JSON.toJSONString(mailMessage.getAllRecipients()));
       //發送
       sender.send(mailMessage);
   }
}

上面的代碼打包在本地tomcat上運行,能夠發送郵件成功。可是將war包部署到亞馬遜雲服務器上發送郵件報錯:java

在這裏插入圖片描述

網上說是因爲用戶名和密碼不正確致使驗證失敗。可是這不能解釋本地能發出去郵件的事實。繼續排查、google,實在找不到解決辦法。那就試着登錄下outlook郵件看能不能登進去,登錄正常,有一封最近的一次登陸存在某些異常的郵件。
在這裏插入圖片描述python

而後點擊查看最新活動狀態。異常顯示最近一次登錄在美國。web

在這裏插入圖片描述

這麼一來就知道問題了,因爲亞馬遜雲實際位置在美國,因此發郵件時至關於在異地登錄被拒絕。當點擊了「是我本人」以後,從新發郵件,就發出去了。面試

在這裏插入圖片描述

之因此不用163發郵件,是由於本地部署也能夠發出去,放到服務器上也發不出,報554 DT:SPM 163 smtp3,網上說是由於郵件主題和正文中又非法字符致使,目前還沒解決,以後再填此坑。spring




本公衆號免費提供csdn下載服務,海量IT學習資源,若是你準備入IT坑,勵志成爲優秀的程序猿,那麼這些資源很適合你,包括但不限於java、go、python、springcloud、elk、嵌入式 、大數據、面試資料、前端 等資源。同時咱們組建了一個技術交流羣,裏面有不少大佬,會不定時分享技術文章,若是你想來一塊兒學習提升,能夠公衆號後臺回覆【2】,免費邀請加技術交流羣互相學習提升,會不按期分享編程IT相關資源。編程


掃碼關注,精彩內容第一時間推給你json

image

相關文章
相關標籤/搜索