我做了一个注册界面(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来发送邮件的,大家有啥好的架构来实现发送邮件更快,或者让发送邮件代码在后台执行,界面上不显示进程。
谢谢大家!

解决方案 »

  1.   

    可以用异步方式提交,form表单和邮件发送用各自线程。这样用户就不用等待很长时间了。
    您可以参考
    http://blog.csdn.net/open2job/archive/2009/09/17/4562489.aspx
      

  2.   

    使用james邮件服务器,很快//发送邮件
    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();
    }
    }
      

  3.   

    邮件发送一般都需要较长的等待时间,因为需要和smtp服务器进行交互
    为了让邮件发送的等待时间不影响到用户注册页面的响应时间
    可以考虑将发送邮件的servlet调用通过Ajax异步方式提交。这样可以避免响应速度的问题
      

  4.   

    还有一个解决方案就是,在servlet中新建一个线程,把发送邮件的代码放到这个新线程中执行,这样servlet可以很快返回,不用等待
      

  5.   

    关于servlet中新建一个线程  能具体写下 怎么实现么 
      

  6.   

    用的 gmail 服务,你们没有自己搭建 SMTP 服务器么?
      

  7.   

    就是在一个JSP页面,第一要保持提交的数据,第二就是发邮件通知对方?在点击提交的时候怎么同时保持数据和发送邮件?我目前写了一个SERVLET能保持数据,但是不能发送邮件,当可以发送邮件就不能保存数据,怎么能实现呢?servlet代码如下:import java.io.IOException;
    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?
      

  8.   

    把两个功能放在同一个servlet中实现不久行了,保存数据是否成功返回一个状态码,通过状态码决定是否发送邮件,相当于模拟一个Transaction过程
      

  9.   

     上面的servlet不就是二个功能合并在一起啊,但是不你能实现二个功能?能否帮忙看一下代码!