電子郵件的應(yīng)用非常廣泛,例如在某網(wǎng)站注冊了一個賬戶胧后,自動發(fā)送一封歡迎郵件芋浮,通過郵件找回密碼,自動批量發(fā)送活動信息等壳快。但這些應(yīng)用不可能和我們自己平時發(fā)郵件一樣纸巷,先打開瀏覽器,登錄郵箱濒憋,創(chuàng)建郵件再發(fā)送何暇。本文將簡單介紹如何通過 Java 代碼來創(chuàng)建電子郵件,并連接郵件服務(wù)器發(fā)送郵件凛驮。
現(xiàn)在裆站,我們來先來了解一下電子郵件協(xié)議SMTP 是 Simple Mail Transfer Protocol 的簡稱,即簡單郵件傳輸協(xié)議黔夭。電子郵件的在網(wǎng)絡(luò)中傳輸和網(wǎng)頁一樣需要遵從特定的協(xié)議宏胯,常用的電子郵件協(xié)議包括 SMTP,POP3本姥,IMAP肩袍。其中郵件的創(chuàng)建和發(fā)送只需要用到 SMTP協(xié)議,所以本文也只會涉及到SMTP協(xié)議婚惫。
我們再來了解一下開發(fā)javamail程序必備的jar包——javax.mail.jar氛赐,Java 官方提供了對電子郵件協(xié)議封裝的 Java 類庫,就是JavaMail先舷,但并沒有包含到標(biāo)準(zhǔn)的 JDK 中艰管,需要我們自己去下載。
JavaMail 下載地址:https://github.com/javaee/javamail/releases
jar包下載好后蒋川,我們還需要有一個郵箱賬號去發(fā)送牲芋,這里我們選用163郵箱為例子,郵箱賬號必須要開啟 SMTP 服務(wù),在瀏覽器網(wǎng)頁登錄郵箱后一般在郵箱的“設(shè)置”選項中可以開啟缸浦,并記下郵箱的 SMTP 服務(wù)器地址
下面我們就開始寫java程序了夕冲。
首先創(chuàng)建一個 Java 工程,把下載好的javax.mail.jar作為類庫加入工程裂逐。
下面介紹javaMail發(fā)送簡單文本的實例:
package com.xx.javaMaildome;
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;
public class Mail {
public static String myEmailAccount="*************@163.com";//我的賬號
public static String myEmailPassword="***********";//賬號密碼
public static String myEmailSMTPHost="smtp.163.com";//發(fā)件人郵箱的 SMTP 服務(wù)器地址
public static String receiveMailAccount="***********@qq.com";//收件人郵箱
public static void main(String[] args)throws Exception
{
//1.創(chuàng)建參數(shù)配置歹鱼,用于連接郵件服務(wù)器的參數(shù)配置
Properties properties=new Properties();
properties.setProperty("mail.transport.protocol", "smtp");//使用的協(xié)議(JavaMail規(guī)范要求)
properties.setProperty("mail.smtp.host", myEmailSMTPHost);//發(fā)件人的郵箱的 SMTP 服務(wù)器地址
properties.setProperty("mail.smtp.auth", "true");//需要請求認(rèn)證
// 2. 根據(jù)配置創(chuàng)建會話對象, 用于和郵件服務(wù)器交互
Session session=Session.getInstance(properties);
session.setDebug(true);//設(shè)置為debug模式,可以查看詳細(xì)的發(fā)送log
//3.創(chuàng)建一封郵件
MimeMessage message=createMimeMessage(session, myEmailAccount, receiveMailAccount);
//4.根據(jù)session獲取郵件傳輸對象
Transport transport=session.getTransport();
transport.connect(myEmailAccount, myEmailPassword);
transport.sendMessage(message,message.getAllRecipients());
transport.close();//關(guān)閉連接
System.out.println("郵件發(fā)送成功");
}
/**
* 創(chuàng)建一封只包含文本的簡單郵件
*
* @param session 和服務(wù)器交互的會話
* @param sendMail 發(fā)件人郵箱
* @param receiveMail 收件人郵箱
* @return
* @throws Exception
*/
private static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail)throws Exception {
// TODO Auto-generated method stub
MimeMessage message=new MimeMessage(session);//創(chuàng)建一封郵件
message.setFrom(new InternetAddress(sendMail, "郵件", "UTF-8"));//發(fā)件人
message.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(receiveMail, "Mary", "UTF-8"));//收件人
message.setSubject("解釋","UTF-8");//郵件主題
message.setContent("這是用程序發(fā)送的郵件哦卜高,不是在客戶端上寫的", "text/html;charset=utf-8");
message.setSentDate(new Date());
message.saveChanges();//保存設(shè)置
return message;}
}
以上就是發(fā)送javaMail發(fā)送簡單文本的實例醉冤,在發(fā)送的過程中,出現(xiàn)問題的不是代碼出錯篙悯,而是郵件被作為垃圾郵件發(fā)布出去,被163的服務(wù)器攔截掉铃绒。然后就出現(xiàn)以下錯誤:
錯誤參考:http://mail.163.com/help/help_spam_16.htmip=221.224.54.186&hostid=smtp14&time=1512436245
解決辦法:修改你發(fā)送的內(nèi)容鸽照,比如我上面的內(nèi)容,經(jīng)過測試是可以發(fā)送成功的颠悬。
至此矮燎,簡單的javaMail發(fā)送文本文件就完成了。