第一步:找一个第三方支付公司开一个账号yeepay
开户以后可以获取以下信息:
1:自己的开户账号
2:支付密码 = 双向加密。
3:给一个示例代码。Java.asp.net
p1_MerId=10001126856 - 账号
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl = 密码
第二步:开发支付页面
<form action="<c:url value='/BuyServlet'/>" method="post"> 订单号:<input type="text" name="p2_Order"/><br/> 金额:<input type="text" name="p3_Amt"/><br/> 银行: <input type="radio" name="pd_FrpId" value="BOCO-NET-B2C">交通银行<br/> <input type="radio" name="pd_FrpId" value="CMBC-NET-B2C">民生银行<br/> <input type="submit" value="支付"/> </form>
第三步:开发buySerlvet,组成参数
第四步:加密
PaymentUtiuls
邮件
目标:通过Java代码发送邮件。
邮件协议:
发邮件的:SMTP (Simple Mail Transport Protocal)
收邮件的协议:pop3 (Post Office Protocal 3)
IMAP 新协议 发邮件也可以收邮件。
(一步步的与服务器交互)
SMTP :
Ehlo<空格><你的域名><回车> Ehlo - 与服务器 |
Auth<SP>Login<CRLF> 请求登录 |
Mail<SP>From:<reverse-path><CRLF> 发件人的email:www@aa.com |
Rcpt<SP>To:<forword-path><CRLF> 收件的地址:eee@aa.com |
Data<CRLF> 以下是数据 |
Quit<CRLF> 退出 |
收发邮件的过程:
一般情况下,smtp和pop3是两个服务器(主机)。
Smtp邮件的端口为25。
POP3 端口 为110。
发邮件示例
安装foxmail:
发邮件时,要对用户名和密码进行base64编码
//对用户名和密码进行base64编码 @Test public void base64(){ String name = "wj_leaf12345"; String pwd = "1qaz2wsx"; BASE64Encoder en = new BASE64Encoder(); name = en.encode(name.getBytes()); pwd = en.encode(pwd.getBytes()); System.err.println(name); System.err.println(pwd); }
通过java代码发邮件
用java发邮件,必须要导入新的包
mail.jar – 发邮件的核心包
activation.jar – 对用户和密码加密.
在mail.jar中有三个核心类:
Javax.mail.Session – 是指与邮件服务器会话。整个项目中只要一个就可以了.
Javax.mail.Message(接口) - 准备发送数据信息。
MimeMessage - 可以设置类型的数据信息。
Transport – 它拥有一个方法可以发送Message。
第一步;导入两个jar包
第二步;发简单的邮件
@Test public void sendMail() throws Exception{ //第一步:声明properties对象放信息 Properties prop = new Properties(); //设置连接哪一台服务器 prop.setProperty("mail.host","smtp.126.com"); //设置是否验证 prop.setProperty("mail.smtp.auth", "true"); //第二步:声明用户名和密码 Authenticator auth = new Authenticator() { //此访求返回用户和密码的对象 public PasswordAuthentication getPasswordAuthentication() { PasswordAuthentication pa = new PasswordAuthentication("wj_leaf12345", "1qaz2wsx"); return pa; } }; ////第二步:获取Session对象 Session session = Session.getDefaultInstance(prop,auth); //设置session的调试模式 session.setDebug(true); //第三步:声明信息 MimeMessage mm1 = new MimeMessage(session); //第四步:设置发件人email Address from = new InternetAddress("wj_leaf12345@126.com"); mm1.setFrom(from); //第五步:设置收件人 mm1.setRecipient(RecipientType.TO,new InternetAddress("wj_leaf12345@163.com")); mm1.setRecipient(RecipientType.CC, new InternetAddress("549051701@qq.com")); mm1.setRecipient(RecipientType.BCC, new InternetAddress("wj@itcast.cn")); //第六步:设置主题 mm1.setSubject("这是用Java发的邮件3"); mm1.setContent("你好,这是用java发的邮件,3333再试一下", "text/plain;charset=UTF-8"); //第七步: Transport.send(mm1); }
第三步:发带有超连接的邮件
mm1.setSubject("这是用Java发的邮件sfasdf3"); mm1.setContent("你好,这是用java发的邮件,<a href='http://www.baidu.com'>传智</a>", "text/html;charset=UTF-8"); //第七步: Transport.send(mm1);
第四步:符件的邮件
@Test public void sendFile() throws Exception{ Properties p = new Properties(); p.setProperty("mail.host","smtp.163.com"); p.setProperty("mail.smtp.auth","true"); Session s = Session.getDefaultInstance(p,new Authenticator() { @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("wj_leaf12345", "1qaz2wsx"); } }); s.setDebug(true); //声明MimeMessage MimeMessage msg = new MimeMessage(s); msg.setFrom(new InternetAddress("wj_leaf12345@163.com")); msg.setRecipient(RecipientType.TO, new InternetAddress("wj_leaf12345@126.com")); msg.setSubject("图片的"); //第一步:声明多处理的Part MimeMultipart mm = new MimeMultipart(); //第二步:声明 MimeBodyPart body1 = new MimeBodyPart(); //第三步:设置符件 DataSource ds = new FileDataSource(new File("./img/a.jpg")); DataHandler dh = new DataHandler(ds); body1.setDataHandler(dh); //必须要设置名称 body1.setFileName(MimeUtility.encodeText("美女.jpg")); MimeBodyPart body2 = new MimeBodyPart(); //第三步:设置符件 DataSource ds2 = new FileDataSource(new File("./img/b.jpg")); DataHandler dh2 = new DataHandler(ds2); body2.setDataHandler(dh2); //必须要设置名称 body2.setFileName(MimeUtility.encodeText("美女2.jpg")); MimeBodyPart body3 = new MimeBodyPart(); //第三步:设置符件 DataSource ds3 = new FileDataSource(new File("./img/m.mp3")); DataHandler dh3 = new DataHandler(ds3); body3.setDataHandler(dh3); //必须要设置名称 body3.setFileName(MimeUtility.encodeText("世纪末.mp3")); //将body1添加到mm mm.addBodyPart(body1); mm.addBodyPart(body2); mm.addBodyPart(body3); msg.setContent(mm); //发送 Transport.send(msg); }
项目示例-通过邮件激活账号
关键点就在于:
根据用户的给出的email,给这个email发送一个邮件。这个邮件中应该带有一个激活码?(32位UUID,64位UUID)。
提供以下功能:注册功能 - 只要用户注册成功,就给他发邮件。 RegServlet
接收以下信息:Name,pwd,email
提供用户激活功能 .
接收以下信息:只接收激活码。
提供用户登录功能:用户只有激活账号以后才可以登录。
第一步:创建数据结构
Uid activecode create database active character set utf8; use active; create table users( id varchar(32) primary key, name varchar(30), pwd varchar(32), email varchar(50) ); create table active( uid varchar(32) primary key, code varchar(64), constraint a_fk foreign key(uid) references users(id) );
创建javaBean:
package cn.itcast.domain; public class User { private String id; private String name; private String pwd; private String email; private String code; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", pwd=" + pwd + ", email=" + email + ", code=" + code + "]"; } }
第二步:设计
注册页面:
<hr/> <p>主页</p> <form name="xx" action="" method="post"> Name:<input type="text" name="name"/><br/> Pwd:<input type="text" name="pwd"/><br/> Email:<input type="text" name="email"/><br/> <input type="button" onclick="_login();" value="登录"/> <input type="button" onclick="_reg();" value="注册"/> </form> </body> <script type="text/javascript"> function _reg(){ document.forms[0].action="<c:url value='/RegServlet'/>"; document.forms[0].submit(); } function _login(){ document.forms[0].action="<c:url value='/LoginServlet'/>"; document.forms[0].submit(); } </script>
第三步:注册的Servlet-RegServlet
注册成功以后给用户发邮件:
public class RegServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); String mail = request.getParameter("email"); //声明对象 User u = new User(); u.setName(name); u.setPwd(pwd); u.setEmail(mail); //调用后台的serice保存 Connection con = null; try{ con = DataSourceUtils.getDatasSource().getConnection(); u.setId(UUID.randomUUID().toString().replace("-", "")); u.setCode(UUID.randomUUID().toString().replace("-", "") +UUID.randomUUID().toString().replace("-", "")); con.setAutoCommit(false); //先保存user表 String sql = "insert into users values(?,?,?,?)"; QueryRunner run = new QueryRunner(); run.update(con, sql,u.getId(),u.getName(),u.getPwd(),u.getEmail()); // sql = "insert into active values(?,?)"; run.update(con,sql,u.getId(),u.getCode()); con.commit(); }catch(Exception e){ try { con.rollback(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } throw new RuntimeException(e); }finally{ try { con.close(); DataSourceUtils.remove(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); out.print("你已经注册成功,请去激活,如果没有收到邮件,请等一会再收."); new SendThread(u).start(); } } //声明一个线程专门发邮件 class SendThread extends Thread{ private User user; public SendThread(User u) { this.user=u; } @Override public void run() { try{ Properties p = new Properties(); p.setProperty("mail.host","127.0.0.1"); p.setProperty("mail.smtp.auth", "true"); Session s = Session.getDefaultInstance(p,new Authenticator() { public javax.mail.PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("one", "1234"); }; }); s.setDebug(true); MimeMessage mm = new MimeMessage(s); mm.setFrom(new InternetAddress("one@wj.com")); mm.setRecipient(RecipientType.TO,new InternetAddress(user.getEmail())); mm.setSubject("请去激活"); //声明url String url = "http://192.168.1.100:6666/day21_active/ActiveServlet?id="+user.getCode(); String html ="你好:"+user.getName()+"<br/>请激活:<a href='"+url+"'>激活</a>,你可以Copy这个连接:"+url; mm.setContent(html,"text/html;charset=UTf-8"); Transport.send(mm); }catch(Exception e){ e.printStackTrace(); } } }
第四步:激活的ActiveSerlvet
public class ActiveServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String code = request.getParameter("id"); try{ String sql = "delete from active where code=?"; QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource()); int effect = run.update(sql,code); if(effect==0){ response.getWriter().print("Active Failed..."); }else{ response.getWriter().print("Active Successfully"); } }catch(Exception e){ e.printStackTrace(); } } }
第五步登录的serlvet – LoingSerlvet
public class LoginSerlvet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); request.setCharacterEncoding("UTF-8"); String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); //如果 try{ String sql = "SELECT id,name,pwd,email,code"+ " FROM users LEFT JOIN active ON users.id=active.uid"+ " WHERE name=? and pwd=?"; QueryRunner run = new QueryRunner(DataSourceUtils.getDatasSource()); User u = run.query(sql,new BeanHandler<User>(User.class),name,pwd); if(u==null){ out.print("你的用户名或是密码错误.."); }else{ if(u.getCode()==null){ out.print("你登录成功、。。。"); }else{ out.print("你还没有激活..."); } } }catch(Exception e){ e.printStackTrace(); } } }