您的位置:首页 > 编程语言 > Java开发

JavaMail发送google email

2014-05-12 21:44 567 查看
在搭建网站的历程当中,势必会有发送邮件的需求。例如

注册的时候,使用邮箱,将验证码发到用户邮箱中。

使用邮箱找回密码。

使用邮箱订阅网站更新。当网站有新内容发布,将发送邮件通知用户。

关于邮件系统的搭建,我将用3篇博客记录邮件系统的不断演化。今天是最简单最基本的邮件发送篇。在本篇博客中,我将使用同步的方式,调用JavaMail的接口来发送email。

必备软件

JDK 7

GlassFish4 或者 Tomcat8 或者任何Web容器

一个邮件服务器

JavaMail

JavaMail提供了Java的借口,帮助java程序员发送email。JavaMail帮助解析邮件协议SMTP,POP3...,跟邮件服务器打交道。JavaMail可以单独的应用于J2SE的程序中,但需要到JavaMail的网站下载所有Jar包。http://www.oracle.com/technetwork/java/javamail/index.html 当然,其最常应用于Web容器,EJB容器。由于J2EE的Server中已经包含JavaMail的包了,所以不需要添加任何依赖。

想想Email Client,JavaMail起到的便是同样的作用。真正发送email的还是邮件服务器。所以,若想成功的调用JavaMail,还需要安装邮件服务器。当然,我们可以使用现成的邮件服务器GMail。

JNDI

每一个Web服务器,均提供了Resource管理机制。将Resource以JNDI服务发布出去。容器提供的方案,成熟健壮方便,所以,尽可能的使用服务器的resource。例如JDBC连接,我们应该使用容器提供的datasource,而不是自己创建JDBC连接。因为容器的datasource不但提供了连接池的管理,还提供分布式事务管理。

JavaMail同样,也应该使用容器的resource,而不是自己创建session实例。所有的服务器标准均类似。接下来,使用GlassFish4来掩饰JavaMail rource的创建。

在GlassFish4的管理界面http://localhost:4848/ 打开 Resources->JavaMail Sessions. 点击new按钮,创建新的session。也可以直接编辑C:\glassfish4\glassfish\domains\domain1\config\domain.xml文件。两者作用相同。

在resources节点下面,添加

<mail-resource host="smtp.gmail.com" transport-protocol-class="com.sun.mail.smtp.SMTPSSLTransport" store-protocol="imaps" store-protocol-class="com.sun.mail.imap.IMAPSSLStore" jndi-name="mail/mySession" transport-protocol="smtps" from="joey.zhangpeng@gmail.com" user="joey.zhangpeng@gmail.com">
<property name="mail-smtps-host" value="smtp.gmail.com"></property>
<property name="mail-smtps-password" value="mypassword"></property>
<property name="mail-smtps-socketFactory-class" value="javax.net.ssl.SSLSocketFactory"></property>
<property name="mail-smtps-auth" value="true"></property>
<property name="mail-smtps-socketFactory-port" value="465"></property>
<property name="mail-smtps-port" value="465"></property>
<property name="mail-smtps-starttls-enable" value="true"></property>
<property name="mail.smtps.connectiontimeout" value="60000"></property>
<property name="mail.smtps.timeout" value="180000"></property>
<property name="mail-smtps-user" value="joey.zhangpeng@gmail.com"></property>
<property name="mail-smtps-socketFactory-fallback" value="false"></property>
<property name="mail.imaps.host" value="imap.gmail.com"></property>
<property name="mail.imaps.port" value="993"></property>
<property name="mail-imaps-password" value="mypassword"></property>
<property name="mail.imaps.starttls.enable" value="true"></property>
<property name="mail.imaps.user" value="joey.zhangpeng@gmail.com"></property>
<property name="mail.imaps.socketFactory.fallback" value="false"></property>
<property name="mail.imaps.socketFactory.class" value="javax.net.ssl.SSLSocketFactory"></property>
<property name="mail.imaps.connectiontimeout" value="60000"></property>
<property name="mail.imaps.timeout" value="180000"></property>
</mail-resource>


请替换成你自己的账号和密码,保存,然后重启GlassFish.

创建web应用

新建一个Web项目,创建index.html

<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<form method="post" action="/sample/NotifyServlet">
Email:<input name="email" value=""/>
<input type="submit" value="Buy" name="submit"/>
</form>
</body>
</html>


页面中有一个Form,填写一个email地址,便可向其发送通知。



下面实现NotifyServlet.

import java.io.IOException;
import java.io.PrintWriter;
import static java.lang.ProcessBuilder.Redirect.from;
import static java.lang.ProcessBuilder.Redirect.to;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
*
* @author none2
*/
public class NotifyServlet extends HttpServlet {
private Session mySession;

public NotifyServlet() throws NamingException {
Context initCtx = new InitialContext();
mySession = (Session) initCtx.lookup("mail/mySession");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String email = request.getParameter("email");
try {
send(email);
} catch (MessagingException ex) {
Logger.getLogger(NotifyServlet.class.getName()).log(Level.SEVERE, null, ex);
}

response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet OrderServlet</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>You have notified "+email+"</h1>");
out.println("</body>");
out.println("</html>");
}
}

private void send(String email) throws MessagingException {
Message message = new MimeMessage(mySession);
message.setFrom(new InternetAddress("joey.zhangpeng@gmail.com"));
Address toAddress = new InternetAddress(email);
message.addRecipient(Message.RecipientType.TO, toAddress);
message.setSubject("Hello");
message.setText("A notification.");
Transport.send(message);
}
}


NotifyServlet发送了一个最简单的email。

最后编辑web.xml,然后部署。

测试一下吧,向自己的某个email地址发消息,看有没有收到。

下一篇,使用JMS消息队列优化邮件发送系统

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息