فهرست منبع

第一次上传

sh12640 5 سال پیش
والد
کامیت
dbac1a8e9d
80فایلهای تغییر یافته به همراه2091 افزوده شده و 0 حذف شده
  1. 2 0
      .idea/.gitignore
  2. 15 0
      .idea/anonymousmail.iml
  3. 6 0
      .idea/inspectionProfiles/profiles_settings.xml
  4. 7 0
      .idea/misc.xml
  5. 8 0
      .idea/modules.xml
  6. 6 0
      .idea/vcs.xml
  7. 60 0
      .idea/workspace.xml
  8. BIN
      db.sqlite3
  9. 1 0
      dist/index.html
  10. 0 0
      dist/static/css/app.5c3a02a237a498bc8f92fe4fa985b501.css
  11. BIN
      dist/static/favicon.ico
  12. BIN
      dist/static/fonts/element-icons.535877f.woff
  13. BIN
      dist/static/fonts/element-icons.732389d.ttf
  14. BIN
      dist/static/img/notFound.afd903c.png
  15. 0 0
      dist/static/js/app.144591f239aad7a24891.js
  16. 1 0
      dist/static/js/manifest.2ae2e69a05c33dfc65f8.js
  17. 6 0
      dist/static/js/vendor.df37f5d6f2528801125a.js
  18. BIN
      dist/static/notFound.png
  19. 0 0
      mail/__init__.py
  20. BIN
      mail/__pycache__/__init__.cpython-35.pyc
  21. BIN
      mail/__pycache__/apps.cpython-35.pyc
  22. BIN
      mail/__pycache__/models.cpython-35.pyc
  23. BIN
      mail/__pycache__/views.cpython-35.pyc
  24. 3 0
      mail/admin.py
  25. 5 0
      mail/apps.py
  26. 0 0
      mail/migrations/__init__.py
  27. BIN
      mail/migrations/__pycache__/__init__.cpython-35.pyc
  28. 3 0
      mail/models.py
  29. 3 0
      mail/tests.py
  30. 124 0
      mail/views.py
  31. 0 0
      mailList/__init__.py
  32. BIN
      mailList/__pycache__/__init__.cpython-35.pyc
  33. BIN
      mailList/__pycache__/settings.cpython-35.pyc
  34. BIN
      mailList/__pycache__/urls.cpython-35.pyc
  35. BIN
      mailList/__pycache__/wsgi.cpython-35.pyc
  36. 131 0
      mailList/settings.py
  37. 27 0
      mailList/urls.py
  38. 16 0
      mailList/wsgi.py
  39. 12 0
      mailreload/.babelrc
  40. 9 0
      mailreload/.editorconfig
  41. 14 0
      mailreload/.gitignore
  42. 10 0
      mailreload/.postcssrc.js
  43. 21 0
      mailreload/README.md
  44. 41 0
      mailreload/build/build.js
  45. 54 0
      mailreload/build/check-versions.js
  46. BIN
      mailreload/build/logo.png
  47. 101 0
      mailreload/build/utils.js
  48. 22 0
      mailreload/build/vue-loader.conf.js
  49. 82 0
      mailreload/build/webpack.base.conf.js
  50. 95 0
      mailreload/build/webpack.dev.conf.js
  51. 145 0
      mailreload/build/webpack.prod.conf.js
  52. 7 0
      mailreload/config/dev.env.js
  53. 69 0
      mailreload/config/index.js
  54. 4 0
      mailreload/config/prod.env.js
  55. 1 0
      mailreload/dist/index.html
  56. 0 0
      mailreload/dist/static/css/app.5c3a02a237a498bc8f92fe4fa985b501.css
  57. BIN
      mailreload/dist/static/favicon.ico
  58. BIN
      mailreload/dist/static/fonts/element-icons.535877f.woff
  59. BIN
      mailreload/dist/static/fonts/element-icons.732389d.ttf
  60. BIN
      mailreload/dist/static/img/notFound.afd903c.png
  61. 0 0
      mailreload/dist/static/js/app.144591f239aad7a24891.js
  62. 1 0
      mailreload/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js
  63. 6 0
      mailreload/dist/static/js/vendor.df37f5d6f2528801125a.js
  64. BIN
      mailreload/dist/static/notFound.png
  65. 19 0
      mailreload/index.html
  66. 68 0
      mailreload/package.json
  67. 12 0
      mailreload/src/App.vue
  68. BIN
      mailreload/src/assets/logo.png
  69. 79 0
      mailreload/src/components/addEmailBox.vue
  70. 196 0
      mailreload/src/components/email.vue
  71. 236 0
      mailreload/src/components/emailList.vue
  72. 164 0
      mailreload/src/components/home.vue
  73. 4 0
      mailreload/src/config/serverurlvalue.js
  74. 71 0
      mailreload/src/js/readMailList.js
  75. 50 0
      mailreload/src/main.js
  76. 52 0
      mailreload/src/router/index.js
  77. 0 0
      mailreload/static/.gitkeep
  78. BIN
      mailreload/static/favicon.ico
  79. BIN
      mailreload/static/notFound.png
  80. 22 0
      manage.py

+ 2 - 0
.idea/.gitignore

@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml

+ 15 - 0
.idea/anonymousmail.iml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+  <component name="TemplatesService">
+    <option name="TEMPLATE_FOLDERS">
+      <list>
+        <option value="$MODULE_DIR$/templates" />
+      </list>
+    </option>
+  </component>
+</module>

+ 6 - 0
.idea/inspectionProfiles/profiles_settings.xml

@@ -0,0 +1,6 @@
+<component name="InspectionProjectProfileManager">
+  <settings>
+    <option name="USE_PROJECT_PROFILE" value="false" />
+    <version value="1.0" />
+  </settings>
+</component>

+ 7 - 0
.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.5 (untitled1)" project-jdk-type="Python SDK" />
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/anonymousmail.iml" filepath="$PROJECT_DIR$/.idea/anonymousmail.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 60 - 0
.idea/workspace.xml

@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="ac0904ff-0060-4f53-8a52-cf43bb605356" name="Default Changelist" comment="" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="Git.Settings">
+    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
+  </component>
+  <component name="IgnoredFileRootStore">
+    <option name="generatedRoots">
+      <set>
+        <option value="G:\project\anonymousmail\.idea" />
+      </set>
+    </option>
+  </component>
+  <component name="ProjectId" id="1jUlulXG3fBlwrQhItUwmw6n5dI" />
+  <component name="ProjectViewState">
+    <option name="hideEmptyMiddlePackages" value="true" />
+    <option name="showExcludedFiles" value="true" />
+    <option name="showLibraryContents" value="true" />
+    <option name="showMembers" value="true" />
+  </component>
+  <component name="PropertiesComponent">
+    <property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="ac0904ff-0060-4f53-8a52-cf43bb605356" name="Default Changelist" comment="" />
+      <created>1603866930214</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1603866930214</updated>
+      <workItem from="1603866933518" duration="64000" />
+      <workItem from="1603866998198" duration="115000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="WindowStateProjectService">
+    <state x="2334" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog" timestamp="1603867108896">
+      <screen x="1920" y="0" width="1853" height="1080" />
+    </state>
+    <state x="2334" y="174" key="#com.intellij.execution.impl.EditConfigurationsDialog/1920.0.1853.1080/[email protected]" timestamp="1603867108896" />
+    <state x="706" y="294" key="FileChooserDialogImpl" timestamp="1603866995635">
+      <screen x="0" y="0" width="1853" height="1080" />
+    </state>
+    <state x="706" y="294" key="FileChooserDialogImpl/1920.0.1853.1080/[email protected]" timestamp="1603866995635" />
+  </component>
+</project>

BIN
db.sqlite3


+ 1 - 0
dist/index.html

@@ -0,0 +1 @@
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=description content=免费临时电子邮件地址><meta name=keywords content=邮件注册,邮件,mail,邮箱注册,免费,临时,临时邮箱,电子邮箱,一次性,邮箱,地址,电子邮件地址,通配符电子邮件,前缀电子邮件,电子邮箱地址,免费邮箱,临时电子邮件地址,接收邮件><meta name=baidu-site-verification content=code-BoqPhYRJpy><meta name=google-site-verification content=NPVPOWA_A66oiCkTv2JINVv_9rig9u8XZ8KMiYwtO9Q><meta charset=UTF-8><title>mfk.app</title><link rel=icon type=image/x-icon href=./static/favicon.ico><link rel="shortcut icon" type=image/x-icon href=./static/favicon.ico><script data-ad-client=ca-pub-8245321006725365 async src=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js></script><link href=/static/css/app.5c3a02a237a498bc8f92fe4fa985b501.css rel=stylesheet></head><body style="overflow: hidden;margin:0px"><div id=app></div><script type=text/javascript src=/static/js/manifest.2ae2e69a05c33dfc65f8.js></script><script type=text/javascript src=/static/js/vendor.df37f5d6f2528801125a.js></script><script type=text/javascript src=/static/js/app.144591f239aad7a24891.js></script></body></html>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/css/app.5c3a02a237a498bc8f92fe4fa985b501.css


BIN
dist/static/favicon.ico


BIN
dist/static/fonts/element-icons.535877f.woff


BIN
dist/static/fonts/element-icons.732389d.ttf


BIN
dist/static/img/notFound.afd903c.png


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
dist/static/js/app.144591f239aad7a24891.js


+ 1 - 0
dist/static/js/manifest.2ae2e69a05c33dfc65f8.js

@@ -0,0 +1 @@
+!function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a<e.length;a++)i=e[a],o[i]&&l.push(o[i][0]),o[i]=0;for(f in u)Object.prototype.hasOwnProperty.call(u,f)&&(r[f]=u[f]);for(n&&n(e,u,c);l.length;)l.shift()();if(c)for(a=0;a<c.length;a++)p=t(t.s=c[a]);return p};var e={},o={2:0};function t(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return r[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=r,t.c=e,t.d=function(r,n,e){t.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:e})},t.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return t.d(n,"a",n),n},t.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},t.p="/",t.oe=function(r){throw console.error(r),r}}([]);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
dist/static/js/vendor.df37f5d6f2528801125a.js


BIN
dist/static/notFound.png


+ 0 - 0
mail/__init__.py


BIN
mail/__pycache__/__init__.cpython-35.pyc


BIN
mail/__pycache__/apps.cpython-35.pyc


BIN
mail/__pycache__/models.cpython-35.pyc


BIN
mail/__pycache__/views.cpython-35.pyc


+ 3 - 0
mail/admin.py

@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.

+ 5 - 0
mail/apps.py

@@ -0,0 +1,5 @@
+from django.apps import AppConfig
+
+
+class MailConfig(AppConfig):
+    name = 'mail'

+ 0 - 0
mail/migrations/__init__.py


BIN
mail/migrations/__pycache__/__init__.cpython-35.pyc


+ 3 - 0
mail/models.py

@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.

+ 3 - 0
mail/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 124 - 0
mail/views.py

@@ -0,0 +1,124 @@
+from django.utils.encoding import escape_uri_path
+from imap_tools import *
+import json
+from django.shortcuts import HttpResponse
+from django.http import FileResponse
+import datetime
+from pyDes import des, CBC, PAD_PKCS5
+import binascii
+from io import BytesIO
+
+mailaccount = ''
+mailaccountPassword = ''
+mailServerIp = "127.0.0.1"
+# 秘钥,需要八位的
+KEY = ''
+
+
+def des_encrypt(s):
+    """
+    DES 加密
+    :param s: 原始字符串
+    :return: 加密后字符串,16进制
+    """
+    secret_key = KEY
+    iv = secret_key
+    k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
+    en = k.encrypt(s, padmode=PAD_PKCS5)
+    return binascii.b2a_hex(en)
+
+
+def des_descrypt(s):
+    """
+    DES 解密
+    :param s: 加密后的字符串,16进制
+    :return:  解密后的字符串
+    """
+    secret_key = KEY
+    iv = secret_key
+    k = des(secret_key, CBC, iv, pad=None, padmode=PAD_PKCS5)
+    de = k.decrypt(binascii.a2b_hex(s), padmode=PAD_PKCS5)
+    return de
+
+def getmaillist(request):
+    try:
+        address = request.GET.get('address', '')
+        mailbox = MailBoxUnencrypted(mailServerIp, port=143)
+        if not address or "@mfk.app" not in address or not address.replace("@mfk.app",""):
+            isSuccessvalue = {"isSuccess":True,"results":[],"count":0}
+        else:
+            mailbox.login(mailaccount, mailaccountPassword, initial_folder='INBOX')  # or mailbox.folder.set instead 3d arg
+            msg = [msg for msg in mailbox.fetch(A(A(all=True,date_gte=(datetime.date.today()-datetime.timedelta(days=1))),OR(to=address,bcc=address,cc=address,)))]
+            zzz = list()
+            for i in msg:
+                zzz.append({"subject":i.subject,"uid":str(des_encrypt(str(i.uid)), encoding = "utf8"),"from":i.from_,"date":(datetime.datetime.fromtimestamp((i.date).timestamp())).strftime('%Y-%m-%d %H:%M:%S'),"attachments":len(i.attachments)})
+            zzz.sort(key=lambda x: x['date'], reverse=True)
+            isSuccessvalue = {"isSuccess":True,"results":zzz,"count":len(zzz)}
+            mailbox.logout()
+        response = HttpResponse()
+        response['Content-Type'] = "text/javascript"
+        response.write(json.dumps(isSuccessvalue))
+        return response
+    except Exception as e:
+        print(e)
+        isSuccessvalue = {"isSuccess":False,"message":"系统错误"}
+        response = HttpResponse()
+        response['Content-Type'] = "text/javascript"
+        response.write(json.dumps(isSuccessvalue))
+        return response
+
+def getmailmessage(request):
+    try:
+        uid = request.GET.get('uid', '')
+        uidValue = str(des_descrypt(uid), encoding = "utf8")
+        mailbox = MailBoxUnencrypted(mailServerIp, port=143)
+        mailbox.login(mailaccount, mailaccountPassword, initial_folder='INBOX')  # or mailbox.folder.set instead 3d arg
+        msg = [msg for msg in mailbox.fetch(A(A(all=True,uid=uidValue)))]
+        returnMailMessage = list()
+        for i in msg:
+            print(i.obj)
+            if i.html:
+                bodyValue = i.html
+                for attachment in i.attachments:
+                    srcValue = r'src="cid:'+attachment.content_id+'"'
+                    srcValueOld = r'src="data:image/png;base64,'+(attachment.part).get_payload()+'"'
+                    if srcValue in bodyValue:
+                        bodyValue = bodyValue.replace(srcValue, srcValueOld,100000)
+            else:
+                bodyValue = i.text
+            returnMailMessage.append({"headers":i.headers,"subject":i.subject,"uid":uid,"from":i.from_,"body":bodyValue,"to":i.to,"attachment":[{"name":attachment.filename,"id":attachment.content_id} for attachment in i.attachments]})
+        isSuccessvalue = {"isSuccess":True,"results":returnMailMessage[0]}
+        mailbox.logout()
+        response = HttpResponse()
+        response['Content-Type'] = "text/javascript"
+        response.write(json.dumps(isSuccessvalue))
+        return response
+    except Exception as e:
+        print(e)
+        isSuccessvalue = {"isSuccess":False,"message":"系统错误","results":{}}
+        response = HttpResponse()
+        response['Content-Type'] = "text/javascript"
+        response.write(json.dumps(isSuccessvalue))
+        return response
+
+def getmailattachment(request):
+    try:
+        uid = request.GET.get('uid', '')
+        attachmentid = request.GET.get('attachmentid', '')
+        uidValue = str(des_descrypt(uid), encoding = "utf8")
+        mailbox = MailBoxUnencrypted(mailServerIp, port=143)
+        mailbox.login(mailaccount, mailaccountPassword, initial_folder='INBOX')  # or mailbox.folder.set instead 3d arg
+        msg = [msg for msg in mailbox.fetch(A(A(all=True,uid=uidValue)))]
+        for attachment in msg[0].attachments:
+            if attachment.content_id == attachmentid:
+                mailbox.logout()
+                response = FileResponse(BytesIO(attachment.payload),content_type=attachment.content_type)
+                response['Content-Disposition'] = 'attachment;filename={}'.format(escape_uri_path(attachment.filename))
+                return response
+    except Exception as e:
+        print(e)
+        isSuccessvalue = {"isSuccess":False,"message":"系统错误","results":{}}
+        response = HttpResponse()
+        response['Content-Type'] = "text/javascript"
+        response.write(json.dumps(isSuccessvalue))
+        return response

+ 0 - 0
mailList/__init__.py


BIN
mailList/__pycache__/__init__.cpython-35.pyc


BIN
mailList/__pycache__/settings.cpython-35.pyc


BIN
mailList/__pycache__/urls.cpython-35.pyc


BIN
mailList/__pycache__/wsgi.cpython-35.pyc


+ 131 - 0
mailList/settings.py

@@ -0,0 +1,131 @@
+"""
+Django settings for mailList project.
+
+Generated by 'django-admin startproject' using Django 1.10.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.10/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/1.10/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '$qtmc6@#2y&thz0-c6uwon_uckxj#)q9-^pstrlb=)a+k-9tg@'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = False
+
+ALLOWED_HOSTS = ["*"]
+CORS_ALLOW_CREDENTIALS = True
+CORS_ORIGIN_ALLOW_ALL = True
+#允许所有的请求头
+CORS_ALLOW_HEADERS = ('*')
+
+
+# Application definition
+
+INSTALLED_APPS = [
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'mail.apps.MailConfig',
+    'corsheaders',
+]
+
+MIDDLEWARE = [
+    'django.middleware.security.SecurityMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'corsheaders.middleware.CorsMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    # 'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'mailList.urls'
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': ['dist',os.path.join(BASE_DIR, 'templates')]
+        ,
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                'django.template.context_processors.debug',
+                'django.template.context_processors.request',
+                'django.contrib.auth.context_processors.auth',
+                'django.contrib.messages.context_processors.messages',
+            ],
+        },
+    },
+]
+
+WSGI_APPLICATION = 'mailList.wsgi.application'
+
+# Add for Vue.js
+STATICFILES_DIRS = [
+    os.path.join(BASE_DIR, 'dist/static'),
+]
+
+# Database
+# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.sqlite3',
+        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+    }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+    {
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+    },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/1.10/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'Asia/Shanghai'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/1.10/howto/static-files/
+
+STATIC_URL = '/static/'

+ 27 - 0
mailList/urls.py

@@ -0,0 +1,27 @@
+"""mailList URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+    https://docs.djangoproject.com/en/1.10/topics/http/urls/
+Examples:
+Function views
+    1. Add an import:  from my_app import views
+    2. Add a URL to urlpatterns:  url(r'^$', views.home, name='home')
+Class-based views
+    1. Add an import:  from other_app.views import Home
+    2. Add a URL to urlpatterns:  url(r'^$', Home.as_view(), name='home')
+Including another URLconf
+    1. Import the include() function: from django.conf.urls import url, include
+    2. Add a URL to urlpatterns:  url(r'^blog/', include('blog.urls'))
+"""
+from django.conf.urls import url
+from mail import views as mailViews
+from django.views.generic import TemplateView
+
+urlpatterns = [
+    #    url(r'^admin/', admin.site.urls),
+
+    url('^$|^index/$', TemplateView.as_view(template_name="index.html")),
+    url('getmaillist/', mailViews.getmaillist, name="getmaillist"),
+    url('getmailmessage/', mailViews.getmailmessage, name="getmailmessage"),
+    url('getmailattachment/', mailViews.getmailattachment, name="getmailattachment"),
+]

+ 16 - 0
mailList/wsgi.py

@@ -0,0 +1,16 @@
+"""
+WSGI config for mailList project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mailList.settings")
+
+application = get_wsgi_application()

+ 12 - 0
mailreload/.babelrc

@@ -0,0 +1,12 @@
+{
+  "presets": [
+    ["env", {
+      "modules": false,
+      "targets": {
+        "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
+      }
+    }],
+    "stage-2"
+  ],
+  "plugins": ["transform-vue-jsx", "transform-runtime"]
+}

+ 9 - 0
mailreload/.editorconfig

@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true

+ 14 - 0
mailreload/.gitignore

@@ -0,0 +1,14 @@
+.DS_Store
+node_modules/
+/dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln

+ 10 - 0
mailreload/.postcssrc.js

@@ -0,0 +1,10 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  "plugins": {
+    "postcss-import": {},
+    "postcss-url": {},
+    // to edit target browsers: use "browserslist" field in package.json
+    "autoprefixer": {}
+  }
+}

+ 21 - 0
mailreload/README.md

@@ -0,0 +1,21 @@
+# mailreload
+
+> A Vue.js project
+
+## Build Setup
+
+``` bash
+# install dependencies
+npm install
+
+# serve with hot reload at localhost:8080
+npm run dev
+
+# build for production with minification
+npm run build
+
+# build for production and view the bundle analyzer report
+npm run build --report
+```
+
+For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).

+ 41 - 0
mailreload/build/build.js

@@ -0,0 +1,41 @@
+'use strict'
+require('./check-versions')()
+
+process.env.NODE_ENV = 'production'
+
+const ora = require('ora')
+const rm = require('rimraf')
+const path = require('path')
+const chalk = require('chalk')
+const webpack = require('webpack')
+const config = require('../config')
+const webpackConfig = require('./webpack.prod.conf')
+
+const spinner = ora('building for production...')
+spinner.start()
+
+rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
+  if (err) throw err
+  webpack(webpackConfig, (err, stats) => {
+    spinner.stop()
+    if (err) throw err
+    process.stdout.write(stats.toString({
+      colors: true,
+      modules: false,
+      children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
+      chunks: false,
+      chunkModules: false
+    }) + '\n\n')
+
+    if (stats.hasErrors()) {
+      console.log(chalk.red('  Build failed with errors.\n'))
+      process.exit(1)
+    }
+
+    console.log(chalk.cyan('  Build complete.\n'))
+    console.log(chalk.yellow(
+      '  Tip: built files are meant to be served over an HTTP server.\n' +
+      '  Opening index.html over file:// won\'t work.\n'
+    ))
+  })
+})

+ 54 - 0
mailreload/build/check-versions.js

@@ -0,0 +1,54 @@
+'use strict'
+const chalk = require('chalk')
+const semver = require('semver')
+const packageConfig = require('../package.json')
+const shell = require('shelljs')
+
+function exec (cmd) {
+  return require('child_process').execSync(cmd).toString().trim()
+}
+
+const versionRequirements = [
+  {
+    name: 'node',
+    currentVersion: semver.clean(process.version),
+    versionRequirement: packageConfig.engines.node
+  }
+]
+
+if (shell.which('npm')) {
+  versionRequirements.push({
+    name: 'npm',
+    currentVersion: exec('npm --version'),
+    versionRequirement: packageConfig.engines.npm
+  })
+}
+
+module.exports = function () {
+  const warnings = []
+
+  for (let i = 0; i < versionRequirements.length; i++) {
+    const mod = versionRequirements[i]
+
+    if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
+      warnings.push(mod.name + ': ' +
+        chalk.red(mod.currentVersion) + ' should be ' +
+        chalk.green(mod.versionRequirement)
+      )
+    }
+  }
+
+  if (warnings.length) {
+    console.log('')
+    console.log(chalk.yellow('To use this template, you must update following to modules:'))
+    console.log()
+
+    for (let i = 0; i < warnings.length; i++) {
+      const warning = warnings[i]
+      console.log('  ' + warning)
+    }
+
+    console.log()
+    process.exit(1)
+  }
+}

BIN
mailreload/build/logo.png


+ 101 - 0
mailreload/build/utils.js

@@ -0,0 +1,101 @@
+'use strict'
+const path = require('path')
+const config = require('../config')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const packageConfig = require('../package.json')
+
+exports.assetsPath = function (_path) {
+  const assetsSubDirectory = process.env.NODE_ENV === 'production'
+    ? config.build.assetsSubDirectory
+    : config.dev.assetsSubDirectory
+
+  return path.posix.join(assetsSubDirectory, _path)
+}
+
+exports.cssLoaders = function (options) {
+  options = options || {}
+
+  const cssLoader = {
+    loader: 'css-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  const postcssLoader = {
+    loader: 'postcss-loader',
+    options: {
+      sourceMap: options.sourceMap
+    }
+  }
+
+  // generate loader string to be used with extract text plugin
+  function generateLoaders (loader, loaderOptions) {
+    const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
+
+    if (loader) {
+      loaders.push({
+        loader: loader + '-loader',
+        options: Object.assign({}, loaderOptions, {
+          sourceMap: options.sourceMap
+        })
+      })
+    }
+
+    // Extract CSS when that option is specified
+    // (which is the case during production build)
+    if (options.extract) {
+      return ExtractTextPlugin.extract({
+        use: loaders,
+        fallback: 'vue-style-loader'
+      })
+    } else {
+      return ['vue-style-loader'].concat(loaders)
+    }
+  }
+
+  // https://vue-loader.vuejs.org/en/configurations/extract-css.html
+  return {
+    css: generateLoaders(),
+    postcss: generateLoaders(),
+    less: generateLoaders('less'),
+    sass: generateLoaders('sass', { indentedSyntax: true }),
+    scss: generateLoaders('sass'),
+    stylus: generateLoaders('stylus'),
+    styl: generateLoaders('stylus')
+  }
+}
+
+// Generate loaders for standalone style files (outside of .vue)
+exports.styleLoaders = function (options) {
+  const output = []
+  const loaders = exports.cssLoaders(options)
+
+  for (const extension in loaders) {
+    const loader = loaders[extension]
+    output.push({
+      test: new RegExp('\\.' + extension + '$'),
+      use: loader
+    })
+  }
+
+  return output
+}
+
+exports.createNotifierCallback = () => {
+  const notifier = require('node-notifier')
+
+  return (severity, errors) => {
+    if (severity !== 'error') return
+
+    const error = errors[0]
+    const filename = error.file && error.file.split('!').pop()
+
+    notifier.notify({
+      title: packageConfig.name,
+      message: severity + ': ' + error.name,
+      subtitle: filename || '',
+      icon: path.join(__dirname, 'logo.png')
+    })
+  }
+}

+ 22 - 0
mailreload/build/vue-loader.conf.js

@@ -0,0 +1,22 @@
+'use strict'
+const utils = require('./utils')
+const config = require('../config')
+const isProduction = process.env.NODE_ENV === 'production'
+const sourceMapEnabled = isProduction
+  ? config.build.productionSourceMap
+  : config.dev.cssSourceMap
+
+module.exports = {
+  loaders: utils.cssLoaders({
+    sourceMap: sourceMapEnabled,
+    extract: isProduction
+  }),
+  cssSourceMap: sourceMapEnabled,
+  cacheBusting: config.dev.cacheBusting,
+  transformToRequire: {
+    video: ['src', 'poster'],
+    source: 'src',
+    img: 'src',
+    image: 'xlink:href'
+  }
+}

+ 82 - 0
mailreload/build/webpack.base.conf.js

@@ -0,0 +1,82 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const config = require('../config')
+const vueLoaderConfig = require('./vue-loader.conf')
+
+function resolve (dir) {
+  return path.join(__dirname, '..', dir)
+}
+
+
+
+module.exports = {
+  context: path.resolve(__dirname, '../'),
+  entry: {
+    app: './src/main.js'
+  },
+  output: {
+    path: config.build.assetsRoot,
+    filename: '[name].js',
+    publicPath: process.env.NODE_ENV === 'production'
+      ? config.build.assetsPublicPath
+      : config.dev.assetsPublicPath
+  },
+  resolve: {
+    extensions: ['.js', '.vue', '.json'],
+    alias: {
+      'vue$': 'vue/dist/vue.esm.js',
+      '@': resolve('src'),
+    }
+  },
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader',
+        options: vueLoaderConfig
+      },
+      {
+        test: /\.js$/,
+        loader: 'babel-loader',
+        include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
+      },
+      {
+        test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('img/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('media/[name].[hash:7].[ext]')
+        }
+      },
+      {
+        test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
+        loader: 'url-loader',
+        options: {
+          limit: 10000,
+          name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
+        }
+      }
+    ]
+  },
+  node: {
+    // prevent webpack from injecting useless setImmediate polyfill because Vue
+    // source contains it (although only uses it if it's native).
+    setImmediate: false,
+    // prevent webpack from injecting mocks to Node native modules
+    // that does not make sense for the client
+    dgram: 'empty',
+    fs: 'empty',
+    net: 'empty',
+    tls: 'empty',
+    child_process: 'empty'
+  }
+}

+ 95 - 0
mailreload/build/webpack.dev.conf.js

@@ -0,0 +1,95 @@
+'use strict'
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const path = require('path')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
+const portfinder = require('portfinder')
+
+const HOST = process.env.HOST
+const PORT = process.env.PORT && Number(process.env.PORT)
+
+const devWebpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
+  },
+  // cheap-module-eval-source-map is faster for development
+  devtool: config.dev.devtool,
+
+  // these devServer options should be customized in /config/index.js
+  devServer: {
+    clientLogLevel: 'warning',
+    historyApiFallback: {
+      rewrites: [
+        { from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
+      ],
+    },
+    hot: true,
+    contentBase: false, // since we use CopyWebpackPlugin.
+    compress: true,
+    host: HOST || config.dev.host,
+    port: PORT || config.dev.port,
+    open: config.dev.autoOpenBrowser,
+    overlay: config.dev.errorOverlay
+      ? { warnings: false, errors: true }
+      : false,
+    publicPath: config.dev.assetsPublicPath,
+    proxy: config.dev.proxyTable,
+    quiet: true, // necessary for FriendlyErrorsPlugin
+    watchOptions: {
+      poll: config.dev.poll,
+    }
+  },
+  plugins: [
+    new webpack.DefinePlugin({
+      'process.env': require('../config/dev.env')
+    }),
+    new webpack.HotModuleReplacementPlugin(),
+    new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
+    new webpack.NoEmitOnErrorsPlugin(),
+    // https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: 'index.html',
+      template: 'index.html',
+      inject: true
+    }),
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.dev.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+module.exports = new Promise((resolve, reject) => {
+  portfinder.basePort = process.env.PORT || config.dev.port
+  portfinder.getPort((err, port) => {
+    if (err) {
+      reject(err)
+    } else {
+      // publish the new Port, necessary for e2e tests
+      process.env.PORT = port
+      // add port to devServer config
+      devWebpackConfig.devServer.port = port
+
+      // Add FriendlyErrorsPlugin
+      devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
+        compilationSuccessInfo: {
+          messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
+        },
+        onErrors: config.dev.notifyOnErrors
+        ? utils.createNotifierCallback()
+        : undefined
+      }))
+
+      resolve(devWebpackConfig)
+    }
+  })
+})

+ 145 - 0
mailreload/build/webpack.prod.conf.js

@@ -0,0 +1,145 @@
+'use strict'
+const path = require('path')
+const utils = require('./utils')
+const webpack = require('webpack')
+const config = require('../config')
+const merge = require('webpack-merge')
+const baseWebpackConfig = require('./webpack.base.conf')
+const CopyWebpackPlugin = require('copy-webpack-plugin')
+const HtmlWebpackPlugin = require('html-webpack-plugin')
+const ExtractTextPlugin = require('extract-text-webpack-plugin')
+const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
+const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
+
+const env = require('../config/prod.env')
+
+const webpackConfig = merge(baseWebpackConfig, {
+  module: {
+    rules: utils.styleLoaders({
+      sourceMap: config.build.productionSourceMap,
+      extract: true,
+      usePostCSS: true
+    })
+  },
+  devtool: config.build.productionSourceMap ? config.build.devtool : false,
+  output: {
+    path: config.build.assetsRoot,
+    filename: utils.assetsPath('js/[name].[chunkhash].js'),
+    chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
+  },
+  plugins: [
+    // http://vuejs.github.io/vue-loader/en/workflow/production.html
+    new webpack.DefinePlugin({
+      'process.env': env
+    }),
+    new UglifyJsPlugin({
+      uglifyOptions: {
+        compress: {
+          warnings: false
+        }
+      },
+      sourceMap: config.build.productionSourceMap,
+      parallel: true
+    }),
+    // extract css into its own file
+    new ExtractTextPlugin({
+      filename: utils.assetsPath('css/[name].[contenthash].css'),
+      // Setting the following option to `false` will not extract CSS from codesplit chunks.
+      // Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
+      // It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`, 
+      // increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
+      allChunks: true,
+    }),
+    // Compress extracted CSS. We are using this plugin so that possible
+    // duplicated CSS from different components can be deduped.
+    new OptimizeCSSPlugin({
+      cssProcessorOptions: config.build.productionSourceMap
+        ? { safe: true, map: { inline: false } }
+        : { safe: true }
+    }),
+    // generate dist index.html with correct asset hash for caching.
+    // you can customize output by editing /index.html
+    // see https://github.com/ampedandwired/html-webpack-plugin
+    new HtmlWebpackPlugin({
+      filename: config.build.index,
+      template: 'index.html',
+      inject: true,
+      minify: {
+        removeComments: true,
+        collapseWhitespace: true,
+        removeAttributeQuotes: true
+        // more options:
+        // https://github.com/kangax/html-minifier#options-quick-reference
+      },
+      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
+      chunksSortMode: 'dependency'
+    }),
+    // keep module.id stable when vendor modules does not change
+    new webpack.HashedModuleIdsPlugin(),
+    // enable scope hoisting
+    new webpack.optimize.ModuleConcatenationPlugin(),
+    // split vendor js into its own file
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'vendor',
+      minChunks (module) {
+        // any required modules inside node_modules are extracted to vendor
+        return (
+          module.resource &&
+          /\.js$/.test(module.resource) &&
+          module.resource.indexOf(
+            path.join(__dirname, '../node_modules')
+          ) === 0
+        )
+      }
+    }),
+    // extract webpack runtime and module manifest to its own file in order to
+    // prevent vendor hash from being updated whenever app bundle is updated
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'manifest',
+      minChunks: Infinity
+    }),
+    // This instance extracts shared chunks from code splitted chunks and bundles them
+    // in a separate chunk, similar to the vendor chunk
+    // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
+    new webpack.optimize.CommonsChunkPlugin({
+      name: 'app',
+      async: 'vendor-async',
+      children: true,
+      minChunks: 3
+    }),
+
+    // copy custom static assets
+    new CopyWebpackPlugin([
+      {
+        from: path.resolve(__dirname, '../static'),
+        to: config.build.assetsSubDirectory,
+        ignore: ['.*']
+      }
+    ])
+  ]
+})
+
+if (config.build.productionGzip) {
+  const CompressionWebpackPlugin = require('compression-webpack-plugin')
+
+  webpackConfig.plugins.push(
+    new CompressionWebpackPlugin({
+      asset: '[path].gz[query]',
+      algorithm: 'gzip',
+      test: new RegExp(
+        '\\.(' +
+        config.build.productionGzipExtensions.join('|') +
+        ')$'
+      ),
+      threshold: 10240,
+      minRatio: 0.8
+    })
+  )
+}
+
+if (config.build.bundleAnalyzerReport) {
+  const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
+  webpackConfig.plugins.push(new BundleAnalyzerPlugin())
+}
+
+module.exports = webpackConfig

+ 7 - 0
mailreload/config/dev.env.js

@@ -0,0 +1,7 @@
+'use strict'
+const merge = require('webpack-merge')
+const prodEnv = require('./prod.env')
+
+module.exports = merge(prodEnv, {
+  NODE_ENV: '"development"'
+})

+ 69 - 0
mailreload/config/index.js

@@ -0,0 +1,69 @@
+'use strict'
+// Template version: 1.3.1
+// see http://vuejs-templates.github.io/webpack for documentation.
+
+const path = require('path')
+
+module.exports = {
+  dev: {
+
+    // Paths
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+    proxyTable: {},
+
+    // Various Dev Server settings
+    host: '10.181.34.24', // can be overwritten by process.env.HOST
+    port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
+    autoOpenBrowser: false,
+    errorOverlay: true,
+    notifyOnErrors: true,
+    poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
+
+    
+    /**
+     * Source Maps
+     */
+
+    // https://webpack.js.org/configuration/devtool/#development
+    devtool: 'cheap-module-eval-source-map',
+
+    // If you have problems debugging vue-files in devtools,
+    // set this to false - it *may* help
+    // https://vue-loader.vuejs.org/en/options.html#cachebusting
+    cacheBusting: true,
+
+    cssSourceMap: false
+  },
+
+  build: {
+    // Template for index.html
+    index: path.resolve(__dirname, '../dist/index.html'),
+
+    // Paths
+    assetsRoot: path.resolve(__dirname, '../dist'),
+    assetsSubDirectory: 'static',
+    assetsPublicPath: '/',
+
+    /**
+     * Source Maps
+     */
+
+    productionSourceMap: false,
+    // https://webpack.js.org/configuration/devtool/#production
+    devtool: '#source-map',
+
+    // Gzip off by default as many popular static hosts such as
+    // Surge or Netlify already gzip all static assets for you.
+    // Before setting to `true`, make sure to:
+    // npm install --save-dev compression-webpack-plugin
+    productionGzip: false,
+    productionGzipExtensions: ['js', 'css'],
+
+    // Run the build command with an extra argument to
+    // View the bundle analyzer report after build finishes:
+    // `npm run build --report`
+    // Set to `true` or `false` to always turn it on or off
+    bundleAnalyzerReport: process.env.npm_config_report
+  }
+}

+ 4 - 0
mailreload/config/prod.env.js

@@ -0,0 +1,4 @@
+'use strict'
+module.exports = {
+  NODE_ENV: '"production"'
+}

+ 1 - 0
mailreload/dist/index.html

@@ -0,0 +1 @@
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=description content=免费临时电子邮件地址><meta name=keywords content=邮件注册,邮件,mail,邮箱注册,免费,临时,临时邮箱,电子邮箱,一次性,邮箱,地址,电子邮件地址,通配符电子邮件,前缀电子邮件,电子邮箱地址,免费邮箱,临时电子邮件地址,接收邮件><meta name=baidu-site-verification content=code-BoqPhYRJpy><meta name=google-site-verification content=NPVPOWA_A66oiCkTv2JINVv_9rig9u8XZ8KMiYwtO9Q><meta charset=UTF-8><title>mfk.app</title><link rel=icon type=image/x-icon href=./static/favicon.ico><link rel="shortcut icon" type=image/x-icon href=./static/favicon.ico><script data-ad-client=ca-pub-8245321006725365 async src=https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js></script><link href=/static/css/app.5c3a02a237a498bc8f92fe4fa985b501.css rel=stylesheet></head><body style="overflow: hidden;margin:0px"><div id=app></div><script type=text/javascript src=/static/js/manifest.2ae2e69a05c33dfc65f8.js></script><script type=text/javascript src=/static/js/vendor.df37f5d6f2528801125a.js></script><script type=text/javascript src=/static/js/app.144591f239aad7a24891.js></script></body></html>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
mailreload/dist/static/css/app.5c3a02a237a498bc8f92fe4fa985b501.css


BIN
mailreload/dist/static/favicon.ico


BIN
mailreload/dist/static/fonts/element-icons.535877f.woff


BIN
mailreload/dist/static/fonts/element-icons.732389d.ttf


BIN
mailreload/dist/static/img/notFound.afd903c.png


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
mailreload/dist/static/js/app.144591f239aad7a24891.js


+ 1 - 0
mailreload/dist/static/js/manifest.2ae2e69a05c33dfc65f8.js

@@ -0,0 +1 @@
+!function(r){var n=window.webpackJsonp;window.webpackJsonp=function(e,u,c){for(var f,i,p,a=0,l=[];a<e.length;a++)i=e[a],o[i]&&l.push(o[i][0]),o[i]=0;for(f in u)Object.prototype.hasOwnProperty.call(u,f)&&(r[f]=u[f]);for(n&&n(e,u,c);l.length;)l.shift()();if(c)for(a=0;a<c.length;a++)p=t(t.s=c[a]);return p};var e={},o={2:0};function t(n){if(e[n])return e[n].exports;var o=e[n]={i:n,l:!1,exports:{}};return r[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=r,t.c=e,t.d=function(r,n,e){t.o(r,n)||Object.defineProperty(r,n,{configurable:!1,enumerable:!0,get:e})},t.n=function(r){var n=r&&r.__esModule?function(){return r.default}:function(){return r};return t.d(n,"a",n),n},t.o=function(r,n){return Object.prototype.hasOwnProperty.call(r,n)},t.p="/",t.oe=function(r){throw console.error(r),r}}([]);

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6 - 0
mailreload/dist/static/js/vendor.df37f5d6f2528801125a.js


BIN
mailreload/dist/static/notFound.png


+ 19 - 0
mailreload/index.html

@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
+    <meta name="description" content="免费临时电子邮件地址">
+    <meta name="keywords" content="邮件注册,邮件,mail,邮箱注册,免费,临时,临时邮箱,电子邮箱,一次性,邮箱,地址,电子邮件地址,通配符电子邮件,前缀电子邮件,电子邮箱地址,免费邮箱,临时电子邮件地址,接收邮件">
+    <meta name="baidu-site-verification" content="code-BoqPhYRJpy" />
+    <meta name="google-site-verification" content="NPVPOWA_A66oiCkTv2JINVv_9rig9u8XZ8KMiYwtO9Q" />
+    <meta charset="UTF-8">
+    <title>mfk.app</title>
+    <link rel="icon" type="image/x-icon" href="./static/favicon.ico">
+    <link rel="shortcut icon" type="image/x-icon" href="./static/favicon.ico">
+    <script data-ad-client="ca-pub-8245321006725365" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>  </head>
+  <body style="overflow: hidden;margin:0px">
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 68 - 0
mailreload/package.json

@@ -0,0 +1,68 @@
+{
+  "name": "mailreload",
+  "version": "1.0.0",
+  "description": "A Vue.js project",
+  "author": "sh12640 <[email protected]>",
+  "private": true,
+  "scripts": {
+    "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
+    "start": "npm run dev",
+    "build": "node build/build.js"
+  },
+  "dependencies": {
+    "axios": "^0.20.0",
+    "element-ui": "^2.13.2",
+    "vue": "^2.5.2",
+    "vue-clipboard2": "^0.3.1",
+    "vue-dompurify-html": "^2.3.0",
+    "vue-google-adsense": "^1.9.0",
+    "vue-router": "^3.0.1",
+    "vue-script2": "^2.1.0"
+  },
+  "devDependencies": {
+    "autoprefixer": "^7.1.2",
+    "babel-core": "^6.22.1",
+    "babel-helper-vue-jsx-merge-props": "^2.0.3",
+    "babel-loader": "^7.1.1",
+    "babel-plugin-syntax-jsx": "^6.18.0",
+    "babel-plugin-transform-runtime": "^6.22.0",
+    "babel-plugin-transform-vue-jsx": "^3.5.0",
+    "babel-preset-env": "^1.3.2",
+    "babel-preset-stage-2": "^6.22.0",
+    "chalk": "^2.0.1",
+    "copy-webpack-plugin": "^4.0.1",
+    "css-loader": "^0.28.0",
+    "extract-text-webpack-plugin": "^3.0.0",
+    "file-loader": "^1.1.4",
+    "friendly-errors-webpack-plugin": "^1.6.1",
+    "html-webpack-plugin": "^2.30.1",
+    "node-notifier": "^5.1.2",
+    "optimize-css-assets-webpack-plugin": "^3.2.0",
+    "ora": "^1.2.0",
+    "portfinder": "^1.0.13",
+    "postcss-import": "^11.0.0",
+    "postcss-loader": "^2.0.8",
+    "postcss-url": "^7.2.1",
+    "rimraf": "^2.6.0",
+    "semver": "^5.3.0",
+    "shelljs": "^0.7.6",
+    "uglifyjs-webpack-plugin": "^1.1.1",
+    "url-loader": "^0.5.8",
+    "vue-loader": "^13.3.0",
+    "vue-style-loader": "^3.0.1",
+    "vue-template-compiler": "^2.5.2",
+    "webpack": "^3.6.0",
+    "webpack-bundle-analyzer": "^2.9.0",
+    "webpack-dev-server": "^2.9.1",
+    "webpack-merge": "^4.1.0"
+  },
+  "engines": {
+    "node": ">= 6.0.0",
+    "npm": ">= 3.0.0"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 8"
+  ]
+}

+ 12 - 0
mailreload/src/App.vue

@@ -0,0 +1,12 @@
+<template>
+  <div id="app">
+    <router-view/>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'App'
+}
+</script>
+

BIN
mailreload/src/assets/logo.png


+ 79 - 0
mailreload/src/components/addEmailBox.vue

@@ -0,0 +1,79 @@
+<template>
+  <div>
+    <el-container>
+        <el-header class="downLoadLine" style="padding:0px 0px 0px 0px">
+        </el-header>
+        <el-main style="padding:0px;overflow:auto !important;height:calc(100Vh - 48px);" class="classFontFamily">
+            <el-row style="margin:0px 0px 5px 30px;padding:10px 0px 0px 0px;">
+              <el-col :span="3">
+                 <div>&nbsp;</div>
+              </el-col>
+              <el-col :span="21" style="margin-top:30px;font-size:18px">
+                <div class="grid-content bg-purple-dark" style="margin-top:10px">
+                  添加邮箱
+                </div>
+                <div class="grid-content bg-purple-dark" style="margin-top:20px">
+                  <el-input placeholder="请输入内容" v-model="input2" class="inpurWidth" autofocus size="small">
+                    <template slot="append">@mfk.app</template>
+                  </el-input>
+                </div>
+                <div class="grid-content bg-purple-dark" style="margin-top:20px">
+                  <el-button type="primary" class="btnprimary" size="small" @click="addmailaddress">添加</el-button>
+                </div>
+              </el-col>
+            </el-row>
+        </el-main>
+    </el-container>
+  </div>
+</template>
+
+<style>
+.inpurWidth{
+  width: 350px !important;
+}
+  .classFontFamily{
+    font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",SimSun,sans-serif !important;
+  }
+  .btnprimary {
+    color: #fff !important;
+    background-color: #7c6c5c !important;
+    border-color: #7c6c5c !important;
+}
+  .btnprimary:hover {
+    background-color: #615344 !important;
+}
+</style>
+
+<script>
+
+import axios from 'axios'
+axios.defaults.withCredentials = true
+import {generateMixed,addEmailsStorage} from '@/js/readMailList'
+export default {
+  data () {
+    return {
+      input2:"",
+    }
+  },
+  created(){
+    this.creatMailAddress()
+  },
+  methods:{
+    async creatMailAddress(){
+      this.input2 =  generateMixed(5)
+    },
+    async addmailaddress(){
+      addEmailsStorage(this.input2)
+      this.$message({
+        message: '添加成功',
+        type: 'success',
+        duration:'600'
+      });
+      this.$router.push({path:'/emailList/'+this.input2+"@mfk.app"})
+    },
+  },
+}
+</script>
+
+<style scoped>
+</style>

+ 196 - 0
mailreload/src/components/email.vue

@@ -0,0 +1,196 @@
+<template>
+  <div>
+    <el-container>
+        <el-header class="downLoadLine" style="padding:0px 0px 0px 0px">
+          <el-row style="height:48px;white-space: nowrap;">
+              <div @click="goBack()" style="display:inline-block;padding:13px 5px 13px 5px" class="blackColor classSpancursorpointer">
+                <i class="el-icon-back" style="color: #7c6c5c;margin-left:5px;"></i>
+                <span style="font-size:14px;color:#777">返回</span>
+              </div>
+          </el-row>
+        </el-header>
+        <el-main style="padding:0px;overflow:auto !important;height:calc(100Vh - 48px);">
+          <el-row style="height:40px;white-space: nowrap;">
+              <div @click="mailHeadersShow = !mailHeadersShow" style="display:inline-block;padding:10px 5px 9px 5px" class="blackColor classSpancursorpointer">
+                <i class="el-icon-tickets" style="font-size:115%;color: #7c6c5c;margin-left:5px;"></i>
+                <span style="font-size:14px;">邮件头</span>
+              </div>
+              <!-- <div style="display:inline-block;padding:10px 5px 9px 5px" class="blackColor classSpancursorpointer">
+                <i class="el-icon-delete" style="font-size:115%;color: #0078d4;margin-left:5px;"></i>
+                <span style="font-size:14px;">删除</span>
+              </div> -->
+          </el-row>
+          <el-row style="margin:0px 30px 5px 30px;padding:10px 0px 10px 0px;" class="mailRowClass" v-show="mailHeadersShow">
+            <el-col :span="24" style="padding:10px 0px 0px 0px;">
+                <el-table :data="mailMessage.headers" style="width: 100%" size="mini">
+                    <el-table-column prop="name" label="key" width="180"></el-table-column>
+                    <el-table-column prop="value" label="value"></el-table-column>
+                </el-table>
+            </el-col>
+          </el-row>
+          <el-row style="margin:0px 30px 5px 30px;padding:10px 0px 10px 0px;" class="mailRowClass">
+            <el-col :span="4" style="width:70px;padding:10px 0px 0px 0px;">
+              <span>主题</span>
+            </el-col>
+            <el-col :span="20" style="padding:10px 0px 0px 0px;">
+              <span>{{mailMessage.subject}}</span>
+            </el-col>
+          </el-row>
+          <el-row style="margin:0px 30px 5px 30px;padding:10px 0px 10px 0px;" class="mailRowClass">
+            <el-col :span="4" style="width:70px;padding:10px 0px 0px 0px;">
+              <span>发件人</span>
+            </el-col>
+            <el-col :span="20" style="padding:10px 0px 0px 0px;">
+              <span>{{mailMessage.from}}</span>
+            </el-col>
+          </el-row>
+          <el-row v-show="mailMessage.attachments.length !==0 " style="margin:0px 30px 5px 30px;padding:10px 0px 10px 0px;" class="mailRowClass">
+            <el-col :span="4" style="width:70px;padding:10px 0px 0px 0px;">
+              <span>附件</span>
+            </el-col>
+            <el-col :span="20">
+              <el-button @click="jumpattachment(item.id)" type="text" v-for="item in mailMessage.attachments" :key="item.id">{{item.name}}</el-button>
+            </el-col>
+          </el-row>
+          <el-row style="margin:0px 30px 5px 30px;padding:10px 0px 0px 0px;">
+            <el-col :span="24">
+              <div class="grid-content bg-purple-dark" v-dompurify-html="mailMessage.body">
+              </div>
+            </el-col>
+          </el-row>
+        </el-main>
+    </el-container>
+  </div>
+</template>
+<style>
+  .borderBottom {
+    border-bottom: 1px solid #dcdcdc;
+    line-height:1;
+    font-size:14px
+  }
+  .classSpancursorpointer{
+    cursor: pointer;
+  }
+  .classFontFamily{
+    font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",SimSun,sans-serif;
+  }
+.borderBottom:hover {
+      background-color: #d5ecfe !important;
+    }
+  .mailRowClass {
+    border-bottom: 1px solid #dcdcdc;
+    font-size:14px
+  }
+</style>
+
+<script>
+
+import axios from 'axios'
+import {getEmailsStorage,removeEmailsStorage,removeAllEmailsStorage} from '@/js/readMailList'
+axios.defaults.withCredentials = true
+export default {
+  data () {
+    return {
+      uid:'',
+      tableData:[],
+      mailHeadersShow:false,
+      mailMessage:{
+        body:"",
+        attachments:[],
+        from:"",
+        subject:"",
+        headers:[],
+      },
+    }
+  },
+  async created(){
+    await this.createdmethods()
+  },
+  watch:{
+    async $route(){
+      await this.createdmethods()
+      await this.getMail()
+    }
+  },
+  methods:{
+    jumpattachment(attachmentid){
+      window.open(this.serviceurl()+"/getmailattachment?uid="+this.uid+"&attachmentid="+attachmentid);
+    },
+    async createdmethods(){
+      if (this.$route.params.num){
+        this.uid = this.$route.params.num
+        this.getMail()
+      }
+    },
+    async getMail(){
+      let that = this
+      let loadingInstance = that.$loading();
+      await axios
+        .get(this.serviceurl() + '/getmailmessage/?uid=' + this.uid)
+        .then(response => {
+          that.mailMessage.body = response.data.results.body
+          that.mailMessage.attachments = response.data.results.attachment
+          that.mailMessage.subject = response.data.results.subject
+          that.mailMessage.from = response.data.results.from
+          that.mailMessage.headers = []
+          Object.keys(response.data.results.headers).forEach(key => {
+            that.mailMessage.headers.push({"name":key,"value":response.data.results.headers[key]})
+          })
+          loadingInstance.close();
+        })
+    },
+    async handleEdit(index, row){
+      let that = this
+      await axios
+        .get(this.serviceurl() + '/getmailmessage/?uid=' + row.uid)
+        .then(response => {
+          that.dialogFormVisible = true
+          that.mailValue = response.data.results
+        })
+    },
+    async goBack(){
+      this.$router.go(-1);
+    },
+    async removeEmails(){
+      let loadingInstance = this.$loading();
+      await removeEmailsStorage(this.uid)
+      loadingInstance.close();
+      this.$message({
+        message: '删除成功',
+        type: 'success',
+        duration:'600'
+      });
+      this.$router.push({path:'/emailList/all'})
+    },
+    async removeAllEmails(){
+      let loadingInstance = this.$loading();
+      (this.tableData).splice(0,this.tableData.length)
+      await removeAllEmailsStorage()
+      await this.$emit('removeMailListMessage')
+      loadingInstance.close();
+      this.$message({
+        message: '全部删除成功',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    onCopy(e){
+      this.$message({
+        message: '复制成功,可以直接粘贴',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    onError(){
+      this.$message({
+        message: '复制失败,请手动复制',
+        type: 'error',
+        duration:'600'
+      });
+    },
+  },
+}
+</script>
+
+<style scoped>
+</style>

+ 236 - 0
mailreload/src/components/emailList.vue

@@ -0,0 +1,236 @@
+<template>
+  <div>
+    <el-container>
+        <el-header class="downLoadLine" style="padding:0px 0px 0px 0px">
+          <el-row style="height:48px;white-space: nowrap;">
+              <div style="display:inline-block;padding:14px 5px 14px 5px;" class="blackColor classSpancursorpointer" v-if="mailaddress !== 'all'" v-clipboard:copy="mailaddress" v-clipboard:success="onCopy" v-clipboard:error="onError">
+                <i class="el-icon-document-copy" style="margin-left:5px;;color:#777"></i>
+                <span style="color: #7c6c5c;font-size:14px">{{mailaddress}}</span>
+                <span style="font-size:14px;color:#777">复制</span>
+              </div>
+              <div @click="refulsh()" style="display:inline-block;padding:14px 5px 14px 5px" class="blackColor classSpancursorpointer">
+                <i class="el-icon-refresh" style="color: #7c6c5c;margin-left:5px;"></i>
+                <span style="font-size:14px;color:#777">刷新</span>
+              </div>
+              <div @click="removeEmails()" style="display:inline-block;padding:14px 5px 14px 5px" class="blackColor classSpancursorpointer" v-if="mailaddress !== 'all'">
+                <i class="el-icon-delete" style="color: #7c6c5c;margin-left:5px;"></i>
+                <span style="font-size:14px;color:#777">删除邮箱</span>
+              </div>
+              <div @click="removeAllEmails()" style="display:inline-block;padding:14px 5px 14px 5px" class="blackColor classSpancursorpointer" v-else>
+                <i class="el-icon-delete" style="color: #7c6c5c;margin-left:5px;"></i>
+                <span style="font-size:14px;color:#777">删除全部邮箱</span>
+              </div>
+          </el-row>
+        </el-header>
+        <el-main v-if="tableData.length !== 0" style="padding:0px;overflow:auto !important;height:calc(100Vh - 48px);">
+          <div @click="jumpMessage(item.uid)" v-for="item in tableData" :key="item.uid" class="borderBottom classSpancursorpointer classFontFamily aa">
+              <el-row style="margin:0px 0px 5px 30px;padding:10px 0px 0px 0px;">
+                <el-col :span="24"><div class="grid-content bg-purple-dark">{{item.subject}}
+                  <i class="el-icon-paperclip" style="color: #7c6c5c;margin-left:5px;font-size:14px" v-if="item.attachments !== 0"></i></div></el-col>
+              </el-row>
+              <el-row style="margin:0px 0px 10px 30px;">
+                <el-col :span="8"><div class="grid-content bg-purple-dark">{{item.from}}</div></el-col>
+                <el-col :span="16"><div class="grid-content bg-purple-dark">{{item.date}}</div></el-col>
+              </el-row>
+          </div>
+          <footer class="ui-link">
+            <a href="https://beian.miit.gov.cn/">苏 ICP 备 14002037号-3</a>
+          </footer>
+        </el-main>
+        <el-main v-else style="padding:0px;overflow:auto !important;height:calc(100Vh - 48px);">
+          <div >
+              <el-row style="margin:0px 0px 5px 30px;padding:10px 0px 0px 0px;">
+                <el-col :span="24"><div class="grid-content bg-purple-dark">
+                  <img src="..\..\static\notFound.png" class="no-emails-found">
+                </div>
+                </el-col>
+              </el-row>
+              <el-row style="margin:0px 0px 10px 30px;">
+                <el-col :span="24">
+                  <div style="text-align: center;display: grid;margin-top: 15px">
+                    <div style="margin: auto;max-width: 381px; padding: 0 20px">
+                      <span class="ng-binding">还没有邮件哦。<br><br></span>
+                      <span class="ng-binding" v-if="mailaddress == 'all'">不想暴露私人邮箱地址,你可以用这些去注册网站,保护你的真实邮箱。<br><br></span>
+                      <span class="ng-binding" v-else>不想暴露私人邮箱地址,你可以用 <b class="ng-binding classSpancursorpointer" style="color: #0078d4;" v-clipboard:copy="mailaddress" v-clipboard:success="onCopy" v-clipboard:error="onError">{{mailaddress}}</b> 去注册网站,保护你的真实邮箱。<br><br></span>
+                    </div>
+                  </div>
+                </el-col>
+              </el-row>
+          </div>
+          <!-- https://blog.csdn.net/cuk5239/article/details/107699169 -->
+          <InArticleAdsense
+              data-ad-client="ca-pub-8245321006725365"
+              data-ad-slot="1234567890">
+          </InArticleAdsense>
+          <footer class="ui-link">
+            <a href="https://beian.miit.gov.cn/">苏 ICP 备 14002037号-3</a>
+          </footer>
+        </el-main>
+    </el-container>
+  </div>
+</template>
+<style>
+.ui-link{
+  font-size: 13px;
+  bottom:0;
+  position:absolute;
+}
+.no-emails-found {
+    width: 45%;
+    margin-left: 27%;
+    margin-top: 15%;
+}
+  .borderBottom {
+    border-bottom: 1px solid #dcdcdc;
+    line-height:1;
+    font-size:14px
+  }
+  .classSpancursorpointer{
+    cursor: pointer;
+  }
+  .classFontFamily{
+    font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",SimSun,sans-serif;
+  }
+.borderBottom:hover {
+      background-color: #DCDCDC !important;
+    }
+</style>
+
+<script>
+
+import axios from 'axios'
+import {getEmailsStorage,removeEmailsStorage,removeAllEmailsStorage} from '@/js/readMailList'
+axios.defaults.withCredentials = true
+export default {
+  data () {
+    return {
+      mailaddress:'',
+      tableData:[],
+    }
+  },
+  async created(){
+    if (this.$route.params.num){
+      this.mailaddress = this.$route.params.num
+    } else {
+      this.mailaddress = "all"
+    }
+    this.getMailList()
+  },
+  watch:{
+    async $route(){
+      await this.createdmethods()
+      await this.getMailList()
+    }
+  },
+  mounted(){
+    if (this.timer){
+      clearInterval(this.timer)
+    } else {
+      this.timer = setInterval(async () => {
+        let that = this
+        await axios
+          .get(this.serviceurl() + '/getmaillist/?address=' + this.mailaddress)
+          .then(response => {
+            if ((this.tableData).length < (response.data.results).length){
+              this.tableData = response.data.results
+              this.$message({
+                message: '有新邮件请查收',
+                type: 'success',
+                duration:'800'
+              });
+            }
+        })
+      },11000)
+    }
+  },
+  destroyed(){
+    clearInterval(this.timer)
+  },
+  methods:{
+    jumpMessage(uid){
+      this.$router.push({path:'/email/'+uid})
+    },
+    async createdmethods(){
+      await this.getMailListMessage()
+      if (this.$route.params.num){
+        this.mailaddress = this.$route.params.num
+      } else {
+        this.mailaddress = "all"
+      }
+    },
+    async getMailListMessage(){
+      let ccc = getEmailsStorage()
+    },
+    async getMailList(){
+      let that = this
+      that.tableData = []
+      let loadingInstance = that.$loading();
+      await axios
+        .get(this.serviceurl() + '/getmaillist/?address=' + this.mailaddress)
+        .then(response => {
+          this.tableData = response.data.results
+          loadingInstance.close();
+        })
+    },
+    async handleEdit(index, row){
+      let that = this
+      await axios
+        .get(this.serviceurl() + '/getmailmessage/?uid=' + row.uid)
+        .then(response => {
+          that.dialogFormVisible = true
+          that.mailValue = response.data.results
+        })
+    },
+    async refulsh(){
+      let loadingInstance = this.$loading();
+      await this.getMailList()
+      loadingInstance.close();
+      this.$message({
+        message: '刷新成功',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    async removeEmails(){
+      let loadingInstance = this.$loading();
+      await removeEmailsStorage(this.mailaddress)
+      loadingInstance.close();
+      this.$message({
+        message: '删除成功',
+        type: 'success',
+        duration:'600'
+      });
+      this.$router.push({path:'/emailList/all'})
+    },
+    async removeAllEmails(){
+      let loadingInstance = this.$loading();
+      (this.tableData).splice(0,this.tableData.length)
+      await removeAllEmailsStorage()
+      await this.$emit('removeMailListMessage')
+      loadingInstance.close();
+      this.$message({
+        message: '全部删除成功',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    onCopy(e){
+      this.$message({
+        message: '复制成功,可以直接粘贴',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    onError(){
+      this.$message({
+        message: '复制失败,请手动复制',
+        type: 'error',
+        duration:'600'
+      });
+    },
+  },
+}
+</script>
+
+<style scoped>
+</style>

+ 164 - 0
mailreload/src/components/home.vue

@@ -0,0 +1,164 @@
+<template>
+    <el-row>
+        <el-col style="width:300px" :span="12">
+            <el-container>
+                <el-header class="downLoadLine">
+                    <div class="sidebar-header">
+                        <div class="brand-container">
+                            <a href="/" class="brand">
+                                <i class="el-icon-connection"></i>
+                                mfk.app
+                            </a>
+                        </div>
+                    </div>
+                </el-header>
+                <el-main class="mainleft" style="background-color:#fafafa;padding: 0 0 0 0;">
+                    <el-menu :default-active="activeIndex" router background-color="#fafafa" active-text-color="black" style="width:calc(100Vw-48px)">
+                        <el-menu-item index="/addEmailBox" class="downLoadLine">
+                            <i class="el-icon-plus" style="color:#7c6c5c;"></i>
+                            <span slot="title">添加邮箱</span>
+                        </el-menu-item>
+                        <el-menu-item index="/emailList/all">
+                            <i class="el-icon-s-home" style="color:#7c6c5c;"></i>
+                            <span slot="title">全部邮箱</span>
+                        </el-menu-item>
+                        <el-menu-item :index="menuItemIndex + i" v-for="i in mailaddressList" :key="i">
+                            <span slot="title" style="margin-left:23px;">{{i}}</span>
+                        </el-menu-item>
+                    </el-menu>
+                </el-main>
+            </el-container>
+        </el-col>
+        <el-col style="width:calc(100Vw - 300px);" :span="12">
+            <router-view @removeMailListMessage='removeMailListMessage'></router-view>
+        </el-col>
+    </el-row>
+</template>
+<style>
+  .el-header {
+    height: 48px !important;
+  }
+  .downLoadLine {
+    border-bottom: 1px solid #dcdcdc;
+    background-color: #fff;
+  }
+  .mainleft {
+    height: calc(100vh - 48px) !important;
+    border-right: 1px solid #dcdcdc;
+  }
+  .brand {
+    font-size: 20px;
+    color: #7c6c5c;
+    text-decoration: none;
+  }
+  .brand-container {
+    padding: 10px 0 10px 14px;
+}
+.el-menu-item{
+    padding: .7em 1em !important;
+    line-height: 20px !important;
+    height: 40px !important;
+}
+.el-menu-item.is-active {
+      background-color: #DCDCDC !important;
+    }
+.el-menu-item:hover{
+  background: #DCDCDC !important;
+}
+.blackColor:hover{
+  background: #f0f0f0 !important;
+}
+.classSpancursorpointer{
+  cursor: pointer;
+}
+</style>
+<script>
+
+import axios from 'axios'
+axios.defaults.withCredentials = true
+import {getEmailsStorage,removeEmailsStorage} from '@/js/readMailList'
+export default {
+  data () {
+    return {
+      mailaddressList:[],
+      menuItemIndex:"/emailList/",
+      mailaddress:"",
+      activeIndex:"",
+    }
+  },
+  created(){
+    this.getMailListMessage()
+  },
+  watch:{
+    async $route(){
+      await this.getMailListMessage()
+    }
+  },
+  methods:{
+    async getMailListMessage(){
+      let getEmailsStorageValue = getEmailsStorage()
+      this.mailaddressList = getEmailsStorageValue.mailList
+      this.activeIndex = this.$route.path
+    },
+    async removeMailListMessage(){
+      this.mailaddressList = []
+    },
+    async getMailList(){
+      let that = this
+      that.tableData = []
+      await axios
+        .get(this.serviceurl() + '/getmaillist/?address=' + that.mailaddress)
+        .then(response => {
+          that.tableData = response.data.results
+        })
+    },
+    async handleEdit(index, row){
+      let that = this
+      await axios
+        .get(this.serviceurl() + '/getmailmessage/?uid=' + row.uid)
+        .then(response => {
+          that.dialogFormVisible = true
+          that.mailValue = response.data.results
+        })
+    },
+    async refulsh(){
+      let loadingInstance = this.$loading();
+      await this.getMailList()
+      loadingInstance.close();
+      this.$message({
+        message: '刷新成功',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    async removeEmails(){
+      let loadingInstance = this.$loading();
+      await removeEmailsStorage(this.mailaddress)
+      loadingInstance.close();
+      this.$message({
+        message: '删除成功',
+        type: 'success',
+        duration:'600'
+      });
+      this.$router.push({path:'/emailList/all'})
+    },
+    onCopy(e){
+      this.$message({
+        message: '复制成功,可以直接粘贴',
+        type: 'success',
+        duration:'600'
+      });
+    },
+    onError(){
+      this.$message({
+        message: '复制失败,请手动复制',
+        type: 'error',
+        duration:'600'
+      });
+    },
+  },
+}
+</script>
+
+<style scoped>
+</style>

+ 4 - 0
mailreload/src/config/serverurlvalue.js

@@ -0,0 +1,4 @@
+module.exports = {
+  'serverurl': '' // 正式环境url换空
+  // 'serverurl': 'http://10.181.34.24:8000/' // 本地环境,写死url
+}

+ 71 - 0
mailreload/src/js/readMailList.js

@@ -0,0 +1,71 @@
+// 获取邮箱列表
+export function getEmailsStorage() {
+    let infoValue = JSON.parse(localStorage.getItem('emails'));
+    if (infoValue){
+        if (infoValue['mailList'].length !== 0){
+            return infoValue
+        }
+    }
+    const info = {"mailList":[generateMixed(5)+"@mfk.app"]}
+    setEmailsStorage('emails',info)
+    return info
+}
+
+export function setEmailsStorage(name,info) {
+    localStorage.setItem(name, JSON.stringify(info));
+    return true
+}
+
+
+export function addEmailsStorage(mailAddress) {
+    const mailAddressValue = mailAddress.toLowerCase()
+    let infoValue = JSON.parse(localStorage.getItem('emails'));
+    if (infoValue){
+        if (infoValue['mailList'].length !== 0){
+            if((infoValue['mailList']).indexOf(mailAddressValue+"@mfk.app")==-1){ //等于-1表示这个字符串中没有o这个字符
+                infoValue['mailList'].push(mailAddressValue+"@mfk.app")
+                setEmailsStorage('emails',infoValue)
+            }else{
+                setEmailsStorage('emails',infoValue)
+            }
+            return true
+        } else {
+            infoValue['mailList'].push(mailAddressValue+"@mfk.app")
+            setEmailsStorage('emails',infoValue)
+        }
+        return true
+    }
+    const info = {"mailList":[mailAddressValue+"@mfk.app"]}
+    setEmailsStorage('emails',info)
+    return true
+}
+
+export function removeEmailsStorage(name) {
+    let infoValue = JSON.parse(localStorage.getItem('emails'));
+    if (infoValue){
+        if (infoValue['mailList']){
+            let index = (infoValue['mailList']).indexOf(name);
+            if (index > -1) {
+                (infoValue['mailList']).splice(index, 1);
+            }
+            setEmailsStorage('emails',infoValue)
+            return true
+        }
+    }
+    return true
+}
+export function removeAllEmailsStorage() {
+    const info = {"mailList":[]}
+    setEmailsStorage('emails',info)
+    return true
+}
+
+export function generateMixed(n) {
+    const chars = ['a','b','c','d','e','f','g','h','i','j','k','m','n','p','q','r','t','u','v','w','x','y'];
+    let res = "";
+    for(let i = 0; i < n ; i ++) {
+        let id = Math.ceil(Math.random()*21);
+        res += chars[id];
+    }
+    return res;
+}

+ 50 - 0
mailreload/src/main.js

@@ -0,0 +1,50 @@
+// The Vue build version to load with the `import` command
+// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
+import Vue from 'vue'
+import App from './App'
+import router from './router'
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+Vue.use(ElementUI);
+
+Vue.config.productionTip = false
+import serverurlvaluefromjs from '@/config/serverurlvalue'
+import VueClipboard from 'vue-clipboard2'
+Vue.use(VueClipboard)
+
+import VueDOMPurifyHTML from 'vue-dompurify-html'
+Vue.use(VueDOMPurifyHTML)
+
+import Ads from 'vue-google-adsense'
+ 
+Vue.use(require('vue-script2'))
+ 
+Vue.use(Ads.Adsense)
+Vue.use(Ads.InArticleAdsense)
+Vue.use(Ads.InFeedAdsense)
+
+// 本地服务器地址
+Vue.prototype.serviceurl = function () {
+  // 正式环境value值取空
+  // let serviceurlvalue = ''
+  let serviceurlvalue = serverurlvaluefromjs.serverurl
+  return serviceurlvalue
+}
+
+var _hmt = _hmt || [];
+window._hmt = _hmt; // 修改为window 全局变量
+ (function () {
+       var hm = document.createElement("script");
+       hm.src = "https://hm.baidu.com/hm.js?f17073ce3910dee882c81b53f3128a8f";
+      //  hm.src = "https://hm.baidu.com/hm.js?6547945c1c0cdcbb1814a71a7ccbee38";
+       var s = document.getElementsByTagName("script")[0];
+       s.parentNode.insertBefore(hm, s);
+  })();
+
+/* eslint-disable no-new */
+new Vue({
+  el: '#app',
+  router,
+  components: { App },
+  template: '<App/>'
+})

+ 52 - 0
mailreload/src/router/index.js

@@ -0,0 +1,52 @@
+import Vue from 'vue'
+import Router from 'vue-router'
+import home from '@/components/home'
+import emailList from '@/components/emailList'
+import addEmailBox from '@/components/addEmailBox'
+import email from '@/components/email'
+
+Vue.use(Router)
+
+const routes = [
+  {
+    path: '/',
+    name: 'home',
+    component: home,
+    redirect:'emailList/all',
+    children: [
+      {
+        path: 'emailList/:num',
+        name: 'emailList1',
+        component: emailList
+      },
+      {
+        path: 'emailList/',
+        name: 'emailList2',
+        component: emailList
+      },
+      {
+        path: 'addEmailBox/',
+        name: 'addEmailBox',
+        component: addEmailBox
+      },
+      {
+        path: 'email/:num',
+        name: 'email',
+        component: email
+      }
+    ]
+  }
+]
+const router = new Router({
+  routes: routes
+})
+router.beforeEach((to, from, next) => {
+  if (window._hmt) {
+    if (to.path) {
+      window._hmt.push(['_trackPageview', '/#' + to.fullPath])
+    }
+  }
+  next()
+})
+
+export default router

+ 0 - 0
mailreload/static/.gitkeep


BIN
mailreload/static/favicon.ico


BIN
mailreload/static/notFound.png


+ 22 - 0
manage.py

@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mailList.settings")
+    try:
+        from django.core.management import execute_from_command_line
+    except ImportError:
+        # The above import may fail for some other reason. Ensure that the
+        # issue is really that Django is missing to avoid masking other
+        # exceptions on Python 2.
+        try:
+            import django
+        except ImportError:
+            raise ImportError(
+                "Couldn't import Django. Are you sure it's installed and "
+                "available on your PYTHONPATH environment variable? Did you "
+                "forget to activate a virtual environment?"
+            )
+        raise
+    execute_from_command_line(sys.argv)

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است