此次示例有点仿照163邮箱的收件箱,不过目前实现的功能非常少,重点在练习POP3协议解析电子邮件的知识点,所以此Web程序只是随便做做(用的是Struts2)。目前未完全实现的效果图:
Web工程结构:
所有代码:
- /**
- * ParseEmailTest
- * 解决中文乱码的过滤器
- */
- package com.labci.javamail.filter;
- import java.io.IOException;
- import java.util.logging.LogRecord;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[3:06:09 PM]
- *
- */
- public class CharacterEncodingFilter implements Filter,
- java.util.logging.Filter {
- private String encoding="gbk";
- public void destroy() {
- }
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- request.setCharacterEncoding(encoding);
- response.setContentType("message/rfc822");
- chain.doFilter(request, response);
- }
- public void init(FilterConfig config) throws ServletException {
- encoding=config.getInitParameter("encode");
- }
- public boolean isLoggable(LogRecord record) {
- return false;
- }
- }
- /**
- * ParseEmailTest
- * 封装Message的vo类
- */
- package com.labci.javamail.vo;
- import javax.mail.Message;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[1:43:00 PM]
- *
- */
- public class MessageVo {
- private Message msg;//邮件实体类
- private int messageId;//自定义的邮件id
- private String from;//邮件发送人地址
- private String personal;//邮件发送显示名
- private String subject;//邮件主题
- private String content;//邮件内容,此字段暂时未用上
- private String sentDate;//收件箱列表时间的显示格式
- private boolean unRead;//判断邮件是否是新邮件
- private boolean hasAttach=false;//是否有附件
- public Message getMsg() {
- return msg;
- }
- public void setMsg(Message msg) {
- this.msg = msg;
- }
- public String getFrom() {
- return from;
- }
- public void setFrom(String from) {
- this.from = from;
- }
- public int getMessageId() {
- return messageId;
- }
- public void setMessageId(int messageId) {
- this.messageId = messageId;
- }
- public boolean isHasAttach() {
- return hasAttach;
- }
- public void setHasAttach(boolean hasAttach) {
- this.hasAttach = hasAttach;
- }
- public String getContent() {
- return content;
- }
- public void setContent(String content) {
- this.content = content;
- }
- public String getSubject() {
- return subject;
- }
- public void setSubject(String subject) {
- this.subject = subject;
- }
- public String getPersonal() {
- return personal;
- }
- public void setPersonal(String personal) {
- this.personal = personal;
- }
- public String getSentDate() {
- return sentDate;
- }
- public void setSentDate(String sentDate) {
- this.sentDate = sentDate;
- }
- public boolean isUnRead() {
- return unRead;
- }
- public void setUnRead(boolean unRead) {
- this.unRead = unRead;
- }
- }
- /**
- * ParseEmailTest
- * 一个简单地邮件分页组件
- */
- package com.labci.javamail.utils;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import com.labci.javamail.vo.MessageVo;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[9:29:53 AM]
- *
- */
- public class MessagePageBean {
- //总邮件数
- private List<MessageVo> recordsList=null;
- //当前页码
- private Integer pageNo=1;
- //总页数
- @SuppressWarnings("unused")
- private Integer totalPage=1;
- //总记录数
- private Integer totalCount=0;
- //每页大小
- private Integer pageSize=20;
- //是否有下一页
- private Boolean hasNext=false;
- //是否有上一页
- private Boolean hasPrev=false;
- /**
- * 构造初始化邮件列表和邮件总数
- * @param recordsList
- */
- public MessagePageBean(List<MessageVo> recordsList) {
- this.recordsList = recordsList;
- if(!isListNull(recordsList)){
- totalCount=recordsList.size();
- }
- }
- /**
- * 取得每页的邮件数据
- * @param pageNo 当前页码
- * @param pageSize 取多少条记录
- * @return {"currentPage":当前第几页,"pageSize":每页大小,"totalCount":总记录数,"totalPage":总页数,
- * "recordsList":List<Message> list 每页邮件列表,"hasNext":是否有下一页,"hasPrev":是否有上一页}
- */
- public Map<String,Object> getPageRecordsMap(int pageNo,int pageSize){
- Map<String,Object> pageRecordsMap=new HashMap<String,Object>();
- pageRecordsMap.put("currentPage", pageNo);
- pageRecordsMap.put("pageSize", pageSize);
- pageRecordsMap.put("totalCount", getTotalCount());
- pageRecordsMap.put("totalPage", getTotalPage());
- int fromIndex=0;
- int toIndex=0;
- fromIndex=pageSize*(pageNo-1);
- toIndex=fromIndex+pageSize;
- if(toIndex>getTotalCount()){
- toIndex=getTotalCount();
- }
- if(fromIndex<0){
- fromIndex=0;
- }
- setPageNo(pageNo);
- pageRecordsMap.put("recordsList", recordsList.subList(fromIndex, toIndex));
- pageRecordsMap.put("hasNext", getHasNext());
- pageRecordsMap.put("hasPrev", getHasPrev());
- return pageRecordsMap;
- }
- private boolean isListNull(List<MessageVo> recordsList){
- boolean isNull=false;
- if(null==recordsList||recordsList.size()<=0){
- isNull=true;
- }
- return isNull;
- }
- public Integer getPageNo() {
- return pageNo;
- }
- public void setPageNo(Integer pageNo) {
- this.pageNo = pageNo;
- }
- public Integer getTotalPage() {
- return (getTotalCount()+pageSize-1)/pageSize;
- }
- public Integer getTotalCount() {
- return totalCount;
- }
- public Integer getPageSize() {
- return pageSize<=0?10:pageSize;
- }
- public Boolean getHasNext() {
- hasNext=pageNo<getTotalPage()?true:false;
- return hasNext;
- }
- public Boolean getHasPrev() {
- hasPrev=pageNo>1?true:false;
- return hasPrev;
- }
- }
- /**
- * ParseEmailTest
- * 对邮件按时间排序,即最新的邮件显示在最上面
- * 由于是通过API去访问而不是通过数据库的形式,所以这里的排序性能很差
- */
- package com.labci.javamail.utils;
- import java.util.Comparator;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[12:05:48 PM]
- *
- */
- public class MessageComparator implements Comparator<Message> {
- public int compare(Message o1, Message o2) {
- boolean isBefore=false;
- try {
- isBefore = o1.getSentDate().before(o2.getSentDate());
- } catch (MessagingException e) {
- e.printStackTrace();
- }
- int rntValue=0;
- if(isBefore){
- rntValue=1;
- }else{
- rntValue=-1;
- }
- return rntValue;
- }
- }
- /**
- * ParseEmailTest
- * 用BASE64算法解析指定字符串
- */
- package com.labci.javamail.utils;
- import java.io.IOException;
- import sun.misc.BASE64Decoder;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[1:36:22 PM]
- *
- */
- public class DecodeFrom {
- private DecodeFrom(){
- }
- public static String getDecondedString(String from){
- String fromStr="";
- try {
- fromStr=new String(new BASE64Decoder().decodeBuffer(from));
- } catch (IOException e) {
- e.printStackTrace();
- }
- return fromStr;
- }
- }
- /**
- * ParseEmailTest
- * 查询邮件列表的公用类
- * 也即简单单例模式的使用
- */
- package com.labci.javamail.utils;
- import java.io.IOException;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.mail.Folder;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- import javax.mail.Store;
- import javax.mail.internet.InternetAddress;
- import com.labci.javamail.vo.MessageVo;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[12:14:37 PM]
- *
- */
- public class GetMessageList {
- private static GetMessageList instance=null;
- private GetMessageList(){
- }
- //延迟双重检查机制
- public static GetMessageList getInstance(){
- if(null == instance){
- synchronized(GetMessageList.class){
- if(null == instance){
- instance= new GetMessageList();
- }
- }
- }
- return instance;
- }
- @SuppressWarnings({ "unused", "static-access" })
- public Map<String,Object> getEmailsMap(Store store,int pageNo,int pageSize) throws MessagingException{
- Map<String,Object> rntMap=new HashMap<String,Object>();
- Folder receiveFolder=store.getFolder("inbox");//对于POP3协议此参数值只能是inbox
- receiveFolder.open(Folder.READ_WRITE);//设置收件夹打开后的读写权限
- int messageCount=receiveFolder.getMessageCount();
- if(messageCount<=0){
- return null;
- }
- Message []messages=receiveFolder.getMessages();
- List<Message> messagesList=Arrays.asList(messages);
- //对发送邮件时间按倒序排,这样最新的邮件显示在最上面
- Collections.sort(messagesList, new MessageComparator());
- List<MessageVo> messagesVoList=new ArrayList<MessageVo>();
- int i=0;
- for(Message msg:messagesList){
- InternetAddress[] iAddress=(InternetAddress[]) msg.getFrom();
- String from=iAddress[0].getAddress();
- if(null==from){
- from="";
- }
- String personal=iAddress[0].getPersonal();
- if(null==personal){
- personal="";
- }
- MessageVo mv=new MessageVo();
- mv.setMessageId(i++);
- mv.setMsg(msg);
- mv.setSubject(msg.getSubject());
- try {
- mv.setHasAttach(CommonUtils.getInstance().hasAttach(msg));
- } catch (IOException e) {
- e.printStackTrace();
- }
- mv.setPersonal(personal);
- if(!"".equals(personal)){
- from="<"+from+">";
- }
- mv.setFrom(from);
- mv.setUnRead(CommonUtils.getInstance().isNewMsg(msg));//POP3协议不支持是否是新邮件判断
- mv.setSentDate(DateUtils.getMsgSentDateString(msg.getSentDate()));
- messagesVoList.add(mv);
- }
- Map<String,Object> pageMessageMap=new MessagePageBean(messagesVoList).getPageRecordsMap(pageNo, pageSize);
- rntMap.put("msgMap", pageMessageMap);
- rntMap.put("msgVoList", messagesVoList);
- return rntMap;
- }
- }
- /**
- * ParseEmailTest
- * 处理邮件发送时间格式
- * 该类用到了一个开源jar包,名为date4j.jar
- */
- package com.labci.javamail.utils;
- import hirondelle.date4j.DateTime;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Calendar;
- import java.util.Date;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[9:00:31 PM]
- *
- */
- public class DateUtils {
- private DateUtils(){
- }
- public static String getMsgSentDateString(Date sentDate){
- String dateString="";
- DateFormat hhmmSDF=new SimpleDateFormat("HH:mm");
- DateFormat mmddSDF=new SimpleDateFormat("MM月dd日");
- DateFormat yyyySDF=new SimpleDateFormat("yyyy-MM-dd");
- DateFormat fullSDF=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- DateTime sentDateTime=new DateTime(fullSDF.format(sentDate));
- DateTime todayDateTime=new DateTime(fullSDF.format(new Date()));
- //如果是在今天之内
- if(sentDateTime.isSameDayAs(todayDateTime)){
- dateString=hhmmSDF.format(sentDate);
- }else if(sentDateTime.numDaysFrom(todayDateTime)<=90){
- //如果在三个月内,就显示月和日
- dateString=mmddSDF.format(sentDate);
- }else{
- //否则就显示yyyy-MM-dd
- dateString=yyyySDF.format(sentDate);
- }
- return dateString;
- }
- public static String getSentDateFullString(Date sentDate){
- DateFormat fullSDF=new SimpleDateFormat("yyyy年MM月dd日 HH:mm");
- return fullSDF.format(sentDate);
- }
- public static String getSentDateWeekString(Date sentDate){
- final String dayNames[] = { "星期日", "星期一", "星期二", "星期三",
- "星期四", "星期五","星期六" };
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(sentDate);
- int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK)-1;
- if(dayOfWeek <0){
- dayOfWeek=0;
- }
- return dayNames[dayOfWeek];
- }
- }
- /**
- * ParseEmailTest
- * 一些其它操作的工具类
- *
- */
- package com.labci.javamail.utils;
- import java.io.IOException;
- import java.util.Properties;
- import javax.mail.Flags;
- import javax.mail.Message;
- import javax.mail.MessagingException;
- import javax.mail.Session;
- import javax.servlet.http.HttpServletRequest;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[12:27:03 PM]
- *
- */
- public class CommonUtils {
- //此处的示例POP3服务器主机名写死为163的,不由用户输入
- private static final String HOST="pop3.163.com";
- private static final String PROTOCOL="pop3";
- private static CommonUtils instance=null;
- private CommonUtils(){
- }
- public static CommonUtils getInstance(){
- if(null == instance){
- synchronized(GetMessageList.class){
- if(null == instance){
- instance= new CommonUtils();
- }
- }
- }
- return instance;
- }
- public int getPageNo(HttpServletRequest request){
- int pageNo=1;
- if(null==request.getParameter("pageNo")
- ||"".equals(request.getParameter("pageNo").trim())){
- pageNo=1;
- }else{
- pageNo=Integer.parseInt(request.getParameter("pageNo"));
- }
- return pageNo;
- }
- //取得JavaMail的Session
- public Session getMailSession(){
- Properties mailProps=new Properties();
- mailProps.put("mail.store.protocol", PROTOCOL);
- mailProps.put("mail.pop3.host", HOST);
- Session session=Session.getDefaultInstance(mailProps);
- return session;
- }
- /**
- * 是否有附件
- * @param msg
- * @return
- * @throws MessagingException
- * @throws IOException
- */
- public boolean hasAttach(Message msg) throws MessagingException, IOException{
- boolean hasAttach=false;
- if(msg.getContentType().contains("multipart/mixed")){
- hasAttach=true;
- }
- return hasAttach;
- }
- public boolean isNewMsg(Message msg) throws MessagingException {
- boolean isNew = false;
- Flags flags = msg.getFlags();
- Flags.Flag[] flag = flags.getSystemFlags();
- for (int i = 0; i < flag.length; i++) {
- if (flag[i] == Flags.Flag.SEEN) {
- isNew = true;
- break;
- }
- }
- return isNew;
- }
- }
- /**
- * ParseEmailTest
- * 登录邮箱
- */
- package com.labci.javamail.action;
- import java.util.Map;
- import javax.mail.MessagingException;
- import javax.mail.Store;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import com.labci.javamail.utils.CommonUtils;
- import com.labci.javamail.utils.GetMessageList;
- import com.opensymphony.xwork2.Action;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[10:22:24 AM]
- *
- */
- public class LoginMailAction implements Action, ServletRequestAware {
- private HttpServletRequest request;
- //此处的示例POP3服务器主机名写死为163的,不由用户输入
- private static final String HOST="pop3.163.com";
- private static final int PAGESIZE=20;
- public String execute() throws Exception {
- String username=request.getParameter("username");
- String password=request.getParameter("password");
- Store store=CommonUtils.getInstance().getMailSession().getStore();
- try{
- store.connect(HOST,username,password);
- request.getSession().setAttribute("store", store);
- }catch(MessagingException e){
- //登录失败
- request.setAttribute("loginFailure", "登录失败,请确认用户名或密码");
- return ERROR;
- }
- //登录成功后的操作
- displayEmails(store,CommonUtils.getInstance().getPageNo(request),PAGESIZE);
- return SUCCESS;//去邮件列表显示页
- }
- //登录成功后的操作
- @SuppressWarnings("unchecked")
- private void displayEmails(Store store,int pageNo,int pageSize) throws MessagingException{
- Map<String,Object> rntMap = GetMessageList.getInstance().getEmailsMap(store, pageNo, pageSize);
- Map<String,Object> mailsMap=(Map<String, Object>) rntMap.get("msgMap");
- if(null == mailsMap){
- request.setAttribute("notAvailableEmail", "您当前的邮箱中没有收到任何邮件");
- }else{
- request.setAttribute("recordsMap", mailsMap);
- }
- }
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }
- /**
- * ParseEmailTest
- * 邮件列表翻页类
- */
- package com.labci.javamail.action;
- import java.util.Map;
- import javax.mail.MessagingException;
- import javax.mail.Store;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import com.labci.javamail.utils.CommonUtils;
- import com.labci.javamail.utils.GetMessageList;
- import com.opensymphony.xwork2.Action;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[12:25:20 PM]
- *
- */
- public class MailListAction implements Action, ServletRequestAware{
- private HttpServletRequest request;
- private static final int PAGESIZE=20;
- public String execute() throws Exception {
- int pageNo=CommonUtils.getInstance().getPageNo(request);
- Store store=null;
- if(null != request.getSession().getAttribute("store")){
- store=(Store) request.getSession().getAttribute("store");
- }
- displayEmails(store,pageNo,PAGESIZE);
- return SUCCESS;
- }
- //登录成功后的操作
- @SuppressWarnings("unchecked")
- private void displayEmails(Store store,int pageNo,int pageSize) throws MessagingException{
- Map<String,Object> rntMap = GetMessageList.getInstance().getEmailsMap(store, pageNo, pageSize);
- Map<String,Object> mailsMap=(Map<String, Object>) rntMap.get("msgMap");
- if(null == mailsMap){
- request.setAttribute("notAvailableEmail", "您当前的邮箱中没有收到任何邮件");
- }else{
- request.setAttribute("recordsMap", mailsMap);
- }
- }
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }
- /**
- * ParseEmailTest
- * 查看邮件的类
- */
- package com.labci.javamail.action;
- import java.io.BufferedReader;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import javax.mail.Address;
- import javax.mail.MessagingException;
- import javax.mail.Multipart;
- import javax.mail.Part;
- import javax.mail.Store;
- import javax.mail.Message.RecipientType;
- import javax.servlet.http.HttpServletRequest;
- import org.apache.struts2.interceptor.ServletRequestAware;
- import com.labci.javamail.utils.CommonUtils;
- import com.labci.javamail.utils.DateUtils;
- import com.labci.javamail.utils.GetMessageList;
- import com.labci.javamail.vo.MessageVo;
- import com.opensymphony.xwork2.Action;
- /**
- * @author Bill Tu(tujiyue/iwtxokhtd)
- * May 28, 2011[12:25:20 PM]
- *
- */
- public class ViewMailAction implements Action, ServletRequestAware{
- private HttpServletRequest request;
- private static final int PAGESIZE=20;
- @SuppressWarnings("unchecked")
- public String execute() throws Exception {
- int pageNo=CommonUtils.getInstance().getPageNo(request);
- int messageId=Integer.parseInt(request.getParameter("messageId"));
- Store store=null;
- if(null != request.getSession().getAttribute("store")){
- store=(Store) request.getSession().getAttribute("store");
- }
- Map<String,Object> rntMap = GetMessageList.getInstance().getEmailsMap(store, pageNo, PAGESIZE);
- List<MessageVo> messageVoList=(List<MessageVo>) rntMap.get("msgVoList");
- MessageVo msgVo=null;
- if(!isMessageListNull(messageVoList)){
- msgVo=messageVoList.get(messageId);
- }
- Map<String,Object> msgMap=new HashMap<String,Object>();
- if(null!=msgVo){
- msgMap.put("from", msgVo.getFrom());
- msgMap.put("personal", msgVo.getPersonal());
- msgMap.put("messageId", msgVo.getMessageId());
- msgMap.put("subject", msgVo.getSubject());
- msgMap.put("sentDate", DateUtils.getSentDateFullString(msgVo.getMsg().getSentDate())
- +"("+DateUtils.getSentDateWeekString(msgVo.getMsg().getSentDate())+")");
- Address []toAddress=msgVo.getMsg().getRecipients(RecipientType.TO);
- if(null!=toAddress && toAddress.length>0){
- StringBuilder addressStr=new StringBuilder("");
- for(Address address:toAddress){
- addressStr.append(address.toString()).append(";");
- }
- addressStr.deleteCharAt(addressStr.length()-1);
- msgMap.put("receiver", addressStr.toString());
- }else{
- msgMap.put("receiver", "(无)");
- }
- if(!msgVo.getMsg().getContentType().trim().equals("multipart/mixed")){
- msgMap.put("content",getHtmlContent(msgVo));
- }else{
- //这里对附件的解析还没完全实现
- Multipart mp = (Multipart) msgVo.getMsg().getContent();
- for(int i=0;i<mp.getCount();i++){
- Part part=mp.getBodyPart(i);
- if(part.getContent() instanceof Multipart){//此条件可能不成立
- Multipart p=(Multipart) part.getContent();
- for(int j=0;j<p.getCount();j++){
- if(p.getBodyPart(j).getContentType().startsWith("text/plain")){
- msgMap.put("content",p.getBodyPart(j).getContent()+"");
- }else{
- msgMap.put("content",p.getBodyPart(j).getContent()+"");
- }
- }
- }
- if(null !=part.getDisposition()){//如果有附件
- InputStream is=part.getInputStream();
- FileOutputStream fos=new FileOutputStream(part.getFileName());
- int readData=0;
- while((readData=is.read())!=-1){
- fos.write(readData);
- }
- is.close();
- fos.close();
- }
- }
- }
- }
- request.setAttribute("msgMap", msgMap);
- return SUCCESS;
- }
- private String getHtmlContent(MessageVo msgVo) throws IOException, MessagingException{
- InputStream is=msgVo.getMsg().getDataHandler().getInputStream();
- BufferedReader br=new BufferedReader(new InputStreamReader(is));
- StringBuilder sb=new StringBuilder("");
- String input=null;
- while(null !=(input=br.readLine())){
- sb.append(input);
- }
- return sb.toString();
- }
- private boolean isMessageListNull(List<MessageVo> messageVoList){
- boolean isListNull=false;
- if(null ==messageVoList || messageVoList.size()<=0){
- isListNull=true;
- }
- return isListNull;
- }
- public void setServletRequest(HttpServletRequest arg0) {
- this.request=arg0;
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.4"
- xmlns="http://java.sun.com/xml/ns/j2ee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
- http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- <filter>
- <filter-name>encoding</filter-name>
- <filter-class>com.labci.javamail.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encode</param-name>
- <param-value>gbk</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>encoding</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter>
- <filter-name>struts2</filter-name>
- <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>struts2</filter-name>
- <url-pattern>*.do</url-pattern>
- </filter-mapping>
- <session-config>
- <session-timeout>1440</session-timeout>
- </session-config>
- </web-app>
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.action.extension" value="do" />
- <constant name="struts.devMode" value="false" />
- <package name="mail" extends="struts-default">
- <action name="login" class="com.labci.javamail.action.LoginMailAction">
- <result name="success">mailList.jsp</result>
- <result name="error">index.jsp</result>
- </action>
- <action name="mailList" class="com.labci.javamail.action.MailListAction">
- <result name="success">mailList.jsp</result>
- </action>
- <action name="viewMail" class="com.labci.javamail.action.ViewMailAction">
- <result name="success">viewMail.jsp</result>
- </action>
- </package>
- </struts>
- <%@ page language="java" pageEncoding="gbk"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>登录网易邮箱</title>
- </head>
- <body>
- <form action="login.do" method="post">
- 请使用163邮箱账号进行登录<br/>
- 用户名:<input type="text" name="username"/><br/>
- 密 码:<input type="password" name="password"/><br/>
- <input type="submit" value="登录"/>
- <input type="reset" value="重置"/>
- </form>
- </body>
- </html>
- <%@ page language="java" pageEncoding="gbk"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>收件箱</title>
- </head>
- <body>
- <table>
- <c:choose>
- <c:when test="${!empty notAvailableEmail}">
- <tr>
- <td>
- <c:out value="${notAvailableEmail}"/>
- </td>
- </tr>
- </c:when>
- <c:otherwise>
- <tr>
- <td>共有<b>${recordsMap['totalCount']}</b>封邮件,当前第<b>${recordsMap['currentPage']}</b>页,
- 每页显示<b>${recordsMap['pageSize']}</b>封,共有<b>${recordsMap['totalPage']}</b>页</td>
- </tr>
- <tr><td><hr/></td></tr>
- <tr>
- <td>
- <input type="checkbox" name="selectAll"/> <input type="button" name="deleteMsg" value="删除">
- </td>
- </tr>
- <tr><td colspan="4"><b><hr/></b></td></tr>
- <c:forEach items="${recordsMap['recordsList']}" var="mailVo">
- <tr>
- <td><input type="checkbox" name="messageId" value="${mailVo.messageId}"/><b>${mailVo.personal}</b>${mailVo.from}</td>
- <td>
- <c:choose>
- <c:when test="${mailVo.unRead}">
- <b><a href="viewMail.do?messageId=${mailVo.messageId}&pageNo=${recordsMap['currentPage']}" mce_href="viewMail.do?messageId=${mailVo.messageId}&pageNo=${recordsMap['currentPage']}">${mailVo.subject}</a></b>
- </c:when>
- <c:otherwise>
- <a href="viewMail.do?messageId=${mailVo.messageId}&pageNo=${recordsMap['currentPage']}" mce_href="viewMail.do?messageId=${mailVo.messageId}&pageNo=${recordsMap['currentPage']}">${mailVo.subject}</a>
- </c:otherwise>
- </c:choose>
- </td>
- <td>
- <c:if test="${mailVo.hasAttach}">
- <img src="images/attach.jpg" mce_src="images/attach.jpg" title="附件"/>
- </c:if>
- </td>
- <td>
- ${mailVo.sentDate}
- </td>
- </tr>
- </c:forEach>
- <tr>
- <td>
- <c:if test="${recordsMap['hasNext']}"><a href="mailList.do?pageNo=${recordsMap['currentPage']+1}" mce_href="mailList.do?pageNo=${recordsMap['currentPage']+1}">下一页</a></c:if>
- <c:if test="${recordsMap['hasPrev']}"><a href="mailList.do?pageNo=${recordsMap['currentPage']-1}" mce_href="mailList.do?pageNo=${recordsMap['currentPage']-1}">上一页</a></c:if>
- </td>
- </tr>
- </c:otherwise>
- </c:choose>
- </table>
- </body>
- </html>
- <%@ page language="java" pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>查看邮件</title>
- </head>
- <body>
- <table>
- <tr>
- <td><b>${msgMap['subject']}</b></td>
- </tr>
- <tr>
- <td>发件人:<b>${msgMap['personal']}</b>${msgMap['from']}</td>
- </tr>
- <tr>
- <td>时间:${msgMap['sentDate']}</td>
- </tr>
- <tr>
- <td>收件人:${msgMap['receiver']}</td>
- </tr>
- <tr>
- <td>
- <hr/>
- </td>
- </tr>
- <tr>
- <td>${msgMap['content']}</td>
- </tr>
- <tr>
- <td>
- <c:if test="${!empty msgMap['attachNameList']}">
- <c:forEach items="${msgMap['attachNameList']}" var="attach">
- ${attach}
- </c:forEach>
- </c:if>
- </td>
- </tr>
- </table>
- </body>
- </html>
相关推荐
- **Email Support**:若需通过电子邮件发送测试结果,则需安装Sun的JavaMail包。 - **SSL Encryption**:为了支持HTTPS协议的测试,需要安装SSL支持。 - **JDBC Drivers**:执行JDBC测试时必需的数据库驱动。 - **...
- JavaMail API 使 Java 应用程序能够轻松地发送和接收电子邮件。 - **Java多线程编程** - Java 支持并发编程,可以创建多个线程来执行任务。多线程可以显著提高程序的性能。 - **JavaApplet 基础** - Applets 是...
在Java领域,JAF全称为JavaBeans Activation Framework,它是Java平台的一部分,主要用于处理数据对象,特别是电子邮件和MIME类型的数据。接下来,我们将深入探讨JavaBeans Activation Framework的相关知识点。 **...
计算机硬件控制_驱动级键盘鼠标同步_PS2接口UDP协议多机协同_基于rabirdwinio和pynput的跨设备输入共享系统_实现多台Windows电脑的键盘鼠标同步操作_支持
嵌入式八股文面试题库资料知识宝典-TCPIP协议栈.zip
少儿编程scratch项目源代码文件案例素材-开膛手杰克.zip
基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型,个人经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做大作业的学生和需要项目实战练习的学习者,可作为毕业设计、课程设计、期末大作业,代码资料完整,下载可用。 基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现遥感图像滑坡识别源码+数据集+训练好的模型基于深度学习CNN网络+pytorch框架实现
内容概要:本文详细探讨了电力弹簧技术在主动配电网规划及运行优化调度中的应用。首先介绍了电力弹簧技术作为智能电网调控手段的优势,如自适应性强、响应速度快、节能环保等。接着阐述了主动配电网规划的目标和策略,包括优化电网结构、提高能源利用效率和降低故障风险。随后讨论了运行优化调度的原则和方法,强调了实时监测、智能调度策略以及优化调度模型的重要性。最后通过实际案例分析展示了电力弹簧技术在提升电网稳定性、可靠性和能效方面的显著效果,展望了其广阔的应用前景。 适合人群:从事电力系统规划、运行管理的研究人员和技术人员,以及对智能电网感兴趣的学者和学生。 使用场景及目标:适用于希望深入了解电力弹簧技术及其在主动配电网规划和运行优化调度中具体应用的专业人士。目标是掌握电力弹簧技术的工作原理、优势及其在实际项目中的实施方法。 其他说明:本文不仅提供了理论分析,还有具体的案例支持,有助于读者全面理解电力弹簧技术的实际应用价值。
嵌入式八股文面试题库资料知识宝典-C语言思维导图.zip
电路教学与科研案例的结合—以最大功率传输定理为例.pdf
内容概要:本文深入介绍了HarmonyOS文件系统及其在万物互联时代的重要性。HarmonyOS自2019年发布以来,逐步覆盖多种智能设备,构建了庞大的鸿蒙生态。文件系统作为其中的“数字管家”,不仅管理存储资源,还实现多设备间的数据协同。文章详细介绍了常见的文件系统类型,如FAT、NTFS、UFS、EXT3和ReiserFS,各自特点和适用场景。特别强调了HarmonyOS的分布式文件系统(hmdfs),它通过分布式软总线技术,打破了设备界限,实现了跨设备文件的无缝访问。此外,文章对比了HarmonyOS与Android、iOS文件系统的差异,突出了其在架构、跨设备能力和安全性方面的优势。最后,从开发者视角讲解了开发工具、关键API及注意事项,并展望了未来的技术发展趋势和对鸿蒙生态的影响。 适合人群:对操作系统底层技术感兴趣的开发者和技术爱好者,尤其是关注物联网和多设备协同的用户。 使用场景及目标:①理解HarmonyOS文件系统的工作原理及其在多设备协同中的作用;②掌握不同文件系统的特性和应用场景;③学习如何利用HarmonyOS文件系统进行应用开发,提升跨设备协同和数据安全。 阅读建议:本文内容详实,涵盖了从基础概念到高级开发技巧的多个层次,建议读者结合自身需求,重点关注感兴趣的部分,并通过实践加深理解。特别是开发者可参考提供的API示例和开发技巧,尝试构建基于HarmonyOS的应用。
嵌入式八股文面试题库资料知识宝典-海康嵌入式笔试题.zip
内容概要:本文详细介绍了基于瞬时无功功率理论的三电平有源电力滤波器(APF)仿真研究。主要内容涵盖并联型APF的工作原理、三相三电平NPC结构、谐波检测方法(ipiq)、双闭环控制策略(电压外环+电流内环PI控制)以及SVPWM矢量调制技术。仿真结果显示,在APF投入前后,电网电流THD从21.9%降至3.77%,显著提高了电能质量。 适用人群:从事电力系统研究、电力电子技术开发的专业人士,尤其是对有源电力滤波器及其仿真感兴趣的工程师和技术人员。 使用场景及目标:适用于需要解决电力系统中谐波污染和无功补偿问题的研究项目。目标是通过仿真验证APF的有效性和可行性,优化电力系统的电能质量。 其他说明:文中提到的仿真模型涉及多个关键模块,如三相交流电压模块、非线性负载、信号采集模块、LC滤波器模块等,这些模块的设计和协同工作对于实现良好的谐波抑制和无功补偿至关重要。
基于环比增长的销售统计分析——2019年中青杯全国数学建模竞赛C题.pdf
嵌入式八股文面试题库资料知识宝典-linux面试题.zip
嵌入式八股文面试题库资料知识宝典-linux常见面试题.zip
内容概要:本文探讨了小电流接地系统在配电网络中的应用,特别是在单相故障情况下的仿真分析。文中介绍了小电流接地系统的背景和发展现状,重点讨论了两种常见的接地方式——中性点不接地和中性点经消弧线圈接地。利用Matlab作为仿真工具,作者构建了详细的电路模型,模拟了单相故障的发生过程,并通过多个结果图表展示了故障电流、电压波形及系统运行状态。此外,文章还包括了详细的设计说明书和PPT介绍,帮助读者全面理解仿真过程和技术细节。 适合人群:从事电力系统研究、维护的技术人员,尤其是关注配电网络安全和稳定的工程师。 使用场景及目标:适用于希望深入了解小电流接地系统的工作原理和故障处理机制的专业人士。通过本研究,读者可以掌握如何使用Matlab进行电力系统仿真,评估不同接地方式的效果,优化配电网络的安全性能。 其他说明:随文附带完整的仿真工程文件、结果图、设计说明书及PPT介绍,便于读者进一步探索和实践。
少儿编程scratch项目源代码文件案例素材-激烈的殴斗.zip
嵌入式八股文面试题库资料知识宝典-小米嵌入式软件工程师笔试题目解析.zip
内容概要:本文详细探讨了车辆主动避撞技术中的两种常见策略——纵向紧急制动避撞和横向紧急转向避撞。首先介绍了这两种避撞策略的基本概念,接着深入分析了临界纵向安全距离的概念及其对避撞模式选择的影响。文中特别强调了五次多项式换道轨迹模型在计算横向紧急转向避撞安全距离中的应用。最后,通过一个简化的程序实现了避撞策略的模拟和可视化展示,帮助读者更好地理解不同避撞方式的应用场景和技术细节。 适合人群:汽车工程技术人员、交通安全研究人员、自动驾驶开发者。 使用场景及目标:适用于研究和开发车辆主动避撞系统的专业人士,旨在提高对避撞策略的理解,优化避撞算法的设计,提升行车安全性。 其他说明:文章不仅提供了理论分析,还结合了具体的数学模型和程序实现,使读者能够从多个角度全面掌握车辆避撞技术的关键要素。