在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

在Java中如何使用API來完成郵件的接收與發送

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-30 14:09 ? 次閱讀

電子郵件早已成為工作生活中不可缺少的部分,每個工作的人都會有自己的私人郵箱或企業郵箱,用來協助我們處理生活事務以及實現工作中的交流。

今天主要通過簡單的示例,了解在Java中如何使用API來完成郵件的接收與發送。

通過該篇文章我們可以有如下收獲:

  1. 了解基于Java的電子郵件客戶端的實現方式
  2. 了解常見的郵箱如何集成
  3. 認識郵箱中的IMAP與POP協議

適用場景

郵件和短信很像,將信息發送到目的用戶,不需要用戶在線,基于郵件服務器,完成消息的存儲與轉發。一般公司都會有自己的企業郵箱,主要也是為了保證數據的安全性??赡苣闫綍r在注冊網站時,需要通過郵件來接收驗證消息完成認證流程;或者每天打開郵箱收到的各種訂閱消息等等。

  1. 基于電子郵件的通信與交流
  2. 接收驗證消息,實現用戶認證
  3. 發送郵件提供消息通知

說明

電子郵件在Internet上發送和接收的原理與我們通過郵局發信件非常相類似:首先要找到任何一個郵局,填寫郵件收件人姓名、地址等信息, 之后信件就會寄到收件人所在地的郵局,對方需要到相應的郵局才能取出信件。同樣,在發送電子郵件時,郵件是由郵件發送服務器發出, 根據收信人的地址匹配目的郵件接收服務器,收信人收取郵件需要訪問這個服務器才能取件。

郵件的發送與接收都需要基于特定的通信協議,發郵件時基于SMTP協議,收郵件時基于POP3、IMAP協議。

  • SMTP
    SMTP 的全稱是“Simple Mail Transfer Protocol”,即簡單郵件傳輸協議,是用于發送電子郵件的協議。它是一組用于從源地址到目的地址傳輸郵件的規范,通過它來控制郵件的中轉方式。SMTP 協議屬于 TCP/IP 協議簇,它幫助每臺計算機在發送或中轉信件時找到下一個目的地。SMTP 服務器就是遵循 SMTP 協議的發送郵件服務器。
  • IMAP
    IMAP(Internet Message Access Protocol)Internet郵件訪問協議,是用于接收電子郵件的協議。IMAP不用對服務器上面的郵件進行全部下載(根據實際需要進行下載),可以通過郵件客戶端對郵件進行操作;IMAP提供了WebMail與郵件客戶端之間的雙向通信,以及客戶端上的操作(如閱讀、刪除、移動郵件等)。
  • POP3
    POP3(Post Office Protocol version 3)郵局協議的第3個版本,同樣用于接收電子郵件的協議。POP3可以讓你下載郵件服務器上的郵件(下載所有未讀郵件),在郵件從服務器發送到電腦的同時刪除郵件服務器上的郵件(目前很多郵件服務器都支持“下載郵件,不刪除郵件,或者發出提醒”)。

POP允許電子郵件客戶端下載服務器上的郵件,但是您在電子郵件客戶端的操作(如:移動郵件、標記已讀等),這是不會反饋到服務器上的, 比如:您通過電子郵件客戶端收取了QQ郵箱中的3封郵件并移動到了其他文件夾,這些移動動作是不會反饋到服務器上的,也就是說,QQ郵箱服務器上的這些郵件是沒有同時被移動的。但是IMAP就不同了,電子郵件客戶端的操作都會反饋到服務器上,您對郵件進行的操作(如:移動郵件、標記已讀等),服務器上的郵件也會做相應的動作。也就是說,IMAP是“雙向”的。同時,IMAP可以只下載郵件的主題,只有當您真正需要的時候,才會下載郵件的所有內容。

如果感興趣可以深入了解這幾個協議的具體實現與規范,這里我們只用知道,與郵箱服務器對接時,是基于這幾個協議來實現通信,什么時候用什么協議即可。后面示例中會有用到。

郵箱與協議

如果要完成郵件的發送,我們需要知道用戶通過服務器將郵件發送給 ,這里的用戶指的是發件方,需要明確我們的發件地址, 誰即對方的郵箱地址,郵箱地址主要郵3個部分組成, 用戶名 @ 郵件服務器域名 ,比如123456@qq.com,tom@gmail.com等等, 上面說到的服務器與域名對應。

在編寫示例前,需要先了解我們用到郵箱的一些信息,比如實現基于qq郵箱的郵件發送以及收取時,我們必須知道其郵箱服務器對應的協議服務地址以及端口, 下面是幾個常見的協議信息:

  • 126郵箱
協議類型協議功能服務器地址非SSL端口SSL端口號
SMTP發送郵件smtp.126.com25465、994
POP接收郵件pop.126.com110995
IMAP接收郵件imap.126.com143993
  • 163郵箱
協議類型協議功能服務器地址非SSL端口SSL端口號
SMTP發送郵件smtp.163.com25465
POP接收郵件pop.163.com110995
IMAP接收郵件imap.163.com143993
  • QQ郵箱
協議類型協議功能服務器地址非SSL端口SSL端口號
SMTP發送郵件smtp.qq.com25465、587
POP接收郵件pop.qq.com110995
IMAP接收郵件imap.qq.com143993
  • Gmail郵箱
協議類型協議功能服務器地址非SSL端口SSL端口號
SMTP發送郵件smtp.gmail.com465、587
POP接收郵件pop.gmail.com995
IMAP接收郵件imap.gmail.com993

實例

在Java中我們可以基于JavaMail API實現郵件的發送與讀取,由于我使用的是JDK17,所以選用的是jakarta.mail.jar完成今天的示例。

在Spring中同樣提供了郵件的支持,我們可以在項目中通過引入spring-boot-starter-mail來集成,下面分別來看下如何實現郵件的收發功能。示例以QQ郵件為例,比如我的郵箱地址為409835152@qq.com,下面來看看具體實現過程

  • 發送郵件
  1. 引入依賴
< dependency >
      < groupId >org.springframework.boot< /groupId >
      < artifactId >spring-boot-starter-mail< /artifactId >
      < version >${spring-boot.version}< /version >
  < /dependency >
  1. 添加application配置
spring:
  mail:
    host: smtp.qq.com
    port: 25
    protocol: smtp
    username: 409835152@qq.com
    password: '******'

這里主要配置了郵箱地址,和上面說到的協議類型、服務地址以及端口,最后還有一個密碼,注意這里不是郵箱登錄密碼,我們需要單獨申請,這個在各個郵箱中都有申請入口,比如qq郵箱中:

圖片

點擊“管理服務”在新的頁面中通過“生成授權碼”按流程申請即可,注意不要泄露!!!

圖片

  1. 編寫郵件發送服務
@Service
public class EmailQQService {

    @Resource
    private JavaMailSender javaMailSender;

    @Resource
    private MailProperties mailProperties;

    public void sendEmail(Email email){
      SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
      simpleMailMessage.setFrom(mailProperties.getUsername()); //設置發送郵件賬號
      simpleMailMessage.setTo(email.getTo()); //設置接收郵件的人,可以多個
      simpleMailMessage.setSubject(email.getSubject()); //設置發送郵件的主題
      simpleMailMessage.setText(email.getText()); //設置發送郵件的內容
      javaMailSender.send(simpleMailMessage);
    }
}

主要指定發送目標對象的郵箱地址,郵件主題以及郵件內容等即可??梢钥吹?,基于spring提供的工具,郵件的發送變得非常簡單。

  • 郵件的接收

在Spring中沒有提供這樣的工具類,需要我們自己寫:

@Service
public class QqEmailService {
    
    public List< Email > receiveEmail() throws MessagingException, IOException {
        Properties properties = configProperties();
        Store store = createStore( properties );
        List< Email > emails = receive(store);
        store.close();
        return emails;
    }

}
  1. 添加接收服務相關的配置,包括協議、服務地址、端口
private Properties configProperties(){
        // 配置郵件服務器
        Properties properties = new Properties();
        properties.setProperty("mail.store.protocol", receiveMailProperties.getProtocol());
        properties.setProperty("mail.imap.host", receiveMailProperties.getHost());
        properties.setProperty("mail.imap.port", receiveMailProperties.getPort());
        return properties;
    }
  1. 創建Session與Store
private Store createStore(Properties properties) throws MessagingException {
        // 創建Session實例對象
        Session session = Session.getInstance( properties );
        // 創建IMAP協議的Store對象
        Store store = session.getStore("imap");
        // 連接郵件服務器
        store.connect(mailProperties.getUsername(), mailProperties.getPassword());
        return store;
    }
  1. 從服務器讀取郵件
private List< Email > receive(Store store) throws MessagingException, IOException {
        // 獲得收件箱
        Folder folder = store.getFolder("INBOX");
        // 以讀寫模式打開收件箱
        folder.open(Folder.READ_WRITE);
        // 各狀態郵件數量
        System.out.println(String.format("收件箱郵件總數:%s,其中,新郵件數:%s,未讀郵件數:%s,",folder.getMessageCount(), folder.getUnreadMessageCount(), folder.getNewMessageCount()));
        // 獲得收件箱的郵件列表
        Message[] messages = folder.getMessages(folder.getMessageCount()-5, folder.getMessageCount());
        System.out.println("------------------------開始解析郵件----------------------------------");
        List< Email > emailList = new ArrayList<  >();
        for (Message message : messages) {
            Email email = new Email()
                    .setFrom(Arrays.stream(message.getFrom()).map(address - > ((InternetAddress)address).getAddress()).collect(Collectors.joining()))
                    .setSubject(message.getSubject())
                    .setContentType(message.getContentType())
                    .setSendDate(message.getSentDate())
                    .setReceiveDate(message.getReceivedDate());


            System.out.println(String.format(" >> >> > 郵件來自:%s,主題:%s,接收時間:%s", email.getFrom(),
                    email.getSubject(),
                    DateFormatUtils.format(email.getReceiveDate(), DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT.getPattern()))
            );
            email.setEmailContents(resolveMessage(message.getContentType(), message));
            System.out.println(String.format("郵件內容:%s" , email.getEmailContents()));
            emailList.add(email);
        }
        // 關閉資源
        folder.close(false);
        return emailList;
    }
  1. 解析郵件內容,郵件除了文字,還有圖片,需要根據消息內容類型進行解析,當然發送消息的時候,同樣支持各種類型的消息,具體可以JavaMailSender的實現類
private List< EmailContent > resolveMessage(String contentType, Message message) throws MessagingException, IOException {
        List< EmailContent > emailContents = new ArrayList<  >();
        resolveMessageContent( message.getContent(), message, emailContent- >{
            emailContents.add(emailContent);
        } );
//        return content.toString();
        return emailContents;
    }

    private void resolveMessageContent(Object content, Object parent, Consumer< EmailContent > emailContentConsumer) throws MessagingException, IOException {
        if( content instanceof String ){
            emailContentConsumer.accept( new EmailContent(EmailContent.Type.TEXT, (String) content) );
        }else if( content instanceof MimeMultipart){
            MimeMultipart multipart = (MimeMultipart) content;
            int count = multipart.getCount(), index = -1;
            while ( count > ++index ){//  0:純文本;1:html內容
                BodyPart bodyPart = multipart.getBodyPart(index);
                Object partContent = bodyPart.getContent();
                resolveMessageContent( partContent, bodyPart, emailContentConsumer);
            }
        }else if( content instanceof BASE64DecoderStream){
            File file = new File(((IMAPBodyPart) parent).getFileName());
            ((BASE64DecoderStream) content).transferTo( new FileOutputStream( file ) );
            emailContentConsumer.accept( new EmailContent(EmailContent.Type.FILE, file.getAbsolutePath()) );
        }else {
            System.out.println(" >> >> >> >> >> >> >> >> 郵件內容類型: "+ content.getClass() );
            emailContentConsumer.accept( new EmailContent(EmailContent.Type.TEXT, content.toString()) );
        }
    }
  1. 關閉store
store.close();

代碼有點多,但是流程不復雜且比較清晰。到這里一個簡單的針對qq郵箱的郵件發送與接收示例就完成了。不管是收郵件還是發郵件其關鍵點是:

  1. 郵件收發對應的協議類型、服務地址、服務端口
  2. 發送郵件用戶的郵箱地址與授權碼
  3. 目標郵箱地址

剩下的都是些簡單API調用的過程

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 服務器
    +關注

    關注

    12

    文章

    9332

    瀏覽量

    86132
  • JAVA
    +關注

    關注

    19

    文章

    2976

    瀏覽量

    105211
  • API
    API
    +關注

    關注

    2

    文章

    1518

    瀏覽量

    62448
  • 郵件
    +關注

    關注

    0

    文章

    32

    瀏覽量

    18823
  • 傳輸協議
    +關注

    關注

    0

    文章

    79

    瀏覽量

    11498
收藏 人收藏

    評論

    相關推薦

    郵件發送表單數據

    郵件發送表單數據收錄日期 : 2000-08-21  使用PHP 向一個指定的郵箱發送數據是非常簡單的一件事情,以至于你可能會想,為什么人們不每天用它呢
    發表于 01-11 09:24

    用SpringMVC發送郵件

    1、SpringMVC實現發送郵件  今天來試著用SpringMVC發送郵件,主要需要依賴以下兩個包;  《!--spring發送
    發表于 10-21 14:47

    LPSPI_MasterTransferEDMA 此 api可用于為dma或單獨的api發送接收數據嗎?

    我正在使用 mimxrt1170 我完成了示例我沒有找到單獨的 api 用于接收 dma 的數據所以 LPSPI_MasterTransferEDMA 這個 api 可以用于
    發表于 03-15 08:43

    高手總結java常用API(免費下載)

    高手總結java常用API(免費下載)。
    發表于 11-06 11:27 ?0次下載

    使用Java API技巧分析

    本文介紹了一些關于Java API安全和性能方面的簡單易用的技巧,其中包括保證API Key安全和開發Web Service方面框架方面
    發表于 09-27 14:09 ?3次下載

    如何向您選擇的某人發送電子郵件

    您可以通過單擊左側的“發送”選項卡確認您的電子郵件是否已發送。它將顯示您發送的所有電子郵件。如
    的頭像 發表于 12-13 16:35 ?5083次閱讀
    如何向您選擇的某人<b class='flag-5'>發送電子郵件</b>

    如何利用Stream API優化Java代碼

    使用Stream API優化代碼 Java8的新特性主要是Lambda表達式和流,當流和Lambda表達式結合起來一起使用時,因為流申明式處理數據集合的特點,可以讓代碼變得簡潔易讀 放大招,流
    的頭像 發表于 07-26 14:30 ?1344次閱讀

    基于SpringBoot實現郵件發送

    本項目通過Springboot發送email郵件,包括普通文本郵件 、HTML內容板式郵件 、包含靜態資源郵件以及帶附件
    的頭像 發表于 02-28 14:58 ?1320次閱讀
    基于SpringBoot實現<b class='flag-5'>郵件</b><b class='flag-5'>發送</b>

    如何用python發送接收郵件

    SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協議,它是一組用于由源地址到目的地址傳送郵件的規則,由它控制信件的中轉方式。
    的頭像 發表于 07-11 09:30 ?985次閱讀
    如何用python<b class='flag-5'>發送</b><b class='flag-5'>接收</b><b class='flag-5'>郵件</b>

    基于Java的接口快速開發框架——magic-api

    magic-api 是一個基于Java的接口快速開發框架,編寫接口將通過magic-api提供的UI界面完成,自動映射為HTTP接口,無需定義Controller、Service、Da
    發表于 07-19 11:42 ?974次閱讀
    基于<b class='flag-5'>Java</b>的接口快速開發框架——magic-<b class='flag-5'>api</b>

    怎么用Python構建一個自動發送郵件的腳本

    自動發送郵件能應用于許多場景,比如我想要知道股票策略的股票池是否有實時的更新,這時候如果再拉一遍數據,跑一遍腳本,實在是太浪費時間了。為什么不把這一套流程放到服務器上,然后到點自動運行并發送
    的頭像 發表于 10-21 14:47 ?811次閱讀
    怎么用Python構建一個自動<b class='flag-5'>發送</b><b class='flag-5'>郵件</b>的腳本

    怎么用Python構建一個自動發送郵件的腳本

    自動發送郵件能應用于許多場景,比如我想要知道股票策略的股票池是否有實時的更新,這時候如果再拉一遍數據,跑一遍腳本,實在是太浪費時間了。為什么不把這一套流程放到服務器上,然后到點自動
    的頭像 發表于 10-31 16:36 ?604次閱讀
    怎么用Python構建一個自動<b class='flag-5'>發送</b><b class='flag-5'>郵件</b>的腳本

    如何用Python批量定制化發送郵件

    一封精美的元旦祝福郵件,但是郵件的內容——比如姓名、祝福語等應該怎樣動態渲染呢?答案是jinja2. jinja2 是一個Python 的模板引擎,使用jinja2,我們能夠郵件HT
    的頭像 發表于 11-01 11:32 ?2729次閱讀

    如何使用Python編寫腳本來自動發送郵件

    Python是一種非常流行的編程語言,可以用于多種用途,包括自動化任務。其中一個常見的自動化任務是自動發送郵件。本文中,我們將介紹如何使用Python編寫腳本來自動發送
    的頭像 發表于 12-07 11:36 ?1437次閱讀

    Java集合API的改進介紹

    解答這些問題。 我們將逐步學習 Java 集合類的優化過程,并按版本逐一對比分析。主要討論的焦點將包括 JDK 1.0、1.2、1.4、1.5、1.6、1.8、9、10、11 和 21 版本的 Java 集合功能 Java 集合
    的頭像 發表于 11-22 11:12 ?268次閱讀
    <b class='flag-5'>Java</b>集合<b class='flag-5'>API</b>的改進介紹
    主站蜘蛛池模板: 久久香蕉精品视频 | 一级片在线免费 | 天天做天天爱夜夜想毛片 | 久久riav国产精品 | 边做边爱在线观看视频免费 | 99香蕉精品视频在线观看 | 天天操天天干视频 | 伊人精品网| 国产精品你懂的在线播放 | 天天视频国产免费入口 | 天天干天天干天天干天天干天天干 | 欧美极品色影院 | 夜夜操美女 | 日本一区二区高清免费不卡 | 国产叼嘿视频免费网站 | 日本aaaa级毛片在线看 | www.九色视频 | 中文字幕在线永久在线视频2020 | 色偷偷成人 | 在线观看免费av网 | 99精品热| 成人影院久久久久久影院 | 欧美刺激午夜性久久久久久久 | 高hnp汁水bl总受软萌受 | 明日花绮罗snis-862在线播放 | 国产大片黄在线看免费 | 妖精视频一区二区三区 | 丁香婷婷亚洲六月综合色 | 色aaa| 美女网战色 | 免费一级片在线观看 | 狠狠五月天 | 色亚洲欧美 | 四虎三级 | 色两性网欧美 | 午夜视频福利在线观看 | 日本特黄特色大片免费播放视频 | 亚洲午夜精品久久久久 | 一女被多男玩很肉很黄文 | 亚洲αv久久久噜噜噜噜噜 亚洲аv电影天堂网 | 美女丝袜长腿喷水gif动态图 |