我做了一个注册界面(JSP),当用户注册信息完成用户,系统自动实现发送邮件功能,但是点击保存的时候自动调用WEB.XML中的servlet(写的一个发送邮件程序)?但是反应速度很慢?我用的是javamail组件来实现的。
SERVLET 代码如下:
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Mail extends HttpServlet
{
private static final String CONTENT_TYPE = "text/html; charset=GB2312"; public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html; charset=GB2312");
PrintWriter out = response.getWriter();
String send = request.getParameter("send");
String host = "smtp.gmail.com"; String select_email = request.getParameter("bill_list");
String email_text = request.getParameter("email_text");
String email_from = request.getParameter("user_email");
String email_pass = request.getParameter("email_pass");
String tcontent = "用户注册成功!";
try
{
Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", email_from);
props.put("mail.smtp.password", email_pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "email_pass"); Session s = Session.getInstance(props, null); Message message = new MimeMessage(s); Address from = new InternetAddress(email_from); message.setFrom(from);
String[] tto = select_email.split(",");
for (int i = 0; i < tto.length; i++) {
System.out.println("tto[" + i + "]" + tto[i]);
Address to = new InternetAddress(tto[i]);
message.setRecipient(Message.RecipientType.TO, to);
message.setSubject(email_text); message.setText(tcontent ); message.saveChanges(); Transport transport = s.getTransport("smtp");
transport.connect(host, email_from, email_pass); transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("发送成功!");
out.println("发送成功!");
response.sendRedirect("Regin.jsp");
}
}
catch (Exception e)
{
e.printStackTrace();
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}我是通过JS保存数据,在通过form 的action 设置servlet来发送邮件的,大家有啥好的架构来实现发送邮件更快,或者让发送邮件代码在后台执行,界面上不显示进程。
谢谢大家!
SERVLET 代码如下:
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Mail extends HttpServlet
{
private static final String CONTENT_TYPE = "text/html; charset=GB2312"; public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html; charset=GB2312");
PrintWriter out = response.getWriter();
String send = request.getParameter("send");
String host = "smtp.gmail.com"; String select_email = request.getParameter("bill_list");
String email_text = request.getParameter("email_text");
String email_from = request.getParameter("user_email");
String email_pass = request.getParameter("email_pass");
String tcontent = "用户注册成功!";
try
{
Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", email_from);
props.put("mail.smtp.password", email_pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "email_pass"); Session s = Session.getInstance(props, null); Message message = new MimeMessage(s); Address from = new InternetAddress(email_from); message.setFrom(from);
String[] tto = select_email.split(",");
for (int i = 0; i < tto.length; i++) {
System.out.println("tto[" + i + "]" + tto[i]);
Address to = new InternetAddress(tto[i]);
message.setRecipient(Message.RecipientType.TO, to);
message.setSubject(email_text); message.setText(tcontent ); message.saveChanges(); Transport transport = s.getTransport("smtp");
transport.connect(host, email_from, email_pass); transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("发送成功!");
out.println("发送成功!");
response.sendRedirect("Regin.jsp");
}
}
catch (Exception e)
{
e.printStackTrace();
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}我是通过JS保存数据,在通过form 的action 设置servlet来发送邮件的,大家有啥好的架构来实现发送邮件更快,或者让发送邮件代码在后台执行,界面上不显示进程。
谢谢大家!
您可以参考
http://blog.csdn.net/open2job/archive/2009/09/17/4562489.aspx
public static void sendMail() {
//String host = "localhost"; // 指定的smtp服务器,本机的局域网IP
String host = "localhost"; // 本机smtp服务器
//String host = "smtp.163.com"; // 163的smtp服务器
String from = "[email protected]"; // 邮件发送人的邮件地址
String to = "[email protected]"; // 邮件接收人的邮件地址
final String username = "aa"; //发件人的邮件帐户
final String password = "aa"; //发件人的邮件密码 // 创建Properties 对象
Properties props = System.getProperties(); // 添加smtp服务器属性
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true"); // 创建邮件会话
Session session = Session.getDefaultInstance(props, new Authenticator(){
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}); try {
// 定义邮件信息
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from,"James"));
// message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
message.addRecipient(Message.RecipientType.TO, new InternetAddress("**@gmail.com"));
//message.setSubject(transferChinese("我有自己的邮件服务器了"));
message.setSubject("22222");
message.setText("大爷的的的的的的的!"); // 发送消息
session.getTransport("smtp").send(message);
//Transport.send(message); //也可以这样创建Transport对象发送
System.out.println("发送成功!"); } catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
为了让邮件发送的等待时间不影响到用户注册页面的响应时间
可以考虑将发送邮件的servlet调用通过Ajax异步方式提交。这样可以避免响应速度的问题
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.Properties;import java.util.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.net.URLDecoder;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class Mail extends HttpServlet
{
private static final String CONTENT_TYPE = "text/html; charset=GB2312"; public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html; charset=GB2312");
PrintWriter out = response.getWriter();
String host = "smtp.gmail.com";
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String select_email = request.getParameter("bill_list").trim();
String email_text = request.getParameter("email_text").trim();
String email_from = request.getParameter("user_email").trim();
String email_pass = request.getParameter("email_pass").trim();
String js_sql = request.getParameter("js_sql").trim();
String update_id = request.getParameter("update_id").trim();
//URL传参
js_sql=URLDecoder.decode(js_sql,"UTF-8");
String tcontent = "文档类型:部品试流通知跟踪单";
//操作时间
String curtime;
java.util.Date curdate = new java.util.Date();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
curtime = format.format(curdate);
//结束操作时间
Connection conn=null;
Statement sta=null;
//Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//conn=DriverManager.getConnection("jdbc:odbc:jiedai","","");
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=zszx;user=sa;password=sa");
Statement sta=conn.createStatement();
sta.executeUpdate(js_sql);
try
{
Properties props = System.getProperties(); props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", email_from);
props.put("mail.smtp.password", email_pass);
props.put("mail.smtp.port", "587");
props.put("mail.smtp.auth", "email_pass"); Session s = Session.getInstance(props, null); Message message = new MimeMessage(s); Address from = new InternetAddress(email_from); message.setFrom(from);
String[] tto = select_email.split(",");
for (int i = 0; i < tto.length; i++) {
System.out.println("tto[" + i + "]" + tto[i]);
Address to = new InternetAddress(tto[i]);
message.setRecipient(Message.RecipientType.TO, to);
message.setSubject(email_text); message.setText(tcontent + "登录地址:"+basePath); message.saveChanges(); Transport transport = s.getTransport("smtp");
transport.connect(host, email_from, email_pass); transport.sendMessage(message, message.getAllRecipients());
transport.close();
System.out.println("发送成功!");
out.println("发送成功!");
}
}
catch (Exception e)
{
e.printStackTrace();
}
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}现在问题就是上面的servlet代码不能实现数据的保存和邮件发送,也就是说上面代码无法使用了,错在哪?但是单独分开写代码(二个servlet),还有一个界面能否有二个FORM?