java發送普通郵件
寫在前面
做網站項目時,有時需要實現發送郵件功能,比如用戶注冊后需要在郵箱里點擊驗證,或者像qq音樂等到期續費時會發送郵件。因此我們需要學習如何利用代碼來自動發送郵件。
本篇講的是javaweb項目里,用原生的技術實現郵件發送,需要手動導包。發送郵件有很多種方式,導的包也都不一樣,這里我不深究那么多,因為到了框架階段,我們可以利用框架更加方便的發送郵件,更簡單。所以在java原生發郵件這里,你會復制代碼會發送就行了,不需要了解太多。

咳咳,不要在意細節,接下來進入正題。其實網上有很多博客講發送郵件,有的講的很復雜。我自己整理一個,方便大家白嫖
白嫖部分
第一步,導包
需要自行下載這兩個包,並導入到項目中,當然,你會maven的話更方便,不會的話就老老實實去百度搜索這兩個jar包並下載。。。這倆jar包,我發到附件里了,下載地址:點擊下載
- mail.jar
- activation.jar
第二步,到你的郵箱里申請一個登錄口令
以163郵箱為例,登錄進去后,單擊如下菜單


然后就進入了這個界面,因為我已經有了一個口令了,所以我下面顯示的是新增授權碼。如果你還沒有口令,那你的界面應該長這個樣子

點擊重啟服務,就會彈出這個框,然后點擊確定。這個時候會彈出一個二維碼,讓你掃描,或者你用手機驗證碼也行,反正就是驗證一下,然后就生成驗證碼了。

得到之后,趕緊復制一下或者截圖,防止之后找不見。這個碼,一會通過代碼登錄郵箱的時候要用到。以前用代碼登錄的時候直接輸入用戶名密碼就行了,后來大概是嫌不安全吧,就必須用這個授權碼才能登錄。
第三步,把下面的代碼復制到你項目里
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message.RecipientType;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MailDemo {
public static void main(String[] args) throws Exception {
sendEmail();
}
public static void sendEmail() throws Exception {
/* * 1. 得到session */
Properties props = new Properties(); //創建配置對象
props.setProperty("mail.host", "smtp.163.com"); // 配置郵箱服務,也就是郵箱地址,這里我用的163郵箱,所以地址就是smtp.163.com。你用哪個郵箱,你就百度搜一下它的服務地址,寫在這就行
props.setProperty("mail.smtp.auth", "true"); //這里的true表示需要驗證才能登錄
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("136******93@163.com", "HSRF*******NPCD");
} // 這一步是創建認證對象,並配置上自己的用戶名和密碼。前者就寫自己郵箱的全稱,后者就是你剛才生成的那個口令
};
Session session = Session.getInstance(props, auth);// 這一步是把配置信息和認證信息傳給了郵箱服務,並拿到了連接對象
/* * 2. 創建MimeMessage */
MimeMessage msg = new MimeMessage(session);// 創建一封郵件
msg.setFrom(new InternetAddress("136******93@163.com"));//設置發件人
msg.setRecipients(RecipientType.TO, "62*****95@qq.com");//設置收件人,自己做測試,發件人用我的163郵箱,收件人用我的qq郵箱。。。RecipientType.TO表示發送給對方,RecipientType.CC表示抄送
msg.setSubject("測試郵件");//設置郵件主題
msg.setContent("哈哈哈哈", "text/html;charset=utf-8");//前者為郵件內容,想寫啥寫啥,后者為固定參數,不要改(設置了頁面格式和編碼)
/* * 3. 發送 */
Transport.send(msg);//調用方法完成發送
System.out.println("發送完成");
}
}
java發送帶附件的郵件
Properties props = new Properties();
props.setProperty("mail.host", "smtp.163.com");
props.setProperty("mail.smtp.auth", "true");
Authenticator auth = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("130*****92@163.com", "ETLW******JKFA");
}
};
Session session = Session.getInstance(props, auth);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("130*****692@163.com"));
msg.setRecipients(RecipientType.TO, "62*****95@qq.com");
msg.setSubject("呵呵");
//上面的代碼都一樣
MimeMultipart list = new MimeMultipart();//創建內容列表
MimeBodyPart part1 = new MimeBodyPart();//創建內容對象
part1.setContent("文字內容", "text/html;charset=utf-8");//添加文本內容
list.addBodyPart(part1);//把上面有文本內容的部分添加到列表
MimeBodyPart part2 = new MimeBodyPart();//創建內容對象2
part2.attachFile(new File("d://image/aaa.png"));//要添加文件的絕對路徑
list.addBodyPart(part2);//把這一部分添加到列表中
msg.setContent(list);//設置郵件內容,內容就是剛才創建的列表
Transport.send(msg);
帶附件的發送,除了添加內容部分不一樣,其余都一樣。添加內容部分的思路是這樣的,首先創建內容列表,然后創建內容對象,可通過內容對象去設置文字內容或者附件,內容對象可以有多個,把這多個內容對象放進內容列表,最后還是通過郵件對象本身去設置內容,這個內容就是剛才的那個列表。