在发送了大量的邮件后,如何才能知道有多少人打开了这封邮件呢,又如何知道是哪些客户打开邮件呢?一开始想好像很难实现,其实只要稍微想一下,其实实现的方法可以很简单。实现的思路就是,当客户打开这封邮件的时候,能够向我们的服务器发送一条请求,请求上带有相关信息,这样我们就能够获取到我们要的信息了。
基于以上的需求,我用直接java做了一个实现。
其中要求发的邮件中要带这样一条代码:
<img src="http://localhost:8080/analysis-mail/analysis?t_email=xxxxx@xx.xxx" style="display:none;"/>
其中t_email参数就是表示该邮件所往的邮箱。
以下代码:
AnalysisServlet
这是核心类:
package com.tongtongxue.analysis;
import java.io.IOException;
import java.sql.Connection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AnalysisServlet extends HttpServlet {
private static final long serialVersionUID = 2154562813857678799L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Connection conn = null;
try {
conn = DBUtil.getConn();
String email = req.getParameter("t_email");
String createDateTime = DateUtil.date2Str();
String ip = req.getRemoteAddr();
if (email == null) {
email = "";
}
if (ip == null) {
ip = "";
}
AnalysisBean analysisBean = new AnalysisBean(email, ip, createDateTime);
AnalysisDao analysisDao = new AnalysisDao(conn);
analysisDao.add(analysisBean);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
DBUtil.close(null, null, conn);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
AnalysisBean
统计信息java bean
package com.tongtongxue.analysis;
public class AnalysisBean {
private Integer id;
private String email;
private String ip;
private String createDateTime;
public AnalysisBean() {
}
public AnalysisBean(String email, String ip, String createDateTime) {
this.email = email;
this.ip = ip;
this.createDateTime = createDateTime;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getIp() {
return ip;
}
public void setIp(String ip) {
this.ip = ip;
}
public String getCreateDateTime() {
return createDateTime;
}
public void setCreateDateTime(String createDateTime) {
this.createDateTime = createDateTime;
}
}
AnalysisDao
package com.tongtongxue.analysis;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class AnalysisDao {
private Connection conn;
public AnalysisDao(Connection conn) {
this.conn = conn;
}
public void add(AnalysisBean analysisBean) throws Exception {
String sql = "insert into t_analysis(email, ip, createDateTime) values(?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, analysisBean.getEmail());
pstmt.setString(2, analysisBean.getIp());
pstmt.setString(3, analysisBean.getCreateDateTime());
pstmt.executeUpdate();
DBUtil.close(null, pstmt, null);
}
}
DBUtil
数据库工具类:
package com.tongtongxue.analysis;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class DBUtil {
public static final String url = "jdbc:mysql://127.0.0.1/analysis-mail";
public static final String name = "com.mysql.jdbc.Driver";
public static final String user = "root";
public static final String password = "";
public static Connection getConn() throws Exception {
Class.forName(name);
Connection conn = DriverManager.getConnection(url, user, password);
return conn;
}
public static void close(ResultSet rs, Statement stmt, Connection conn) throws Exception {
if (rs != null) {
rs.close();
}
if (stmt != null) {
stmt.close();
}
if (conn != null) {
conn.close();
}
}
}
DateUtil
时间工具类:
package com.tongtongxue.analysis;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
private static String format = "yyyy-MM-dd HH:mm:ss";
public static String date2Str() {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(new Date());
}
}
转载链接:http://www.tongtongxue.com/archives/367.html
更多内容尽在:通通学 - 知识学习与分享平台