【Java】使用Spring Boot+RabbitMQ實現(xiàn)郵件發(fā)送功能

使用技術及框架:Spring Boot + RabbitMQ


  1. pom.xml
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>
<!--rabbitMq-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!--郵件系統(tǒng)-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--第三方庫整合上下文-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.3.7.RELEASE</version>
</dependency>
  1. application.yml
spring:
  mail:
    host: smtp.qq.com
    port: 25
    username: xxxx@qq.com
    password: xxxx # 郵箱授權密碼
    personal: xxx  # 發(fā)件人別名
    protocol: smtp
    default-encoding: UTF-8
  rabbitmq:
     host: 你的rabbit服務器地址
     port: 5672
     username: username
     password: password
     virtual-host: /
     connection-timeout: 60000

3.郵件發(fā)送核心類

@Component
public class MailBase {
    @Autowired
    JavaMailSender javaMailSender;

    /**
     * TODO: 發(fā)送郵件
     * @param from      發(fā)件人
     * @param personal  發(fā)件人昵稱
     * @param to        收件人
     * @param subject   主題
     * @param content   內容
     * @param fileUrl   附件
     * @param fileName  附件名稱
     */
    public void sendSimpleMail(String from,String personal,String to,String subject,String content,String fileUrl,String fileName){
        MimeMessage message = null;
        try {
            message = javaMailSender.createMimeMessage();
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from,personal);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            if (!fileUrl.equals("") && !fileName.equals("")){
                FileSystemResource fileSystemResource=new FileSystemResource(new File(fileUrl));
                helper.addAttachment(fileName,fileSystemResource);
            }
            javaMailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
}
  1. rabbit消息隊列消息推送端
/**
  *  這里有兩種方案扮碧,一種是按我下面給出的代碼直接CP就可以吉执,另一種是
  *  @Component
  *  public class XXXSender(名字可以自行定義){}
  */
@Component("mailSenders")
public class MailSender {
    private final Logger logger = LoggerFactory.getLogger(MailSender.class);
    @Autowired
    AmqpTemplate amqpTemplate;
    @Value("${spring.mail.username}")
    private String from;
    @Value("${spring.mail.personal}")
    private String personal;
    /**
     * TODO: 將郵件信息內容推送至消息隊列
     * @param to        收件人
     * @param subject   主題
     * @param content   內容
     * @param fileUrl   附件
     * @param fileName  附件名稱
     * @return
     */
    public String send(String to,String subject,String content,String fileUrl,String fileName){
        logger.info("郵件發(fā)送時間:"+new Date())
        //TODO: 封裝郵件消息
        BasePage mail = new BasePage();
        mail.put("from",from);
        mail.put("personal",personal);
        mail.put("to",to);
        mail.put("subject",subject);
        mail.put("content",content);
        mail.put("fileUrl",fileUrl);
        mail.put("fileName",fileName);

        amqpTemplate.convertAndSend("mailSev",mail);
        return "已成功推送至郵件服務隊列";
    }
}
  1. rabbit消息隊列消息接收處理端
@Component
@RabbitListener(queues = "mailSev")
public class MailReceiver {
    private final Logger logger = LoggerFactory.getLogger(MailSender.class);
    @Resource
    MailBase mailBase;

    @RabbitHandler
    public void process(BasePage mail) {
        // TODO 開始處理隊列中的內容·推送至郵件服務器進行發(fā)送
        mailBase.sendSimpleMail(mail.getString("from"),mail.getString("personal"),
                                     mail.getString("to"),mail.getString("subject"),
                                     mail.getString("content"),mail.getString("fileUrl"),mail.getString("fileName"));
        logger.info("郵件推送時間:" + new Date());
    }
}
  1. BasePage Map的封裝類丐黄,如果感覺麻煩可以將4/5中BasePage對象替換為Map對象
public class BasePage extends HashMap implements Map{

    private static final long serialVersionUID = 1L;

    Map map = null;
    HttpServletRequest request;
    @SuppressWarnings("unchecked")
    public BasePage(HttpServletRequest request){
        this.request = request;
        Map properties = request.getParameterMap();
        Map returnMap = new HashMap();
        Iterator entries = properties.entrySet().iterator();
        Entry entry;
        String name = "";
        String value = "";
        while (entries.hasNext()) {
            entry = (Entry) entries.next();
            name = (String) entry.getKey();
            Object valueObj = entry.getValue();
            if(null == valueObj){
                value = "";
            }else if(valueObj instanceof String[]){
                String[] values = (String[])valueObj;
                for(int i=0;i<values.length;i++){
                    value = values[i] + ",";
                }
                value = value.substring(0, value.length()-1);
            }else{
                value = valueObj.toString();
            }
            returnMap.put(name, value);
        }
        map = returnMap;
    }

    public BasePage() {
        map = new HashMap();
    }

    @Override
    public Object get(Object key) {
        Object obj = null;
        if(map.get(key) instanceof Object[]) {
            Object[] arr = (Object[])map.get(key);
            obj = request == null ? arr:(request.getParameter((String)key) == null ? arr:arr[0]);
        } else {
            obj = map.get(key);
        }
        return obj;
    }

    public String getString(Object key) {
        return (String)get(key);
    }

    @SuppressWarnings("unchecked")
    @Override
    public Object put(Object key, Object value) {
        return map.put(key, value);
    }

    @Override
    public Object remove(Object key) {
        return map.remove(key);
    }

    public void clear() {
        map.clear();
    }

    public boolean containsKey(Object key) {
        return map.containsKey(key);
    }

    public boolean containsValue(Object value) {
        return map.containsValue(value);
    }

    public Set entrySet() {
        return map.entrySet();
    }

    public boolean isEmpty() {
        return map.isEmpty();
    }

    public Set keySet() {
        return map.keySet();
    }

    @SuppressWarnings("unchecked")
    public void putAll(Map t) {
        map.putAll(t);
    }

    public int size() {
        return map.size();
    }

    public Collection values() {
        return map.values();
    }

    public String parsePage(){
        StringBuffer sb = new StringBuffer();
        Iterator<String> iteratorSet = this.keySet().iterator();
        while (iteratorSet.hasNext()){
            String key = iteratorSet.next();
            sb.append(key).append("=")
                    .append(this.get(key)).append("&");
        }
        if (sb.length() > 0) sb.deleteCharAt(sb.length()-1);
        return sb.toString();
    }
}
  1. 調用
@Autowired
MailSender mailSenders;

mailSenders.send("test@qq.com","測試郵件","<h2>測試郵件內容</h2>","D:\\test.pdf","測試.pdf");
 
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末症革,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子逊笆,更是在濱河造成了極大的恐慌歉摧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件估灿,死亡現(xiàn)場離奇詭異,居然都是意外死亡缤剧,警方通過查閱死者的電腦和手機馅袁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荒辕,“玉大人汗销,你說我怎么就攤上這事〉种希” “怎么了弛针?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長李皇。 經(jīng)常有香客問我削茁,道長,這世上最難降的妖魔是什么掉房? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任茧跋,我火速辦了婚禮,結果婚禮上卓囚,老公的妹妹穿的比我還像新娘瘾杭。我一直安慰自己,他們只是感情好捍岳,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布富寿。 她就那樣靜靜地躺著,像睡著了一般锣夹。 火紅的嫁衣襯著肌膚如雪页徐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天银萍,我揣著相機與錄音变勇,去河邊找鬼。 笑死贴唇,一個胖子當著我的面吹牛搀绣,可吹牛的內容都是我干的。 我是一名探鬼主播戳气,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼链患,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓶您?” 一聲冷哼從身側響起麻捻,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎呀袱,沒想到半個月后贸毕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡夜赵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年明棍,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寇僧。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡摊腋,死狀恐怖,靈堂內的尸體忽然破棺而出婉宰,到底是詐尸還是另有隱情歌豺,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布心包,位于F島的核電站类咧,受9級特大地震影響,放射性物質發(fā)生泄漏蟹腾。R本人自食惡果不足惜痕惋,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娃殖。 院中可真熱鬧值戳,春花似錦、人聲如沸炉爆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赴捞,卻和暖如春逼裆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背赦政。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工胜宇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恢着。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓桐愉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掰派。 傳聞我的和親對象是個殘疾皇子从诲,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容