使用Javamail發送郵件,必需的jar包(請下載javamail的源文件,官方下載頁:http://www.oracle.com/technetwork/java/javamail/index-138643.html):
mailapi.jar。定義了收發郵件所使用到的接口API;
smtp.jar。包含了發送郵件使用到的類;
pop3.jar。包含了收郵件使用到的類;
我們通常發送郵件使用的協議是smtp協議,接受郵件使用的協議是pop3協議。或者,我們直接將mail.jar加入到工程,這個jar包裡邊包含了java收發郵件所有的接口和類。
常用的類:
發送郵件
下邊,我先列出使用Java發送郵件的最簡單的一個小測試示例:
import java.util.Properties; import javax.mail.Address; 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; /** * * QQ(mail.qq.com):POP3服務器(端口995)SMTP服務器(端口465或587)。 * */ public class Demo1 { /** * @param args * @throws MessagingException */ public static void main(String[] args) throws MessagingException { String sendUserName = "[email protected]"; String sendPassword = "pwd"; Properties properties = new Properties(); properties.setProperty("mail.smtp.auth", "true");//服務器需要認證properties.setProperty("mail.transport.protocol", "smtp");//聲明發送郵件使用的端口Session session = Session.getInstance(properties); session.setDebug(true);//同意在當前線程的控制台打印與服務器對話信息Message message = new MimeMessage(session);//構建發送的信息message.setText("你好,我是Champion.Wong!");//信息內容message.setFrom(new InternetAddress("[email protected]"));//發件人Transport transport = session.getTransport(); transport.connect("smtp.126.com", 25, sendUserName, sendPassword);//連接發件人使用發件的服務器transport.sendMessage(message, new Address[]{new InternetAddress("[email protected]")});//接受郵件transport.close(); } }一般的,我們使用Authenticator把用戶名和密碼封裝起來,不透明!所以:
import javax.mail.Authenticator; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import junit.framework.TestCase; /** * javamail 發送郵件* @author Champion Wong * Message.addRecipient(Message.Recipient recipient, Address address); 發郵件的時候指定收件人和收件人的角色* Message.RecipientType.TO 收件人* Message.RecipientType.CC 抄送,即發郵件的時候順便給另一個人抄一份,不用回复!但是,上邊的收件人可以看到你都抄送給了誰* Message.RecipientType.BCC 暗送,也是發郵件的時候順便給另一個人暗發一份,但是,不同於上邊的是,收件人不能看到你都暗送給了誰* */ public class Demo2 extends TestCase { private static final String sendUserName = "[email protected]";// 發送郵件需要連接的服務器的用戶名private static final String sendPassword = "pwd";// 發送郵件需要連接的服務器的密碼private static final String sendProtocol = "smtp";// 發送郵件使用的端口private static final String sendHostAddress = "smtp.126.com";// 發送郵件使用的服務器的地址public void test() throws AddressException, MessagingException { Properties properties = new Properties(); properties.setProperty("mail.smtp.auth", "true");// 服務器需要認證properties.setProperty("mail.transport.protocol", sendProtocol);// 聲明發送郵件使用的端口properties.setProperty("mail.host", sendHostAddress);// 發送郵件的服務器地址Session session = Session.getInstance(properties, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(sendUserName, sendPassword); } }); session.setDebug(true);//在後台打印發送郵件的實時信息Message message = new MimeMessage(session); message.setFrom(new InternetAddress("[email protected]")); message.setSubject("Demo2JavaCode發送郵件測試,採用Authenticator");// 設置主題message.setRecipients(Message.RecipientType.TO, InternetAddress .parse("[email protected],[email protected]"));// 發送message.setRecipients(Message.RecipientType.CC, InternetAddress .parse("[email protected]"));// 抄送message .setContent( "<span style="font-size:20px; color:#FFCCFF" mce_style="font-size:20px; color:#FFCCFF">如果您看到,證明測試成功了! </span>", "text/html;charset=gbk"); Transport.send(message);//發送郵件} }我們發送一個比較複雜的郵件,包括附件,圖文:
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.Authenticator; import javax.mail.MessagingException; import javax.mail.PasswordAuthentication; import javax.mail.Session; import javax.mail.Transport; import javax.mail.Message.RecipientType; 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; /** * * @author Administrator Mr XP.Wang * MimeMultipart 一般電子郵件的容器是Multipart,定義了增加及刪除電子郵件各部分內容的方法, * 但是其是抽像類,需要其子類MimeMultipart來時用MimeMessage對象* MimeBodyPart 是BodyPart具體用於mimeMessage的一個子類,MimeBodyPart對象代表一個* mimeMultipart對象的每一個部分* MimeUtility.encodeText(String cn)用於解決郵件中的頭部信息中中文的亂碼問題* */ public class Demo3_test { public static void main(String[] args) throws Exception { Properties properties = new Properties(); properties.setProperty("mail.smtp.auth", "true");// 服務器需要認證properties.setProperty("mail.transport.protocol", "smtp");// 聲明發送郵件使用的端口properties.setProperty("mail.host", "smtp.126.com");// 發送郵件的服務器地址Session session = Session.getInstance(properties, new Authenticator() { String sendUserName = "[email protected]"; String sendPassword = "pwd"; protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(sendUserName, sendPassword); } }); session.setDebug(true); MimeMessage msg = new MimeMessage(session);// 聲明一個郵件體msg.setFrom(new InternetAddress("/""+MimeUtility.encodeText("Mr XP.Wang")+"/"<[email protected]>")); msg.setSubject("這是我的第一份複雜郵件");//設置郵件主題msg.setRecipients(MimeMessage.RecipientType.TO, InternetAddress.parse(MimeUtility.encodeText("王翔攀")+"<[email protected]>,"+MimeUtility.encodeText("三毛")+"<[email protected]>")); MimeMultipart msgMultipart = new MimeMultipart("mixed");// 標明郵件的組合關係,混合的關係msg.setContent(msgMultipart);// 設置郵件體MimeBodyPart attch1 = new MimeBodyPart();// 附件1 MimeBodyPart attch2 = new MimeBodyPart();// 附件2 MimeBodyPart content = new MimeBodyPart();// 郵件的正文,混合體(圖片+文字) // 將附件和正文設置到這個郵件體中msgMultipart.addBodyPart(attch1); msgMultipart.addBodyPart(attch2); msgMultipart.addBodyPart(content); // 設置第一個附件DataSource ds1 = new FileDataSource("F:/ACCP5.0/文件/ssh配置.txt");// 指定附件的數據源DataHandler dh1 = new DataHandler(ds1);// 附件的信息attch1.setDataHandler(dh1);// 指定附件attch1.setFileName("ssh.txt"); // 設置第二個附件DataSource ds2 = new FileDataSource("resource/48.jpg");// 指定附件的數據源DataHandler dh2 = new DataHandler(ds2);// 附件的信息attch2.setDataHandler(dh2);// 指定附件attch2.setFileName("48.jpg"); //設置郵件的正文MimeMultipart bodyMultipart = new MimeMultipart("related");//依賴關係content.setContent(bodyMultipart);//指定正文MimeBodyPart htmlPart = new MimeBodyPart(); MimeBodyPart gifPart = new MimeBodyPart(); bodyMultipart.addBodyPart(htmlPart); bodyMultipart.addBodyPart(gifPart); DataSource gifds = new FileDataSource("resource/48.jpg");//正文的圖片DataHandler gifdh = new DataHandler(gifds); gifPart.setHeader("Content-Location", "http://mimg.126.net/logo/126logo.gif"); gifPart.setDataHandler(gifdh);//設置正文的圖片htmlPart.setContent("我只是來打醬油的,這是我的形象照! <img src="/" mce_src="/""http://mimg.126.net/logo/126logo.gif/">", "text/html;charset=gbk");//設置正文文字msg.saveChanges();//保存郵件//將郵件保存成文件OutputStream ops = new FileOutputStream("C:/Users/Administrator/Desktop/test.eml"); msg.writeTo(ops); ops.close(); Transport.send(msg); } }收取郵件
示例:Rose 收取最近一封郵件。
import java.util.Date;import java.util.Properties;import javax.mail.Folder;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.NoSuchProviderException;import javax.mail.Session;import javax.mail.Store;public class FetchMail { public static void main(String[] args) { String protocol = "pop3"; boolean isSSL = true; String host = "pop.163.com"; int port = 995; String username = "[email protected]"; String password = "rose"; Properties props = new Properties(); props.put("mail.pop3.ssl.enable", isSSL); props.put("mail.pop3.host", host); props.put("mail.pop3.port", port); Session session = Session.getDefaultInstance(props); Store store = null; Folder folder = null; try { store = session.getStore(protocol); store.connect(username, password); folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); int size = folder.getMessageCount(); Message message = folder.getMessage(size); String from = message.getFrom()[0].toString(); String subject = message.getSubject(); Date date = message.getSentDate(); System.out.println("From: " + from); System.out.println("Subject: " + subject); System.out.println("Date: " + date); } catch (NoSuchProviderException e) { e.printStackTrace(); } catch (MessagingException e) { e.printStackTrace(); } finally { try { if (folder != null) { folder.close(false); } if (store != null) { store.close(); } } catch (MessagingException e) { e.printStackTrace(); } } System.out.println("接收完畢! "); }}