(摘自http://blog.csdn.net/beidou321/article/details/6483153)
注册时你填写了一正确 的信息后,将激活信息 自动发邮件到你的邮箱中。在用过发送发哦邮箱中的激活链接激活用户。
大概步骤如此:
1.网站用户相关表中有一个字段用来记录用户帐号是否激活。
2.当用户注册时,注册程序会自动向用户注册邮箱发送一封激活邮件,里面带激活链接(参数)。
3.当用户点击激活邮件的激活链接访问激活页面,激活页面根据链接带的参数判断出用户帐号、激活有效期等以决定是否向该用户表中的“是否激活”字段写入“已激活标记”
4.成功写入激活标记,激活成功,可以使用帐号登陆网站。
如有不正确之处还请指点。
这里有个问题:当有大量的用户注册时是采用同步发送还是异步发送邮件?答案当然是采用异步发送! 原因: 同步异步发送问题:JavaMail邮件处理是同步的,即用户触发事件、与SMTP Server通信、服务器返回状态消息、程序结束是单线程内, 这时往往因Socket通信、服务器业务处理速度等原因而使得处理时间是个未知数。举个简单的应用实例:若用户在提交注册的同时发送一封激活账户邮件, 用户有可能不知道是因为邮件服务器那儿阻塞致半天没有反应而以为注册失败并放弃,这将是失败的设计,但异步方式能解决这些问题。异步方式简单地说就是将邮件处理任务交给另外一个线程,J2EE有两种解决方案,一是种利用JMS,JMS可以实现同步和异步的消息处理,将邮件作为一个异步的消息,就可以实现异步邮件发送。JMS属于J2EE的高级应用,所以对于仅以WEB功能的容器还不支持这种服务,例如Tomcat(当然可以找到插件来解决)。另一种方案是利用JDK中Executor的支持,JDK 5.0后继版本增加了java.util.concurrent一个强大的并发工具包,它包含了执行器、计时器、锁、线程安全队列、线程任务框架等等。Executor——执行器,它可以将任务的“提交”与“执行”分离解耦,我们的邮件处理任务完全可以借用它实现异步执行。而Spring框架提供了封装,见②。
现贴出关键性的部分: <!– 发送Email配置 –>
<!–①邮件服务器–>
<bean id=”mailSender”
class=”org.springframework.mail.javamail.JavaMailSenderImpl”>
<property name=”protocol” value=”smtp” />
<property name=”host” value=”smtp.sina.com” />
<!–<property name=”port” value=”465″ />
<property name=”username” value=”xxx@sina.com” />
<property name=”password” value=”xxx” />
<property name=”javaMailProperties”>
<props>
<!– 使用用户名和密码验证 –>
<prop key=”mail.smtp.auth”>true</prop>
<!–
<prop key=”mail.smtp.starttls.enable”>true</prop>
<prop key=”mail.smtp.socketFactory.class”>
javax.net.ssl.SSLSocketFactory
</prop>gmail要求的ssl连接–>
</props>
</property>
</bean> <!–②异步线程执行器–>
<bean id=”taskExecutor”
class=”org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor”>
<property name=”corePoolSize” value=”10″ />
<property name=”maxPoolSize” value=”30″ />
</bean>
这是邮件处理的两个核心配置,第一个配置(①)是往容器中装配一个JavaMailSender Bean,它就是JavaMail的封装,其中最关键的是装配过程的属性参数,这些属性既要严格遵照JavaMail规范,又要满足邮件提供商的要求,例如SMTP服务器端口是多少、发送时是否要身份验证、服务器是否采用安全连接、连接时是否加密以及采用什么样的加密方式,邮件服务商提供的这些参数直接影响到上述的配置。
发送邮件的主要方法:
public void sendMail(Mail email) throws MessagingException, IOException {
String tto[] = email.getTo().trim().split(“;”);
if (email.getTo() == null || email.getTo().trim().length() == 0) {
System.out.println(“没有收件人!”);
return;
}
if (tto.length > 1) {// 收件人大于5封时,采用异步发送
System.out.println(“2222222222222222222”);
ctx = new ClassPathXmlApplicationContext(“springapplicationContext.xml”);
sendMailByAsynchronousMode(email);
System.out.println(“收件人过多,正在采用异步方式发送…”);
} else {
System.out.println(“333333333333333333”);
ctx = new ClassPathXmlApplicationContext(“springapplicationContext.xml”);
sendMailBySynchronizationMode(email);
System.out.println(“正在同步方式发送邮件…”);
}
}
/**
* 异步发送
*/
public void sendMailByAsynchronousMode(final Mail email) {
try {
TaskExecutor taskExecutor = (TaskExecutor) ctx
.getBean(“taskExecutor”);
taskExecutor.execute(new Runnable() {
public void run() {
try {
sendMailBySynchronizationMode(email);
} catch (Exception e) {
e.printStackTrace();
}
}
});
} catch (RuntimeException e) {
System.out.println(“异步发送邮件出现异常:” + e.getMessage());
}
}
/**
* 同步发送
*/
public void sendMailBySynchronizationMode(Mail email)
throws MessagingException, IOException {
JavaMailSender sender = (JavaMailSender) ctx.getBean(“mailSender”);
MimeMessage mime = sender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mime, true, “utf-8”);
helper.setFrom(email.getFrom());// 发件人
helper.setReplyTo(“xxx@sina.com”);// 回复到
helper.setSubject(email.getSubject());// 邮件主题
helper.setText(email.getContent(), true);// 邮件内容 true表示设定html格式
String tto[] = email.getTo().trim().split(“;”);
if (tto.length > 0) {
InternetAddress address[] = new InternetAddress[tto.length];
for (int i = 0; i < tto.length; i++) {
address[i] = new InternetAddress(tto[i]);
}
if (email.getType() == “CC”) {
helper.setCc(address);
} else if (email.getType() == “BCC”) {
helper.setBcc(address);
} else {
helper.setTo(address);
}
}
sender.send(mime);
}