成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

java通過smtp服務 給指定郵箱發(fā)送郵件含附件

mingzhong / 2074人閱讀

摘要:其中部分第三方郵箱可以實現(xiàn)用自己的域名來接發(fā)郵件,例如本文中介紹的是第二種方法,用騰訊企業(yè)郵箱為例參考借鑒的大神的原文地址這里重點只說明一下,騰訊企業(yè)郵箱來實現(xiàn)發(fā)郵件,代碼的部分。


用程序發(fā)郵件首先需要一個smtp服務器,

雖然說網(wǎng)上也有自建服務器的教程,但是由于工程量大,

還要兼容各大郵箱廠商,有可能發(fā)送失敗或被歸為垃圾郵件。

所以不推薦自建smtp服務器實現(xiàn)。

推薦是有2種方法來實現(xiàn) 第三方郵箱發(fā)郵件

1、買類似阿里云的smtp資源包(阿里云 1000條 / 2元)

2、申請一個騰訊、網(wǎng)易163的郵箱,開通smtp服務端口,借由他們的服務器來轉(zhuǎn)發(fā)。

(其中部分第三方郵箱可以實現(xiàn)用自己的域名來接發(fā)郵件,例如[email protected]

本文中介紹的是第二種方法,用騰訊企業(yè)郵箱為例

參考借鑒的大神的原文地址:https://www.cnblogs.com/LUA123/p/5575134.html

這里重點只說明一下,騰訊企業(yè)郵箱 + javamail 來實現(xiàn)發(fā)郵件,代碼的部分。

其他郵箱,例如個人的qq郵箱 163郵箱也可以用這個方法實現(xiàn),申請和設置方法借鑒百度吧

補充一下!騰訊企業(yè)郵箱和qq郵箱方法有幾個不同,我在末尾加了qq郵箱的方案

正文開始

先說騰訊企業(yè)郵箱

maven


    javax.mail
    mail
    1.4.7

另外我用到了一個 StringUtils.isNotBlank() 方法 可以選擇引入以下maven依賴,也可以改寫成 xxx != null && !"".equals(xxx) 等價的代碼


    org.apache.commons
    commons-lang3
    3.7

java 工具類

需要把 用戶名、密碼、發(fā)件人別名 等參數(shù)填成你自己申請的

package com.gemini.common.utils;
 
 
import com.sun.mail.util.MailSSLSocketFactory;
import org.apache.commons.lang.StringUtils;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
 
public class EmailUtils {
 
    // 騰訊企業(yè)郵箱 也可以換成別家的
    private static final String protocol = "smtp";// 協(xié)議
    private static final String host = "smtp.exmail.qq.com";// 地址
    private static final String port = "465";// 端口
    private static final String account = "用戶名";// 用戶名
    private static final String pass = "密碼";// 密碼
    private static final String personal = "發(fā)件人別名(選填)";// 發(fā)件人別名,不需要設為空串或null
 
    // 權(quán)限認證
    static class MyAuthenricator extends Authenticator {
        String u = null;
        String p = null;
 
        public MyAuthenricator(String u, String p) {
            this.u = u;
            this.p = p;
        }
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(u, p);
        }
    }
 
    /**
     * 發(fā)送郵件工具方法
     *
     * @param recipients 收件人
     * @param subject    主題
     * @param content    內(nèi)容
     * @param fileStr    附件路徑
     * @return true/false 發(fā)送成功
     */
    public static boolean sendEmail(String recipients, String subject, String content, String fileStr) {
        Properties prop = new Properties();
        //協(xié)議
        prop.setProperty("mail.transport.protocol", protocol);
        //服務器
        prop.setProperty("mail.smtp.host", host);
        //端口
        prop.setProperty("mail.smtp.port", port);
        //使用smtp身份驗證
        prop.setProperty("mail.smtp.auth", "true");
        //使用SSL,企業(yè)郵箱必需!
        //開啟安全協(xié)議
        MailSSLSocketFactory mailSSLSocketFactory = null;
        try {
            mailSSLSocketFactory = new MailSSLSocketFactory();
            mailSSLSocketFactory.setTrustAllHosts(true);
        } catch (GeneralSecurityException e1) {
            e1.printStackTrace();
        }
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", mailSSLSocketFactory);
 
        Session session = Session.getDefaultInstance(prop, new MyAuthenricator(account, pass));
        session.setDebug(true);
        MimeMessage mimeMessage = new MimeMessage(session);
        try {
            //發(fā)件人
            if (StringUtils.isNotBlank(personal))
                mimeMessage.setFrom(new InternetAddress(account, personal));//可以設置發(fā)件人的別名
            else
                mimeMessage.setFrom(new InternetAddress(account));//如果不需要就省略
            //收件人
            mimeMessage.addRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
            //主題
            mimeMessage.setSubject(subject);
            //時間
            mimeMessage.setSentDate(new Date());
            //容器類,可以包含多個MimeBodyPart對象
            Multipart mp = new MimeMultipart();
 
            //MimeBodyPart可以包裝文本,圖片,附件
            MimeBodyPart body = new MimeBodyPart();
            //HTML正文
            body.setContent(content, "text/html; charset=UTF-8");
            mp.addBodyPart(body);
 
            //添加圖片&附件
            if(StringUtils.isNotBlank(fileStr)){
                body = new MimeBodyPart();
                body.attachFile(fileStr);
                mp.addBodyPart(body);
            }
 
            //設置郵件內(nèi)容
            mimeMessage.setContent(mp);
            //僅僅發(fā)送文本
            //mimeMessage.setText(content);
            mimeMessage.saveChanges();
            Transport.send(mimeMessage);
            // 發(fā)送成功
            return true;
        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return false;
    }
 
    public static void main(String[] args) {
        sendEmail("你的郵箱地址","test","test",null);
    }
}

關于上述方案,適用于一般的郵箱申請(騰訊企業(yè)郵箱、網(wǎng)易郵箱),但不適用于qq郵箱,原因是qq郵箱目前只接受授權(quán)碼方案登錄,官方的解釋是“溫馨提示:在第三方登錄QQ郵箱,可能存在郵件泄露風險,甚至危害Apple ID安全,建議使用QQ郵箱手機版登錄。?繼續(xù)獲取授權(quán)碼登錄第三方客戶端郵箱??!?/p>

使用上述方法登錄qq郵箱會遇到報錯

javax.mail.AuthenticationFailedException: 535 Error: ??ê1ó?êúè¨??μ????£?ê?é???′:?http://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

如圖

意思就是不支持直接用默認密碼登錄,必須去申請一個授權(quán)碼作為密碼登錄

其實流程和工具類都一樣就重點說?2個不一樣的地方

1、密碼不是你的郵箱密碼了,而是授權(quán)碼。

獲取方式 [登錄郵箱] - [設置] - [賬戶] ,然后如下圖找到POP3/SMTP服務的下面,有一句溫馨提示 先點 [生成授權(quán)碼] ,再根據(jù)提示獲取到授權(quán)碼。

授權(quán)碼就是javamail里的password

2、host不同

騰訊企業(yè)郵箱的host是

private static final String host = "smtp.exmail.qq.com";// 地址

普通qq郵箱的host是

private static final String host = "smtp.qq.com";// 地址

修改這兩個地方即可適用于個人普通的qq郵箱

最終效果如下

另外本文也發(fā)布在了我的個人博客:?https://zzzmh.cn/single?id=49

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/73048.html

相關文章

  • 簡單三步,用 Python 發(fā)郵件

    摘要:使用腳本發(fā)送郵件并不復雜。以下為思路導圖模塊與發(fā)送郵件相關的模塊是關于簡單郵件傳輸協(xié)議的操作模塊,在發(fā)送郵件的過程中起到服務器之間互相通信的作用。 0. 前言 發(fā)送電子郵件是個很常見的開發(fā)需求。比如你寫了個監(jiān)控天氣的腳本,發(fā)現(xiàn)第二天要下雨,或者網(wǎng)站上關注的某個商品降價了,就可以發(fā)個郵件到郵箱來提醒自己。 使用 Python 腳本發(fā)送郵件并不復雜。不過由于各家郵件的發(fā)送機制和安全策略不同...

    haobowd 評論0 收藏0
  • python發(fā)送郵件

    摘要:參數(shù)分別表示主機和端口。注意也可以在參數(shù)中指定端口號如,這樣就沒必要給出參數(shù)。當需要發(fā)送附件的時候使用的就是這個類的一個子類。主要用來發(fā)送圖片普通文本郵件文本對象,其中是郵件內(nèi)容,郵件類型,可以是普通文本郵件,郵件編碼,可以是等等。 python發(fā)送郵件 準備 python中發(fā)送郵件主要用的是smtplib和email兩個模塊,下面主要對這兩個模塊進行講解 在講解之前需要準備至少兩個...

    mengera88 評論0 收藏0
  • Spring Boot 2.x (十八):郵件服務一文打盡

    摘要:前景介紹在日常的工作中,我們經(jīng)常會用到郵件服務,比如發(fā)送驗證碼,找回密碼確認,注冊時郵件驗證等,所以今天在這里進行郵件服務的一些操作。 前景介紹 在日常的工作中,我們經(jīng)常會用到郵件服務,比如發(fā)送驗證碼,找回密碼確認,注冊時郵件驗證等,所以今天在這里進行郵件服務的一些操作。 大致思路 我們要做的其實就是把Java程序作為一個客戶端,然后通過配置SMTP協(xié)議去連接我們所使用的發(fā)送郵箱(fr...

    idealcn 評論0 收藏0
  • 結(jié)合Spring發(fā)送郵件的四種正確姿勢,你知道幾種?

    摘要:我拿網(wǎng)易郵箱賬號舉例子,那么我們?nèi)绾尾拍茏屇愕泥]箱賬號可以利用第三方發(fā)送郵件這里的第三方就是我們即將編寫的程序。 一 前言 測試所使用的環(huán)境 測試使用的環(huán)境是企業(yè)主流的SSM 框架即 SpringMVC+Spring+Mybatis。為了節(jié)省時間,我直接使用的是我上次的SSM項目中整合Echarts開發(fā)該項目已經(jīng)搭建完成的SSM環(huán)境。 標題說的四種姿勢指的是哪四種姿勢? 發(fā)送text...

    doodlewind 評論0 收藏0
  • 利用Python自動發(fā)送郵件

    摘要:自動發(fā)送郵件我們把報表做出來以后一般都是需要發(fā)給別人查看,對于一些每天需要發(fā)的報表或者是需要一次發(fā)送多份的報表,這個時候可以考慮借助來自動發(fā)送郵件。一份郵件的組成下圖是中發(fā)送一份郵件的界面,主要包含發(fā)件人收件人抄送人主題正文附件這幾部分。 ...

    leo108 評論0 收藏0

發(fā)表評論

0條評論

mingzhong

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<