java 發送郵件昵稱_利用JavaMail發送QQ郵件

一、RFC882文檔簡單說明

RFC882文檔規定了如何編寫一封簡單的郵件(純文本郵件),一封簡單的郵件包含郵件頭和郵件體兩個部分,郵件頭和郵件體之間使用空行分隔。

郵件頭包含的內容有:

from字段?  --用于指明發件人

to字段?  ????--用于指明收件人

subject字段??--用于說明郵件主題

cc字段?  ???-- 抄送,將郵件發送給收件人的同時抄送給另一個收件人,收件人可以看到郵件抄送給了誰

bcc字段?  ?-- 密送,將郵件發送給收件人的同時將郵件秘密發送給另一個收件人,收件人無法看到郵件密送給了誰

郵件體指的就是郵件的具體內容。

二、MIME協議簡單介紹

在我們的實際開發當中,一封郵件既可能包含圖片,又可能包含有附件,在這樣的情況下,RFC882文檔規定的郵件格式就無法滿足要求了。

MIME協議是對RFC822文檔的升級和補充,它描述了如何生產一封復雜的郵件。通常我們把MIME協議描述的郵件稱之為MIME郵件。MIME協議描述的數據稱之為MIME消息。

對于一封復雜郵件,如果包含了多個不同的數據,MIME協議規定了要使用分隔線對多段數據進行分隔,并使用Content-Type頭字段對數據的類型、以及多個數據之間的關系進行描述。

三、使用JavaMail創建郵件和發送郵件

JavaMail創建的郵件是基于MIME協議的。因此可以使用JavaMail創建出包含圖片,包含附件的復雜郵件。

3.1、JavaMail API的簡單介紹

9db3326e59e1443737110d228c1e6b5e.png

803dd1b87f4bfd905c34cf1292d552e7.png

177233d3492c4093b1ffd4603ac82066.png

四、開發前的準備

4.1、確保QQ郵箱已經授權

去到QQ郵箱首頁——>設置——>賬戶,滾動條拉到最下邊,確保紅框內開啟授權。

4f932e571d293cc23f7941b94c359fc2.png

4.2、選擇合適的Jar包

在Java SE環境下開發,使用最新版的JavaMail.jar(目前最新的是1.6.2版本)會報錯,錯誤原因和解決辦法網上也都有。但為了不那么麻煩,大家可以用版本較舊一點的Jar包,這樣就不會報錯了(本測試程序使用的Jar,https://mvnrepository.com/artifact/javax.mail/mail/1.4.7)。

4.3、發送簡單的郵件(純文本)

import java.util.Date;

import java.util.Properties;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

/**

* 只發送簡單的文本

* @author Snail

*

*/

public class SimpleEmail {

public static void main(String[] args) throws Exception {

Session session = Session.getInstance(getConfig());

// 開啟日志提示

session.setDebug(true);

MimeMessage mm = createMail(session, "1801888312@qq.com", "202132061@qq.com");

// 建立鏈接對象

Transport ts = session.getTransport();

ts.connect("你的QQ郵箱號碼", "前邊獲取的授權碼");

// 發送郵件

ts.sendMessage(mm, mm.getAllRecipients());

// 關閉鏈接

ts.close();

}

private static Properties getConfig() {

Properties props = new Properties();

// 使用的協議

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

// 郵箱的 SMTP 服務器地址(百度搜:qq郵箱的POP服務器地址是什么)

props.setProperty("mail.smtp.host", "smtp.qq.com");

// 郵箱的服務器端口

props.setProperty("mail.smtp.port", "465");

// 是否需要驗證用戶名密碼

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

// QQ郵箱的話需要進行SSL認證(javax.net.ssl.SSLSocketFactory這個類是jdk自帶的支持ssl認證)

props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

// 沒經過SSL認證的請求,不予處理

props.setProperty("mail.smtp.socketFactory.fallback", "false");

// SSL認證的端口號(一般和郵箱服務器端口號一致)

props.setProperty("mail.smtp.socketFactory.port", "465");

return props;

}

private static MimeMessage createMail(Session session, String from, String to) throws Exception {

// 郵件:收件人,發件人,標題,內容(附件,圖片)

MimeMessage mm = new MimeMessage(session);

// 發件人地址,發件人名字,字符編碼

mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));

// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送

// cc字段    -- 抄送,將郵件發送給收件人的同時抄送給另一個收件人,收件人可以看到郵件抄送給了誰

// bcc字段    -- 密送,將郵件發送給收件人的同時將郵件秘密發送給另一個收件人,收件人無法看到郵件密送給了誰

mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));

// 設置發送日期

mm.setSentDate(new Date());

// 設置標題

mm.setSubject("這是標題", "UTF-8");

// 正文內容

mm.setContent("

郵件的內容哦!可以寫HTML代碼的呢!

", "text/html;charset=UTF-8");

// 保存郵件

mm.saveChanges();

return mm;

}

}

4.4、發送帶圖片的郵件

Main方法和getConfig方法和前邊的一樣,只是createMail方法稍微有些改動,下面只貼出createMail方法中的代碼。注:dog.jpg是項目src目錄下存放的一張圖片。

private static MimeMessage createMail(Session session, String from, String to) throws Exception {

// 郵件:收件人,發件人,標題,內容(附件,圖片)

MimeMessage mm = new MimeMessage(session);

// 發件人地址,發件人名字,字符編碼

mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));

// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送

mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));

// 設置發送日期

mm.setSentDate(new Date());

// 設置標題

mm.setSubject("我愛中國", "UTF-8");

// 設置文字內容

MimeBodyPart text = new MimeBodyPart();

text.setContent("

圖片可愛嗎?

", "text/html;charset=utf-8");

// 設置圖片

// 挖個坑

MimeBodyPart image = new MimeBodyPart();

// 拿來蘿卜

DataHandler dh=new DataHandler(new FileDataSource("src/dog.jpg"));

// 把蘿卜種進去

image.setDataHandler(dh);

// 給蘿卜起個名字,供前邊的cid使用

image.setContentID("picture");

// 再聲明一個容器

MimeMultipart mp=new MimeMultipart();

// 把文字內容放進去

mp.addBodyPart(text);

// 把圖片內容放進去

mp.addBodyPart(image);

// 聲明兩者的關系

mp.setSubType("related");

// 把MimeMultipart放入到MimeMessage中

mm.setContent(mp);

// 保存郵件

mm.saveChanges();

return mm;

}

4.5、發送帶附件的郵件

private static MimeMessage createMail(Session session, String from, String to) throws Exception {

// 郵件:收件人,發件人,標題,內容(附件,圖片)

MimeMessage mm = new MimeMessage(session);

// 發件人地址,發件人名字,字符編碼

mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));

// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送

mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));

// 設置發送日期

mm.setSentDate(new Date());

// 設置標題

mm.setSubject("我愛中國", "UTF-8");

// 設置文字內容

MimeBodyPart text = new MimeBodyPart();

text.setContent("

這次給你發一個附件

", "text/html;charset=utf-8");

// 設置附件

// 挖個坑

MimeBodyPart file = new MimeBodyPart();

// 拿來蘿卜

DataHandler dh = new DataHandler(new FileDataSource("src/dog.jpg"));

// 把蘿卜種進去

file.setDataHandler(dh);

// 給蘿卜起個名字

file.setFileName(dh.getName());

// 再聲明一個容器

MimeMultipart mp = new MimeMultipart();

// 把文字內容放進去

mp.addBodyPart(text);

// 把附件放進去

mp.addBodyPart(file);

// 聲明兩者的關系

mp.setSubType("mixed");

// 把MimeMultipart放入到MimeMessage中

mm.setContent(mp);

// 保存郵件

mm.saveChanges();

return mm;

}

可以看出,與發送圖片只是稍微有點不同,主要不同點為 mp.setSubType()中的參數和圖片的cid以及附件的filename。

4.6、發送帶圖片和附件的郵件

private static MimeMessage createMail(Session session, String from, String to) throws Exception {

// 郵件:收件人,發件人,標題,內容(附件,圖片)

MimeMessage mm = new MimeMessage(session);

// 發件人地址,發件人名字,字符編碼

mm.setFrom(new InternetAddress(from, "發件人名字", "UTF-8"));

// 設置收件人,TO:普通收件人 CC:抄送 BCC:密送

mm.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(to, "普通收件人", "UTF-8"));

// 設置發送日期

mm.setSentDate(new Date());

// 設置標題

mm.setSubject("正文,圖片,附件", "UTF-8");

// 設置文字內容

MimeBodyPart text = new MimeBodyPart();

text.setContent("

這次既有附件,又有圖片

", "text/html;charset=utf-8");

// 挖個坑

MimeBodyPart image = new MimeBodyPart();

// 拿來蘿卜

DataHandler dh = new DataHandler(new FileDataSource("src/dog.jpg"));

// 把蘿卜種進去

image.setDataHandler(dh);

// 給蘿卜起個名字,供前邊的cid使用

image.setContentID("dog");

// 設置附件

MimeBodyPart file = new MimeBodyPart();

dh = new DataHandler(new FileDataSource("src/dog.jpg"));

file.setDataHandler(dh);

file.setFileName(dh.getName());

// 再聲明一個容器

MimeMultipart mp = new MimeMultipart();

// 把文字內容放進去

mp.addBodyPart(text);

// 把圖片放進去

mp.addBodyPart(image);

// 聲明兩者的關系

mp.setSubType("related");

MimeBodyPart text_image = new MimeBodyPart();

text_image.setContent(mp);

MimeMultipart mp1 = new MimeMultipart();

mp1.addBodyPart(text_image);

mp1.addBodyPart(file);

mp1.setSubType("mixed");

// 把MimeMultipart放入到MimeMessage中

mm.setContent(mp1);

// 保存郵件

mm.saveChanges();

return mm;

}

五、致謝

本文只是簡單的講了下一些理論和實戰知識,如果想更加深入地了解相關知識的話,下面一些鏈接或許會幫助到你。本文也對于下邊的文章有所參考,巧合的是,這些文章的作者都是同一個人,非常感謝這些文章的作者——孤傲蒼狼!該博主的其他文章質量也特別高,推薦大家去看看哦!。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529397.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529397.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java沒有timer類_Java中的Java.util.Timer類 - Break易站

scheduleAtFixedRate(TimerTask task, long delay, long period): java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)在指定的延遲語法后開始,為重復的固定速率執行調度指定的任務:public void scheduleAtFixedRate(TimerT…

java select下拉標簽_java中下拉框select和單選按鈕的回顯操作

前提:1.下拉框select請選擇部門selected"selected">${department.department}2.單選按鈕radio的回顯checked"checked">checked"checked">補充知識:java使用apache commons-fileupload組件實現文件上傳(控制文件上…

java 訪問控制權限_Java訪問控制權限有哪些?區別是什么?

原標題:Java訪問控制權限有哪些?區別是什么?Java中的類和方法等都是有訪問控制權限的,用來控制方法、類、屬性等的生效范圍,Java有四種訪問控制權限,其中比較常用的就是public和private,今天華清遠見Java學…

java 操作cursor數據庫_Java連接各種數據庫以及調用存儲過程

準備工作:1. 創建表drop table T_TEST_PROCEDURE cascade constraints;/**//*Table: T_TEST_PROCEDURE*//**/createtable T_TEST_PROCEDURE (IDNUMBER(19) not null,NAMEVARCHAR2(40),AGE NUMBER(3),constraintPK_T_TEST_PROCEDURE primary key (ID));2. 創建存儲過…

java 規格overview_《Java數據結構和算法》- OverView

Q: 不同數據結構的優缺點?數據結構優點缺點數組(Array)快速訪問,如果知道下標,就可以非常快地存取查找慢, 插入或刪除慢, 大小固定有序數組(OrderedArray)比無序的數組查找快插入或刪除慢,大小固定棧(Stack…

mysql 集群怎么卸載節點_Greenplum移除節點

基于某某原因,我們的Greenplum需要卸載一個節點(測試環境的Greenplum集群),由于該集群使用了很久,里面有許多開發所需要的數據,所以在卸掉一個節點后,還要保證數據不會丟失。當然,期間也遇到了點問題&#…

mysql2012更改表名_T-SQL入門攻略之13-修改數據表

--> Title : T-SQL入門攻略之13-修改數據表--> Author : wufeng4552--> Date : 2010-07-12修改表名與字段名—sp_rename--1修改表名SQL Server不直接提供修改表名的T-SQL語句,但是可以通過存儲過程實現語法格式:sp_rename tablename,newtabl…

python中不論類的名字是什么歌_Python自動猜歌名,還愁排名上不去嘛?

前言相傳,就在前幾日,在網上閑逛時,刷到了一個猜歌的小程序。這個小程序通過播放歌曲部分片段,然后讓用戶來猜它的歌名,大概是這樣的:作為一個腦熱的聽歌愛好者,于是他越陷越深,越刷…

java調用oracle存儲過程_做一點,記一點 ~ Java調用Oracle存儲過程

一、需求傳入一個參數,返回一條或多條記錄(列表)。二、實現步驟1. 編寫Oracle存儲過程。-- 聲明包和包體的語句應該分兩次執行,即使聲明在前定義在后,如果一起執行依然會編譯出錯--調用能夠返回多條記錄的存儲過程需要定義在包內--聲明包及包…

java 從控制臺讀取_轉載 java從控制臺讀取輸入的方法

import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class MainClass { public static void method1() { //使用Scanner Scanner scannernew Sca…

trace java_使用java動態字節碼技術簡單實現arthas的trace功能。

參考資料用過[Arthas]的都知道,Arthas是alibaba開源的一個非常強大的Java診斷工具。不管是線上還是線下,我們都可以用Arthas分析程序的線程狀態、查看jvm的實時運行狀態、打印方法的出入參和返回類型、收集方法中每個代碼塊耗時,甚至可以監控…

順時針小球圓周運動Java編程_如何使用CSS實現圓周運動小球的實例

我們時常在頁面中見到一些動畫效果,這些動畫效果,很多可以僅通過CSS來實現。在這里我們用到了CSS3的animation屬性。animation 屬性是一個簡寫屬性,用于設置六個動畫屬性:animation-name 規定需要綁定到選擇器的 keyframe 名稱。a…

java swing 外觀框架_【GUI】一、Swing外觀框架BeautyEye使用

一、Swing外觀框架BeautyEye使用1.1 導包1.2 使用BeautyEye L&Fpublic static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {// 國人牛逼主題,值得學習// 初始化字體InitGlobalFont(new Font("微軟雅黑", F…

static詳解java_java中static作用詳解

static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變量的概念。被static修飾的成員變量和成員方法獨立于該類的任何對象。也就是說,它不依賴類特定的實例&…

java基礎案例教程前4章知識點_java學習記錄4 Java基礎知識點

java學習記錄4 Java基礎知識點1. 注釋單行注釋使用“//”開頭,后面是注釋的內容一般在要注釋的語句的上面加注釋多行注釋以“/*”開頭,以“*/”結尾可以做行內注釋不可嵌套使用文檔注釋以“/**”開頭,以“*/”結尾用來給類和方法做注釋&#…

打印狗的健康值Java_嵌入式狗的JAVA之路 HTML 補課

學了JAVA WEB應用,補充一下HTML的標簽,常用的,不然頁面都畫不出來了~~test 標題,h1h2h3 3個字號test 段落link 鏈接 使用 Target 屬性,你可以定義被鏈接的文檔在何處顯示。下面的這行會在新窗口打開文檔:Vi…

mysql 表2符合表1_MYSQL-表1和表2中所有可能性的所有行

表用戶id, name1, Jay Bob2, An Other表格頁id, name, html1, Welcome, Welcome to this page2, Goodbye, Thanks for visiting表user_pages **存儲頁面的用戶特定版本**user_id, page_id, html1, 1, User id 1 Welcome page我基本上需要一個查詢,該查詢將為我返回以下數據集-即…

java引擎組件_Java 腳本引擎入門

Java Script EngineJava 腳本引擎可以將腳本嵌入Java代碼中,可以自定義和擴展Java應用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期還可能會換。腳本引擎包位于jav…

python 角度傳感器模擬_python樹莓派紅外反射傳感器

本文實例為大家分享了python樹莓派紅外反射傳感器的程序,供大家參考,具體內容如下1、工具rpi3,微雪ARPI600,Infrared Reflective Sensor2、基本原理Infrared Reflective Sensor 輸出數字和模擬信號模擬信號通過ARPI600上的AD轉換芯…

JAVA awt eventqueue_線程“AWT-EventQueue-1”中的異常java.lang.NullPointerException

嗨,我收到錯誤Exception in thread "AWT-EventQueue-1" java.lang.NullPointerExceptionat P6.itemStateChanged(P6.java:215)at javax.swing.AbstractButton.fireItemStateChanged(AbstractButton.java:2023)at javax.swing.AbstractButton$Handler.item…