JavaMail API 入门

JavaMail API提供了邮件处理的框架,我们可以再此基础上封装成适合自己使用的邮件收发组件。

下面提供一个最简单的使用例子,此示例介绍了支持SSL方式的应用,如果不使用SSL可以根据注释,去除相关语句:

 

 

package example.mail;

import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.URLName;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;

public class Test {
	
	private String username = "";//邮箱账户名 如: [email protected]
	private String password = "";//邮箱密码
	private String toAdd = "";//收件人电子邮箱地址 如:[email protected]
	
	//发送邮件测试
	public void sendSSLMail() throws AddressException, MessagingException{
		//若启用SSL,需要注册安全传输的提供者
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
		final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
		
		//发送邮件必须的配置
		Properties props = System.getProperties();		
		props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY);//若启用SSL,需要设置,否则不设置此项
		props.setProperty("mail.smtp.socketFactory.fallback", "false");//若启用SSL,需要设置,否则不设置此项
		props.setProperty("mail.smtp.socketFactory.port", "465");//若启用SSL,需要设置,否则不设置此项
		props.setProperty("mail.smtp.host", "smtp.qq.com");		
		props.setProperty("mail.smtp.port", "465");	  	
	  	props.put("mail.smtp.auth", "true");
	  	props.put("mail.debug", "true");
	  	final String username = this.username;//账户名称
	  	final String password = this.password;//密码
	  		
	  	//获取会话
	  	Session session = Session.getDefaultInstance(props, new Authenticator(){
	  		@Override
	  		protected PasswordAuthentication getPasswordAuthentication() {
	  			// TODO Auto-generated method stub
	  			return new PasswordAuthentication(username, password);
	  		}
	  	});

       //创建消息
	  	Message msg = new MimeMessage(session);
	  	//设置发件人,收件人等信息
	  	msg.setFrom(new InternetAddress(username));
	  	msg.setRecipients(Message.RecipientType.TO, 
	  			InternetAddress.parse(this.toAdd, false));
	  	msg.setSubject("Hello");
	  	msg.setText("How are you");
	  	msg.setSentDate(new Date());
	  	
	  	//调用传输接口发送邮件消息
	  	Transport.send(msg);
  
	  	System.out.println("Message sent.");
	}	
	
	//邮件接收测试
	public void receivePOPSSLMail() throws MessagingException, UnsupportedEncodingException{
		//若启用SSL,需要注册安全传输的提供者
		Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());  
		final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";  
		  
		//接收邮件必须的配置
		Properties props = System.getProperties();  
		props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY); //若启用SSL,需要设置,否则不设置此项
		props.setProperty("mail.pop3.socketFactory.fallback", "false");  //若启用SSL,需要设置,否则不设置此项
		props.setProperty("mail.pop3.socketFactory.port", "995");  //若启用SSL,需要设置,否则不设置此项
		props.setProperty("mail.pop3.port", "995");  
	  
		//获取会话
		Session session = Session.getInstance(props);  
	  
		//接收邮箱的信息
		URLName urln = new URLName("pop3","pop.qq.com",995,null,  
				this.username, this.password);  
		Store store = session.getStore(urln);  
		Folder inbox = null;  
		try {  
			store.connect();  
			inbox = store.getFolder("INBOX");  
			inbox.open(Folder.READ_WRITE);  //以读写方式打开时才能执行写标记动作
			FetchProfile profile = new FetchProfile();  
			profile.add(FetchProfile.Item.ENVELOPE);  
			Message[] messages = inbox.getMessages();  
			inbox.fetch(messages, profile);  
			System.out.println("邮件个数" + messages.length);  
			
			//遍历所有邮件
			for (int i = 0; i < messages.length; i++) {  
				//解析一封邮件
				String from = decodeText(messages[i].getFrom()[0].toString()); //发件人
				InternetAddress ia = new InternetAddress(from);  //解析发件人地址
				System.out.println("FROM:" + ia.getPersonal()+'('+ia.getAddress()+')');  
				//其他信息				
				System.out.println("TITLE:" + messages[i].getSubject());  
				System.out.println("SIZE:" + messages[i].getSize());  
				System.out.println("DATE:" + messages[i].getSentDate());  
				
				messages[i].setFlag(Flags.Flag.DELETED, false);//设置删除标记
			}  
		} finally {  
			try {  
				inbox.close(true);  
				store.close();
			} catch (Exception e) {}  
			try {  
				store.close();  
			} catch (Exception e) {}  
	  }  
	}
	
	protected static String decodeText(String text)  throws UnsupportedEncodingException {
	  if (text == null)  
	   return null;  
	  if (text.startsWith("=?GB") || text.startsWith("=?gb"))  
	   text = MimeUtility.decodeText(text);  
	  else  
	   text = new String(text.getBytes("ISO8859_1"));  
	  return text;  
	}  

	/**
	 * @param args
	 * @throws MessagingException 
	 * @throws AddressException 
	 * @throws UnsupportedEncodingException 
	 */
	public static void main(String[] args) throws AddressException, MessagingException, UnsupportedEncodingException {
		Test t = new Test();
		t.sendSSLMail();//发送邮件
//		t.receivePOPSSLMail();	//接收邮件
	}

}

 总结:

1.若使用pop3协议收取邮件,网上查阅许多资料,貌似不支持对邮件进行已读和未读等标记。因此,只能全部收取然后全部删除,自己来处理对邮件标记的繁杂工作。(IMAP4协议支持)

你可能感兴趣的:(邮件,ssl,javamail)