javaweb实现qq邮箱

一.效果图

javaweb实现qq邮箱_第1张图片

我用的foxmail来接受的邮件的,你可以安装,也可以选择不安装

二.需要

1.mail.jar包

   

2.你需要开启你的qq邮箱

https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256

开启这个服务你才能发邮件,(你要记住你的授权码,用做你登录邮箱的密码,不能用qq密码,会报错)

javaweb实现qq邮箱_第2张图片

三.实现的步骤

1.创建一个web项目

javaweb实现qq邮箱_第3张图片

 

2.项目结构图

   javaweb实现qq邮箱_第4张图片

3.编写filter类,解决中文乱码的问题

 

package com.tz.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;


public class MyFilter implements Filter
{

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// 要增强的方法:request.getParameter
		// 被代理的对象: request
		
		final HttpServletRequest request=(HttpServletRequest)req;
		
		// 动态的生成代理对象
		HttpServletRequest hsr=(HttpServletRequest)Proxy.newProxyInstance(
				request.getClass().getClassLoader(), 
				request.getClass().getInterfaces(),
				new InvocationHandler() {
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						
						// 1 判断是否是需要增强的方法 getParameter
						if("getParameter".equals(method.getName()))
						{
							// 知道getParameter使用的是哪个提交方式 
							String m = request.getMethod();
							// 判断是get还是post
							if("get".equalsIgnoreCase(m))
							{
								// 以前方法调用后的乱码
								String s =(String)method.invoke(request, args);
								// 增强--解决乱码
								s=new String(s.getBytes("iso8859-1"),"utf-8");
								return s;
							}
							
							if("post".equalsIgnoreCase(m))
							{
								request.setCharacterEncoding("utf-8");
								
							}
						}
						
						// 如果是别的方法
						return method.invoke(request, args);
					}
				});
		
		// 放行
		chain.doFilter(hsr, response);
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

}

在web.xml中配置filter

 
        myfilter
        com.tz.filter.MyFilter
    
    
        myfilter
        /*
    

4.编写MailServlet类(主要类)

 

package com.tz.servlet;

import javax.mail.*;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Properties;

@WebServlet("/mail")
public class MailServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        try {
            //接受前端传递过来的值
            //收件人
            String name = req.getParameter("name");
            //主题
            String title= req.getParameter("title");
            //正文
            String content=req.getParameter("content");
            //账户:
            //用户名
            String username ="[email protected]";
            //密码 授权码 lrkxqparssdfsdf  这种样子的
            String password ="授权码";  //这个必须是必须是授权码 不然要抱错
                             //https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256
            // 创建会话对象

            //1、获得邮箱服务的连接(会话对象)
            Properties props = new Properties();//封装数据
            props.put("mail.transport.protocol", "SMTP");//设置发邮件的协议
            props.put("mail.host", "smtp.qq.com");//设置发邮件的地址(smtp邮箱服务器地址) 邮件发送的主机
            props.put("mail.smtp.auth", "true");// 指定验证为true  密码安全验证


            //创建一个邮箱
            Session session = Session.getInstance(props);//会话对象
            MimeMessage ms = new MimeMessage(session);//创建邮件对象

            //设置邮箱的来源
            Address toAddress;
            toAddress = new InternetAddress(username);
            ms.setFrom(toAddress); //设置发送者
            //设置邮箱的接受者  就是前端传来的name
            ms.setRecipients(Message.RecipientType.TO,name);
            ms.setSubject(title);
            ms.setText(content);
            ms.saveChanges();//保存
            //创建一个发送工具
            Transport ts = session.getTransport("smtp");
            ts.connect(username,password);
            ts.sendMessage(ms,ms.getAllRecipients());//拿出所有的接受者
            ts.close();

            String msg = "发送成功";
            req.setAttribute("msg",msg);
            req.getRequestDispatcher("/message.jsp").forward(req,resp);

        } catch (Exception e) {
            e.printStackTrace();
            String msg = "发送失败";
            req.setAttribute("msg",msg);
            req.getRequestDispatcher("/message.jsp").forward(req,resp);
        }
    }
}

5.编写index.jsp页面(你也可以做好看点,我为了方便就没有用css来修饰)

 

<%--
  Created by IntelliJ IDEA.
  User: 20473
  Date: 2019/4/14
  Time: 16:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

  
    $Title$
  
  
    
收件人:


主题 :



正文 :


一个message.jsp页面,用于发送过后页面显示信息,来表示发送失败还是成为

<%--
  Created by IntelliJ IDEA.
  User: 20473
  Date: 2019/4/14
  Time: 23:22
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    信息页面


${msg}

 

好了,一个简单的发送邮件的案例就制作完成了,不仅仅能发qq邮箱,也可以发送其他的邮箱的,

也可以实现群发邮件,邮件中间有英文状态的","号隔开

message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者,这个可以单发,不能群发

ms.setRecipients(Message.RecipientType.TO,name);  //群发

 

 

 

你可能感兴趣的:(javaweb实现qq邮箱)