分享

详解运用spring中的mail发送邮件 (1)

 邵飞翔 2017-04-06
详解使用spring中的mail发送邮件 (1)
1. Java Mail介绍
  JavaEE框架为应用提供了JavaMail接口,通过JavaMail相关的接口可以读取邮件服务器的邮件,并且可以完成邮件的发送过程。JavaMail是JavaEE中的标准API,是对邮件服务器访问过程的封装。使用JavaMail API则不需要编写与邮件服务器交互的详细过程,只需要调用相关接口即可。
  Java API 主要包括四个部分: Session, Message, Transport 和 InternetAddress。
  1.1 Session
   Session定义了全局的和每个用户的与邮件相关的属性。这些属性说明了客户机和服务器如何交流信息。
  mail.store.protocol:检索邮件使用的协议
  mail.transport.protocol:发送邮件使用的协议
  mail.host:服务器主机名
  mail.user:检索邮件或者发送邮件的用户名
  mail.protocol.host:发送邮件服务器或者接受邮件服务器
  mail.protocol.user:登陆特定邮件服务器使用的用户名
  mail.from:指定默认的回复地址
 
  1.2 Message
   一个抽象类,表示单个邮件信息,其属性包括消息类型。地址消息和锁定义的目录结构。一般我们使用其MimeMessage子类。
   Message类的主要方法有两部分,一是在发送邮件时候使用,用于设置邮件的相关信息,包括发送者,接受者,主题等信息。
  如:
 
  setFrom(Address address); //注意这里的参数为javax.mail.Address类型
  setRecipients();
  setSentDate();
  

  二是用于获取邮件的相关信息。
  如:
 Flags getFlags();   //获取与邮件相关的标记属性
 Folder getFolder(); //获取邮件所在的文件夹


1.3 Transport
  一个抽象类,用于发送邮件。我们经常用这两个方法:
public static void send(Message msg); //发送邮件
public static void send(Message msg, Address[] addresses); //第一参数是要发送邮件的本身,第二个参数是邮件发送的目的地,它会忽略邮件中设置的接受者。


1.4 InternetAddress
  InternetAddress就是把用户的Email映射为Internet地址。注意,在Message中确定邮件的接受者和发送者,以及在发送邮件的时候使用的都是Address对象。InternetAddress是Address的子类。经常使用的构造函数:
 
  public InternetAddress(String address);//把字符串构造成InternetAddress


1.5 发送邮件的步骤!
  1)获取Session
  2)将邮件地址解析为InternetAddress,构造Message消息
  3)通过Transport的send方法发送消息。

我们先来通过apache的commons email来简单实现个邮件发送,然后使用spring的mail,并详解spring的mail封装。(本文的commons email为commons-email-1.2)
需要mail.jar和commons-email-1.2.jar。

public class CommonsEmail {
	public static void main(String[] args) throws Exception {
		Email email = new SimpleEmail();
		email.setHostName("smtp.qq.com");
		email.setSmtpPort(25);
		email.setAuthenticator(new DefaultAuthenticator("465553115@qq.com", "your password"));
		email.setFrom("465553115@qq.com"); //注意,这里的发送地址一定要和上面的验证地址一致
		email.setSubject("commons email");
		email.setMsg("a mail sent used by commons email");
		email.addTo("technoboy@yeah.net");
		email.send();
		System.out.println("over");
	}
}


好了,利用commons email我们简单发了一封邮件。(分析过spring的mail后,大家也就明白了commons email)
我们看一下Spring里的mail。Spring提供了一个发送电子邮件的高级抽象层,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理。发送邮件的主要接口为MailSender以及值对象SimpleMailMessage。
看一下MailSender接口中的方法:
void send(SimpleMailMessage simpleMessage);
void send(SimpleMailMessage[] simpleMessages);

这里方法的参数就是我们提到的值对象。
而SimpleMailMessage的部分定义如下:
public class SimpleMailMessage implements MailMessage, Serializable {

	private String from;

	private String replyTo;

	private String[] to;

	private String[] cc;

	private String[] bcc;

	private Date sentDate;

	private String subject;

	private String text;

那么,我们就明白了SimpleMailMessage的用处了,是用来设置发送者,接受者,主题的一些信息的类。
回过头,我们继续看一下MailSender的层次结构图:


我们可以看到,真正实现mailSender类是JavaMailSenderImpl。这个也就是spring中发送邮件的核心类。看一下它部分的代码:
public class JavaMailSenderImpl implements JavaMailSender {

	/** The default protocol: 'smtp' */
	public static final String DEFAULT_PROTOCOL = "smtp";

	/** The default port: -1 */
	public static final int DEFAULT_PORT = -1;

	private static final String HEADER_MESSAGE_ID = "Message-ID";


	private Properties javaMailProperties = new Properties();

	private Session session;

	private String protocol = DEFAULT_PROTOCOL;

	private String host;

	private int port = DEFAULT_PORT;

	private String username;

	private String password;

	private String defaultEncoding;

	private FileTypeMap defaultFileTypeMap;

从这里,我们可以看出,JavaMailSenderImpl使用的默认协议为smtp,如果需要安全验证,我们需要制定用户名,提供密码。那么,我们使用spring来实现mail的发送:
(需要导入mail.jar 和activation.jar。这里使用的是spring3.0)

1. spring_mail.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www./schema/beans"
	xmlns:xsi="http://www./2001/XMLSchema-instance"
	xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans-3.0.xsd">
	
	
<bean id = "mailSender" class = "org.springframework.mail.javamail.JavaMailSenderImpl">
	<property name="host" value = "smtp.qq.com"></property>
	<property name="protocol" value = "smtp"></property>
	<property name="username" value = "465553115@qq.com"></property>
	<property name="password" value = "your password"></property>
	<property name="port" value = "25"></property>
	<!-- 这里设置验证 -->
	<property name="javaMailProperties">
		<props>
			<prop key="mail.smtp.auth">true</prop>
		</props>
	</property>
	
</bean>	

<bean id ="mailMessage" class = "org.springframework.mail.SimpleMailMessage">
    <!-- from的地址需要和上面username地址一致 -->
	<property name="from" value = "465553115@qq.com"></property>
	<property name="subject" value = "spring mail test"></property>
	<property name="to" value = "technoboy@yeah.net"></property>
	<property name="text" value = "a mail sent used by spring mail"></property>
</bean>

<bean id ="DummySpringMail" class = "org.com.mail.DummySpringMail">
	<property name="mailSender" ref = "mailSender"/>
	<property name="mailMessage" ref = "mailMessage"/>
</bean>

</beans>


2. DummySpringMail类
public class DummySpringMail {
	
	//
	private MailSender mailSender;
	private SimpleMailMessage mailMessage;
	
	public void setMailMessage(SimpleMailMessage mailMessage) {
		this.mailMessage = mailMessage;
	}

	public void setMailSender(MailSender mailSender) {
		this.mailSender = mailSender;
	}
	
	//
	public void sendMsg(){
		SimpleMailMessage  smm = new SimpleMailMessage(this.mailMessage);
		this.mailSender.send(smm);
	}
	
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("spring_mail.xml");
		DummySpringMail som = (DummySpringMail)context.getBean("DummySpringMail");
		som.sendMsg();
		System.out.println("over");
	}
	
}


我们看到,technoboy@yeah.net接到了来自465553115@qq.com的邮件。 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多