1. 程式人生 > >利用程式發郵件—解決報錯 java.io.FileNotFoundException: jdk1.6.0_21\jre\lib\javamail.providers (系統找不到指定的檔案。)

利用程式發郵件—解決報錯 java.io.FileNotFoundException: jdk1.6.0_21\jre\lib\javamail.providers (系統找不到指定的檔案。)


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.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Demo1
{

	/**
	 * @author artcool
	 * @param args
	 */
	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		try
		{
			// 配置環境
			Properties pros = new Properties();
			// pros.setProperty("mail.debug", "");//除錯模式
			pros.setProperty("mail.smtp.auth", "true");
			pros.setProperty("mail.transport.protocol", "smtp");
			Session session = Session.getDefaultInstance(pros);
			session.setDebug(true);

			// 郵件內容
			Message msg = new MimeMessage(session);
			msg.setText("hello");
			msg.setFrom(new InternetAddress("
[email protected]
")); Transport transport = session.getTransport(); // 連線伺服器所要用到的引數:主機名、埠號、使用者名稱、密碼 transport.connect("smtp.163.com", 25, "[email protected]","授權密碼"); transport.sendMessage(msg, new Address[] { new InternetAddress("[email protected]") }); // transport.send(msg,new Address[]{new // InternetAddress("
[email protected]
")}); transport.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

注意事項:

  1. 設定的郵件伺服器host必須是傳送郵箱的伺服器,與接收郵箱無關。
  2. 傳送郵件的郵箱必須在設定頁面開啟stmp服務並設定授權碼
  3. 上圖中的,傳送郵箱的密碼不是你註冊時的密碼,而是授權碼!!!切記!
  4. 設定方式,看下圖(以163郵箱為例)

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;

import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.ArrayList;

import java.util.Properties;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class TestSendMail 
{
	public static void main(String[] args)
	{
		//(1)設定郵件伺服器
		Properties properties = new Properties();		
		properties.setProperty("mail.transport.protocol", "smtp");
		properties.setProperty("mail.smtp.auth", "true");
//		properties.setProperty("mail.debug", "true");//最好不要加上,因為會報錯。加上也沒有問題。因為不影響後面的傳送
		/*當加上了上面這句話properties.setProperty("mail.debug", "true");的時候,在執行getDefaultInstance(session)的時候會報錯。
		 * DEBUG: JavaMail version 1.4ea
		 *DEBUG: java.io.FileNotFoundException: C:\DigiWin PLM\Server\jdk1.6.0_21\jre\lib\javamail.providers (系統找不到指定的檔案。)
		 *DEBUG: !anyLoaded
		 *DEBUG: not loading resource: /META-INF/javamail.providers
		 *DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
		 *DEBUG: Tables of loaded providers
		 *DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
		 *DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
		 *DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
		 *DEBUG: !anyLoaded
		 *DEBUG: not loading resource: /META-INF/javamail.address.map
		 *DEBUG: java.io.FileNotFoundException: C:\DigiWin PLM\Server\jdk1.6.0_21\jre\lib\javamail.address.map (系統找不到指定的檔案。)
		 **/
			
		//(2)拿到本次會話,下面開始傳送郵件
		Session session = Session.getDefaultInstance(properties);
//		Session session = Session.getInstance(properties);
		session.setDebug(true);
		
		//(3)建立空的郵件
		MimeMessage mailMessage = new MimeMessage(session);		
		try
		{
			//1——設定郵件的傳送方From
			mailMessage.setFrom(new InternetAddress("
[email protected]
")); //2——設定郵件的主題Subject mailMessage.setSubject("TestMailSubject"); //3——設定郵件的內容Content——這裡的內容格式不是字串 //MimeMessage.setContent(Multipart arg0) //總 MimeMultipart allPart=new MimeMultipart("mixed"); List<String> fileList=new ArrayList<String>(); //附件的地址 String fileName1="QQ20180918095315.jpg"; String filePath1="F:\\QQ20180918095315.jpg"; String fileName2="1——錯誤原因與解決方案.txt"; String filePath2="F:\\1——錯誤原因與解決方案.txt"; fileList.add(fileName1+"!O!"+filePath1); fileList.add(fileName2+"!O!"+filePath2); //--attachmentPart for(String fileInfo :fileList) { String str[]=fileInfo.split("!O!"); String fileName=str[0]; String filePath=str[1]; MimeBodyPart attachmentPart =new MimeBodyPart();//用於裝載郵件附件 FileDataSource fds=new FileDataSource(filePath);//從檔案的絕對路徑處獲取資料來源 attachmentPart.setDataHandler(new DataHandler(fds)); attachmentPart.setFileName(MimeUtility.encodeText(fileName)); // attachmentPart.setFileName(fileName); //對於名稱有影響,與檔案中的內容無關。當然英文沒有任何問題,中文的檔名稱有問題,出現亂碼 allPart.addBodyPart(attachmentPart); } //--bodyPart MimeBodyPart bodyPart=new MimeBodyPart(); bodyPart.setText("hahaha,I am TestMailContent"); //將body放在“總”裡面 allPart.addBodyPart(bodyPart); //將“總”放在郵件裡面 mailMessage.setContent(allPart); //4——設定接收方地址 mailMessage.setRecipient(RecipientType.TO, new InternetAddress("[email protected]")); Transport trans=session.getTransport(); // 連線伺服器所要用到的引數:主機名、埠號、使用者名稱、密碼(授權密碼與郵箱密碼不一樣) trans.connect("smtp.163.com", 25, "[email protected]","xxx"); //傳送郵件--trans.connect("傳送方郵箱賬號", "傳送方郵箱密碼") // trans.connect("[email protected]", "xxx"); //5--向接收方傳送郵件 trans.sendMessage(mailMessage, mailMessage.getAllRecipients()); } catch (AddressException e) { System.out.println("cuo"); e.printStackTrace(); } catch (MessagingException e) { System.out.println("cuole"); e.printStackTrace(); } catch (UnsupportedEncodingException e) { System.out.println("cuole2"); e.printStackTrace(); } } }

有兩個架包或者是一個架包需要加

mail.jar

最後的成功傳送截圖