使用Java的JavaMail进行简单邮件发送

   据我自己实验的结果,邮件服务器使用smtp.163.com和smtp.yeah.net都可以,但是我直接使用smtp.qq.com和smtp.sina.com貌似都不行,不过收件地址qq和sina都可以用,大家要是需要测试的话,不妨去网易注册一个新用户,直接就可以用了,我刚新注册了一个163邮箱,可用。

   经过网上查询并经过本人测试,sina和qq需要先在邮箱中开启pop3/smtp服务才能够发邮件,具体办法为进入邮箱:“设置”->“开启”pop3/smtp服务。

   在使用测试本程序是需要两个jar包,mail.jar和activation.jar,可以在网搜索也可在本文末尾直接下载。
  
   本程序能够实现发送邮件并添加附件的功能。


import java.io.Serializable;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
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;

/**
 * 实现一个java发送邮件的对象
 * @author wangping1213
 *
 */
public class Mail implements Serializable {

	private static final long serialVersionUID = -3079057603211605487L;

	/**
	 * MIME邮件对象
	 */
	private MimeMessage mimeMsg;
	
	/**
	 * 邮件会话对象
	 */
	private Session session;
	
	/**
	 * 系统属性
	 */
	private Properties props;
	
	/**
	 * smtp是否需要认证
	 */
	private boolean needAuth = false; 
	
	/**
	 * smtp认证的用户名
	 */
	private String username = "";
	
	/**
	 * smtp认证的密码
	 */
	private String password = "";
	
	/**
	 * Multipart(抽象类)对象,
	 * 保存电子邮件内容的容器是Multipart抽象类,
	 * 它定义了增加和删除及获得电子邮件不同部分内容的方法.
	 */
	private Multipart mp;
	
	/**
	 * 在构造Mail对象时的初始化工作
	 * @param smtp
	 */
	public Mail(String smtp) {
		//设置SMTP主机(SMTP服务器)
		setSmtpHost(smtp);
		
		//创建一个邮件对象
		createMimeMessage();
	}
	
	/**
	 * 设置SMTP主机
	 * @param hostName
	 */
	public void setSmtpHost(String hostName) {
		System.out.println("设置系统属性:mail.stmp.host=" + hostName);
		if (null == props) {
			
			//获得系统属性对象
			props = System.getProperties();		
			
			//设置SMTP主机
			props.put("mail.smtp.host", hostName);
			
			
		} //end if
	}//end setSmtpHost
	
	/**
	 * 创建MIME邮件对象
	 */
	public boolean createMimeMessage() {
		try {
			System.out.println("准备获取邮件会话对象!");
			
			//获取邮件会话对象,需要一个授权抽象类的实现类
			session = Session.getDefaultInstance(props, new Authenticator() {
				//重写这个方法,这是授权类内部的要求
				public PasswordAuthentication getPasswordAuthentication() {
					return new PasswordAuthentication(username, password);
				}
			});
		} catch (Exception e) {
			System.err.println("获取邮件会话对象时发生错误!" + e);
			return false;
		}//end try-catch
		
		System.out.println("准备创建MIME邮件对象");
		
		try {
			//创建MIME邮件对象
			mimeMsg = new MimeMessage(session);
			//创建一个multipart对象
			mp = new MimeMultipart();
			return true;
		} catch (Exception e) {
			System.err.println("创建MIME邮件对象失败!" + e);
			return false;
		} //end try-catch
		
		
	} //end createMimeMessage()
	
	/**
	 * 设置是否需要smtp身份认证
	 * @param need 是否需要身份认证
	 */
	public void setNeedAuth(boolean needAuth) {
		
		System.out.println("设置smtp身份认证:mail.smtp.auth = " + needAuth);
		
		if (null == props) {	//判断是否已经取得系统属性对象
			//取得系统属性对象
			props = System.getProperties();
		}// end if 
		
		//是否需要认证
		this.needAuth = needAuth;
		
		//设置是否需要认证
		props.put("mail.smtp.auth", "" + this.needAuth);
		
		
	}// end setNeedAuth()
	
	/**
	 * 设置用户名和密码
	 * @param name 用户名
	 * @param pass 密码
	 */
	public void setNamePass(String name, String pass) {
		
		System.out.println("程序得到用户名和密码");
		
		//设置用户名和密码
		username = name;
		password = pass;
		
	}// end setNamePass
	
	/**
	 * 设置邮件主题
	 * @param mailSubject
	 * @return
	 */
	public boolean setSubject(String mailSubject) {
		
		System.out.println("设置邮件主题!");
		
		try {
			//将邮件主题添加到邮件对象中
			mimeMsg.setSubject(mailSubject);
			return true;
		} catch (MessagingException e) {
			System.err.println("设置邮件主题错误!");
			return false;
		}//end try-catch
		
	}//end setSubject()
	
	/**
	 * 设置邮件体格式
	 * @param mailBody 邮件体
	 * @return 是否设置成功
	 */
	public boolean setBody(String mailBody) {
		
		System.out.println("设置邮件体格式!");
		
		//邮件体对象
		BodyPart bp = new MimeBodyPart();
		
		try {
			//设置邮件体内容和格式
			bp.setContent("<meta http-equiv='Content-Type' content='text/html;charset=utf-8'/>"
					+ mailBody, "text/html;charset=utf-8");
			
			//在multipart对象中添加邮件体对象
			mp.addBodyPart(bp);
			return true;
		} catch (MessagingException e) {
			System.err.println("设置邮件正文时发生错误!" + e);
			return false;
		}// end try-catch
		
	}// end setBody()
	
	/**
	 * 增加邮件附件
	 * @param filename 附件名称
	 * @return 是否添加成功
	 */
	public boolean addFileAffix(String filename) {
		
		System.out.println("添加邮件附件!");
		
		//邮件体对象
		BodyPart bp = new MimeBodyPart();
		
		//邮件附件源对象
		FileDataSource fields = new FileDataSource(filename);
		
		try {
			//在邮件体对象中添加事件
			bp.setDataHandler(new DataHandler(fields));
			
			//在邮件体对象中设置附件名
			bp.setFileName(fields.getName());
			
			//在multipart对象中添加邮件体对象
			mp.addBodyPart(bp);
			
			return true;
		} catch (MessagingException e) {
			System.err.println("增加邮件附件" + filename + "发生错误! " + e);
			return false;
		}// end try-catch
		
	}// end addFileAffix()
	
	/**
	 * 设置发信人
	 * @param from 发信人
	 * @return 设置发信人是否成功
	 */
	public boolean setFrom(String from) {
		
		System.out.println("设置发信人!");
		
		try {
			//在邮件对象设置发信人
			mimeMsg.setFrom(new InternetAddress(from));
			return true;
		} catch (Exception e) {
			System.err.println("设置发信人出错!" + e);
			return false;
		}// end try-catch
		
	}// end setFrom()
	
	/**
	 * 设置收信人
	 * @param to 收信人
	 * @return 设置收信人是否成功
	 */
	public boolean setTo(String to) {
		
		System.out.println("设置收信人!");
		
		try {
			//在邮件对象中设置收信人
			mimeMsg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
			return true;
		} catch (Exception e) {
			System.err.println("设置收信人!" + e);
			return false;
		}// end try-catch
		
	}// end setTo()
	
	/**
	 * 发送附件到
	 * @param copyTo 发送附件的地址
	 * @return 发送附件是否成功
	 */
	public boolean setCopyTo(String copyTo) {
		
		System.out.println("发送附件到");
		
		if (null == copyTo) {
			return false;
		}//end if
		
		try {
			//在邮件对象中设置发送附件地址
			mimeMsg.setRecipients(Message.RecipientType.CC, 
					(Address[]) InternetAddress.parse(copyTo));
			return true;
		} catch (Exception e) {
			System.err.println("发送附件失败!" + e);
			return false;
		}// end try-catch
		
	}// end setCopyTo()
	
	/**
	 * 发送邮件
	 * @return 发送邮件是否成功
	 */
	public boolean sendout() {
		
		try {
			//邮件对象中设置multipart对象(内容体)
			mimeMsg.setContent(mp);
			
			//邮件对象保存更新
			mimeMsg.saveChanges();
			
			System.out.println("正在发送邮件...");
			
			session.setDebug(true);
			
			//发送信息类,使用Session类的getTransport方法,并使用smtp协议
			Transport transport = session.getTransport("smtp");
			
			//连接服务器,使用用户名,密码
			transport.connect(props.getProperty("mail.smtp.host"), username, password);
			
			//设置邮件对象
			transport.sendMessage(mimeMsg, mimeMsg.getRecipients(Message.RecipientType.TO));
			
			System.out.println("发送邮件成功!");
			
			//关闭传输对象
			transport.close();
			
			return true;
		} catch (MessagingException e) {
			System.err.println("邮件发送失败!" + e);
			return false;
		}// end try-catch
		
	}// end sendout()
	
	/**
	 * main方法
	 * @param args 参数
	 */
	public static void main(String[] args) {
		
		//实体内容
		String mailBody = "<font color='red'>欢迎光临</font><a href='www.baidu.com'>我的邮件测试</a>";
		
		//邮件实体
		Mail theMail = new Mail("smtp.163.com");
		
		//设置验证
		theMail.setNeedAuth(true);
		
		//设置主题
		if (theMail.setSubject("邮件测试") == false) {
			return;
		}// end if
		
		//邮件内容,支持html如<font color='red'>欢迎光临</font><a href='#'>邮件测试</a>
		if (theMail.setBody(mailBody) == false) {
			return;
		}// end if
		
		//设置发件人
		if (theMail.setFrom("发件人@163.com") == false) {
			return;
		}// end if
		
		//设置收件人
		if (theMail.setTo("收件人@qq.com") == false) {
			return;
		}// end if
		
		//添加附件
		if (theMail.addFileAffix("附件的地址") == false) {
			return;
		}// end if
		
		//设置发件人的用户名和密码
		theMail.setNamePass("发件人用户名", "发件人密码");	
		
		//发送邮件
		if (theMail.sendout() == false) {
			return;
		}// end if
		
	}// end main()
	
}//end class Mail

你可能感兴趣的:(java,qq)