发送邮件很慢问题jsp,javamail组件

w448132643 2011-04-28 04:09:57
我做了一个注册界面(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来发送邮件的,大家有啥好的架构来实现发送邮件更快,或者让发送邮件代码在后台执行,界面上不显示进程。
谢谢大家!
...全文
711 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
w448132643 2011-05-06
  • 打赏
  • 举报
回复
上面的servlet不就是二个功能合并在一起啊,但是不你能实现二个功能?能否帮忙看一下代码!
wang12 2011-05-06
  • 打赏
  • 举报
回复
把两个功能放在同一个servlet中实现不久行了,保存数据是否成功返回一个状态码,通过状态码决定是否发送邮件,相当于模拟一个Transaction过程
w448132643 2011-05-06
  • 打赏
  • 举报
回复
大家帮帮忙啊?
w448132643 2011-05-06
  • 打赏
  • 举报
回复
就是在一个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?
什么都不能 2011-04-30
  • 打赏
  • 举报
回复
建一个邮件队列表,异步发邮件
JavaMan_KA 2011-04-30
  • 打赏
  • 举报
回复
可以告诉你方法
你用线程来实现,在调用的时 启用 延迟机制 之后就可以执行其他的代码
就不会影响其他的执行了
zwj6612 2011-04-30
  • 打赏
  • 举报
回复
关于servlet中新建一个线程 能具体写下 怎么实现么
  • 打赏
  • 举报
回复
用的 gmail 服务,你们没有自己搭建 SMTP 服务器么?
zxlmmmm 2011-04-29
  • 打赏
  • 举报
回复
可以用异步方式提交,form表单和邮件发送用各自线程。这样用户就不用等待很长时间了。
您可以参考
http://blog.csdn.net/open2job/archive/2009/09/17/4562489.aspx
休谱诺斯 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wang12 的回复:]

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

还有一个解决方案就是,在servlet中新建一个线程,把发送邮件的代码放到这个新线程中执行,这样servlet可以很快返回,不用等待……
[/Quote]顶下,支持用线程,如果是群发同一个邮件的话,网上有示例
wang12 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wang12 的回复:]
邮件发送一般都需要较长的等待时间,因为需要和smtp服务器进行交互
为了让邮件发送的等待时间不影响到用户注册页面的响应时间
可以考虑将发送邮件的servlet调用通过Ajax异步方式提交。这样可以避免响应速度的问题
[/Quote]
还有一个解决方案就是,在servlet中新建一个线程,把发送邮件的代码放到这个新线程中执行,这样servlet可以很快返回,不用等待
wang12 2011-04-29
  • 打赏
  • 举报
回复
邮件发送一般都需要较长的等待时间,因为需要和smtp服务器进行交互
为了让邮件发送的等待时间不影响到用户注册页面的响应时间
可以考虑将发送邮件的servlet调用通过Ajax异步方式提交。这样可以避免响应速度的问题
玉女 2011-04-29
  • 打赏
  • 举报
回复
使用james邮件服务器,很快

//发送邮件
public static void sendMail() {
//String host = "localhost"; // 指定的smtp服务器,本机的局域网IP
String host = "localhost"; // 本机smtp服务器
//String host = "smtp.163.com"; // 163的smtp服务器
String from = "System@service.com"; // 邮件发送人的邮件地址
String to = "2121@service.com"; // 邮件接收人的邮件地址
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();
}
}
适用人群通用各大网易系,腾讯QQ系,新浪系,阿里系等主流邮箱;同时也适用于企业开发的企业邮箱,进行收件和发件。课程概述通用各大网易系,腾讯QQ系,新浪系,阿里系等主流邮箱;同时也适用于企业开发的企业邮箱,进行收件和发件。POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。   SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。。【开发者如何进行快速开发邮件发送系统???本课程系统进行快速研发,项目实战】 部分截图如下:完整版请查看课件或者视频

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧