使用java發(fā)送郵件

一、簡述發(fā)送和收取郵件的協(xié)議

SMTP

簡單郵件傳輸協(xié)議(Simple Mail Transfer Protocol,SMTP)由RFC 821定義。它定義了發(fā)送電子郵件的機(jī)制。在 JavaMail API 環(huán)境中,您基于 JavaMail 的程序?qū)⒑湍墓净蛞蛱鼐W(wǎng)服務(wù)供應(yīng)商的(Internet Service Provider's,ISP's)SMTP 服務(wù)器通信。SMTP 服務(wù)器會(huì)中轉(zhuǎn)消息給接收方 SMTP 服務(wù)器以便最終讓用戶經(jīng)由 POP 或 IMAP 獲得。這不是要求 SMTP 服務(wù)器成為開放的中繼,盡管 SMTP 服務(wù)器支持身份驗(yàn)證,不過還是得確保它的配置正確。像配置服務(wù)器來中繼消息或添加刪除郵件賬號這類任務(wù)的實(shí)現(xiàn),JavaMail API 中并不支持。

POP

POP 代表郵局協(xié)議(Post Office Protocol)。目前用的是版本 3,也稱 POP3,RFC 1939定義了這個(gè)協(xié)議。POP 是一種機(jī)制,因特網(wǎng)上大多數(shù)人用它得到郵件。它規(guī)定每個(gè)用戶一個(gè)郵箱的支持。這就是它所能做的,而這也造成了許多混淆。使用 POP 時(shí),用戶熟悉的許多性能并不是由 POP 協(xié)議支持的,如查看有幾封新郵件消息這一性能。這些性能內(nèi)建于如 Eudora 或 Microsoft Outlook 之類的程序中,它們能記住一些事,諸如最近一次收到的郵件,還能計(jì)算出有多少是新的。所以當(dāng)使用 JavaMail API 時(shí),如果您想要這類信息,您就必須自己算。

IMAP

IMAP 是更高級的用于接收消息的協(xié)議。在RFC 2060中被定義,IMAP 代表因特網(wǎng)消息訪問協(xié)議(Internet Message Access Protocol),目前用的是版本 4,也稱 IMAP4。在用到 IMAP 時(shí),郵件服務(wù)器必需支持這個(gè)協(xié)議。不能僅僅把使用 POP 的程序用于 IMAP,并指望它支持 IMAP 所有性能。假設(shè)郵件服務(wù)器支持 IMAP,基于 JavaMail 的程序可以利用這種情況 — 用戶在服務(wù)器上有多個(gè)文件夾(folder),并且這些文件夾可以被多個(gè)用戶共享。

因?yàn)橛羞@一更高級的性能,您也許會(huì)認(rèn)為所有用戶都會(huì)使用 IMAP。事實(shí)并不是這樣。要求服務(wù)器接收新消息,在用戶請求時(shí)發(fā)送到用戶手中,還要在每個(gè)用戶的多個(gè)文件夾中維護(hù)消息。這樣雖然能將消息集中備份,但隨著用戶長期的郵件夾越來越大,到磁盤空間耗盡時(shí),每個(gè)用戶都會(huì)受到損失。使用 POP,就能卸載郵件服務(wù)器上保存的消息了。

MIME

MIME 代表多用途因特網(wǎng)郵件擴(kuò)展標(biāo)準(zhǔn)(Multipurpose Internet Mail Extensions)。它不是郵件傳輸協(xié)議。但對傳輸內(nèi)容的消息、附件及其它的內(nèi)容定義了格式。這里有很多不同的有效文檔:RFC 822、RFC 2045RFC 2046RFC 2047。作為一個(gè) JavaMail API 的用戶,您通常不必對這些格式操心。無論如何,一定存在這些格式而且程序會(huì)用到它。


二、實(shí)現(xiàn)發(fā)郵件的功能

這里講到的是使用 JavaMail 功能、操作,發(fā)送郵件。

JavaMail 中用于發(fā)送郵件的類有 Session 類和 Transport 類,當(dāng)然也少不了 Message 類。它們之間的進(jìn)行工作的關(guān)系和步驟如下:

各個(gè)類的關(guān)系與操作流程:

1、創(chuàng)建一個(gè) Properties 對象,該類在 java.util 包中,以鍵-值對的形式設(shè)置郵件發(fā)送中需要用到的傳輸協(xié)議,如 SMTP 協(xié)議等;一般的 smtp 服務(wù)器都需要用戶身份認(rèn)證,所以這也要設(shè)置為 true ,以便向 smtp 服務(wù)器提交用戶名、密碼等信息;

2、先使用 Session 類中靜態(tài)的 getInstance() 或getDefaultInstance() 獲得自身對象,此時(shí)調(diào)用這兩個(gè)方法應(yīng)該傳入上面創(chuàng)建的 Properties 對象;

3、再用 Session 對象調(diào)用 getTransport() 方法獲得 Transport 抽象類的具體實(shí)現(xiàn)子類對象,如 MimeTransport 類;

4、將 Sesson 對象作為參數(shù)創(chuàng)建 MimeMessage 對象,即一封郵件,前面的文章已經(jīng)有所講述;

5、使用 MimeTransport 對象調(diào)用相關(guān)方法將 MimeMessage 對象發(fā)送出去。

由于前面的文章已經(jīng)寫了創(chuàng)建各類郵件的代碼,所以在這里就直接拿來用而不再編寫了,創(chuàng)建郵件的代碼放在本文的最后面。我們使用到了上篇文章中的 WithAttachmentMessage 類作為一封郵件,稍稍修改一下 from 和 to 就可以從不同的郵箱發(fā)送給不同的郵箱了。

以下為郵件發(fā)送的工具類

(以163網(wǎng)易郵箱為例,當(dāng)然qq郵箱、新浪等也是可以的)

package com.qianfeng.common.email;

import java.util.Properties;

import javax.mail.Message;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

public class SendEmail {

public static void sendEmailToUser(String sendAddress,String title,String content) throws Exception{

Properties properties = new Properties();

//設(shè)置服務(wù)器地址

properties.setProperty("mail.host", "smtp.163.com");

//設(shè)置郵件傳輸協(xié)議

properties.setProperty("mail.transport.protocol", "smtp");

//設(shè)置是否需要認(rèn)證服務(wù)器的用戶名和密碼

properties.setProperty("mail.smtp.auth", "true");

//創(chuàng)建一個(gè)Session對象

Session session = Session.getInstance(properties);

//得到發(fā)送郵件的對象 transport

Transport transport = session.getTransport();

//連接服務(wù)器

//參數(shù)1和參數(shù)2 是需要個(gè)人去163網(wǎng)易郵箱中去獲取的授權(quán)碼

transport.connect("smtp.163.com", " 參數(shù)1", "參數(shù)2 ");

//創(chuàng)建message對象

Message message = createSimpleEmail(session,sendAddress,title,content);

//發(fā)送郵件

transport.sendMessage(message, message.getAllRecipients());

transport.close();

}

private static Message createSimpleEmail(Session session, String sendAddress, String title, String content) throws Exception {

MimeMessage message = new MimeMessage(session);

//設(shè)置發(fā)件人

message.setFrom(new InternetAddress("xxx@163.com")); //參數(shù)為個(gè)人的郵箱名字

//設(shè)置郵件的接收人

message.setRecipient(Message.RecipientType.TO, new InternetAddress(sendAddress));

//設(shè)置郵件標(biāo)題

message.setSubject(title);

//設(shè)置郵件內(nèi)容

message.setContent(content, "text/html;charset=utf-8");

return message;

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文包括:1、名詞解釋2、郵件收發(fā)過程3、JavaMail 知識概要4、發(fā)送一封符合 MIME 協(xié)議的 JavaM...
    廖少少閱讀 4,291評論 2 13
  • Java Mail 簡介 常見的郵件協(xié)議包括:SMTP(Simple Mail Transfer Protocol...
    Josaber閱讀 3,413評論 1 9
  • 背景 近期需要實(shí)現(xiàn)一個(gè)郵件客戶端的項(xiàng)目,類似Foxmail,outlook客戶端。但項(xiàng)目只做消息轉(zhuǎn)發(fā),不需要完整實(shí)...
    BigBug77閱讀 4,653評論 0 4
  • 概述 郵件相關(guān)的標(biāo)準(zhǔn) 廠商所提供的 JavaMail 服務(wù)程序可以有選擇地實(shí)現(xiàn)某些郵件協(xié)議,常見的郵件協(xié)議包括: ...
    靜默虛空閱讀 2,222評論 -1 4
  • 曾經(jīng)在知乎上看到過一個(gè)很妙的關(guān)于為什么要閱讀的回答: 一個(gè)老農(nóng)住在山上的農(nóng)場里,和他的孫子一起。每一個(gè)早上爺爺都會(huì)...
    小馬君_Ellie閱讀 10,527評論 68 578

友情鏈接更多精彩內(nèi)容