實現java發送郵件的過程大體有以下幾步:
- 准備一個properties文件,該文件中存放SMTP服務器地址等參數。
- 利用properties創建一個Session對象
- 利用Session創建Message對象,然后設置郵件主題和正文
- 利用Transport對象發送郵件
需要的jar有2個:activation.jar和mail.jar
直接看個demo代碼

#----------------這兩個是構建session必須的字段---------- #smtp服務器 mail.smtp.host=smtp.qq.com #身份驗證 mail.smtp.auth=true #-------------------------------------------------------------- #發送者的郵箱用戶名 mail.sender.username=xxx@xx.com #發送者的郵箱密碼 mail.sender.password=xxxxxxxxxx
下面是發送郵件的java代碼
import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; public class JavaMail { /** * Message對象將存儲我們實際發送的電子郵件信息, * Message對象被作為一個MimeMessage對象來創建並且需要知道應當選擇哪一個JavaMail session。 */ private MimeMessage message; /** * Session類代表JavaMail中的一個郵件會話。 * 每一個基於JavaMail的應用程序至少有一個Session(可以有任意多的Session)。 * * JavaMail需要Properties來創建一個session對象。 * 尋找"mail.smtp.host" 屬性值就是發送郵件的主機 * 尋找"mail.smtp.auth" 身份驗證,目前免費郵件服務器都需要這一項 */ private Session session; /*** * 郵件是既可以被發送也可以被受到。JavaMail使用了兩個不同的類來完成這兩個功能:Transport 和 Store。 * Transport 是用來發送信息的,而Store用來收信。對於這的教程我們只需要用到Transport對象。 */ private Transport transport; private String mailHost=""; private String sender_username=""; private String sender_password=""; private Properties properties = new Properties(); /* * 初始化方法 */ public JavaMail(boolean debug) { InputStream in = JavaMail.class.getResourceAsStream("MailServer.properties"); try { properties.load(in); this.mailHost = properties.getProperty("mail.smtp.host"); this.sender_username = properties.getProperty("mail.sender.username"); this.sender_password = properties.getProperty("mail.sender.password"); } catch (IOException e) { e.printStackTrace(); } session = Session.getInstance(properties); session.setDebug(debug);//開啟后有調試信息 message = new MimeMessage(session); } /** * 發送郵件 * * @param subject * 郵件主題 * @param sendHtml * 郵件內容 * @param receiveUser * 收件人地址 */ public void doSendHtmlEmail(String subject, String sendHtml, String receiveUser) { try { // 發件人 //InternetAddress from = new InternetAddress(sender_username); // 下面這個是設置發送人的Nick name InternetAddress from = new InternetAddress(MimeUtility.encodeWord("幻影")+" <"+sender_username+">"); message.setFrom(from); // 收件人 InternetAddress to = new InternetAddress(receiveUser); message.setRecipient(Message.RecipientType.TO, to);//還可以有CC、BCC // 郵件主題 message.setSubject(subject); String content = sendHtml.toString(); // 郵件內容,也可以使純文本"text/plain" message.setContent(content, "text/html;charset=UTF-8"); // 保存郵件 message.saveChanges(); transport = session.getTransport("smtp"); // smtp驗證,就是你用來發郵件的郵箱用戶名密碼 transport.connect(mailHost, sender_username, sender_password); // 發送 transport.sendMessage(message, message.getAllRecipients()); //System.out.println("send success!"); } catch (Exception e) { e.printStackTrace(); }finally { if(transport!=null){ try { transport.close(); } catch (MessagingException e) { e.printStackTrace(); } } } } public static void main(String[] args) { JavaMail se = new JavaMail(false); se.doSendHtmlEmail("郵件主題", "郵件內容", "xxx@XX.com"); } }
上面只能實現文本的發送,如果我們要發送附件,就需要用到Multipart對象了。

import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; public class JavaMailWithAttachment { private MimeMessage message; private Session session; private Transport transport; private String mailHost = ""; private String sender_username = ""; private String sender_password = ""; private Properties properties = new Properties(); /* * 初始化方法 */ public JavaMailWithAttachment(boolean debug) { InputStream in = JavaMailWithAttachment.class.getResourceAsStream("MailServer.properties"); try { properties.load(in); this.mailHost = properties.getProperty("mail.smtp.host"); this.sender_username = properties.getProperty("mail.sender.username"); this.sender_password = properties.getProperty("mail.sender.password"); } catch (IOException e) { e.printStackTrace(); } session = Session.getInstance(properties); session.setDebug(debug);// 開啟后有調試信息 message = new MimeMessage(session); } /** * 發送郵件 * * @param subject * 郵件主題 * @param sendHtml * 郵件內容 * @param receiveUser * 收件人地址 * @param attachment * 附件 */ public void doSendHtmlEmail(String subject, String sendHtml, String receiveUser, File attachment) { try { // 發件人 InternetAddress from = new InternetAddress(sender_username); message.setFrom(from); // 收件人 InternetAddress to = new InternetAddress(receiveUser); message.setRecipient(Message.RecipientType.TO, to); // 郵件主題 message.setSubject(subject); // 向multipart對象中添加郵件的各個部分內容,包括文本內容和附件 Multipart multipart = new MimeMultipart(); // 添加郵件正文 BodyPart contentPart = new MimeBodyPart(); contentPart.setContent(sendHtml, "text/html;charset=UTF-8"); multipart.addBodyPart(contentPart); // 添加附件的內容 if (attachment != null) { BodyPart attachmentBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachment); attachmentBodyPart.setDataHandler(new DataHandler(source)); // 網上流傳的解決文件名亂碼的方法,其實用MimeUtility.encodeWord就可以很方便的搞定 // 這里很重要,通過下面的Base64編碼的轉換可以保證你的中文附件標題名在發送時不會變成亂碼 //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); //messageBodyPart.setFileName("=?GBK?B?" + enc.encode(attachment.getName().getBytes()) + "?="); //MimeUtility.encodeWord可以避免文件名亂碼 attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName())); multipart.addBodyPart(attachmentBodyPart); } // 將multipart對象放到message中 message.setContent(multipart); // 保存郵件 message.saveChanges(); transport = session.getTransport("smtp"); // smtp驗證,就是你用來發郵件的郵箱用戶名密碼 transport.connect(mailHost, sender_username, sender_password); // 發送 transport.sendMessage(message, message.getAllRecipients()); System.out.println("send success!"); } catch (Exception e) { e.printStackTrace(); } finally { if (transport != null) { try { transport.close(); } catch (MessagingException e) { e.printStackTrace(); } } } } public static void main(String[] args) { JavaMailWithAttachment se = new JavaMailWithAttachment(true); File affix = new File("c:\\測試-test.txt"); se.doSendHtmlEmail("郵件主題", "郵件內容", "xxx@XXX.com", affix);// } }