main.py
上传用户:gyjinxi
上传日期:2007-01-04
资源大小:159k
文件大小:7k
源码类别:

WEB邮件程序

开发平台:

Python

  1. # Distributed under GNU GPL. See COPYING
  2. # Copyright (c) 1998-2000 Henning Schr鰀er
  3. from string import replace
  4. from bobomailrc import *
  5. from bobomailrc import __version__, __author__
  6. from mimeviewer import *
  7. from Message import *
  8. from logging import *
  9. import fintl
  10. gettext = fintl.gettext
  11. fintl.bindtextdomain("bobomail", locale_dir)
  12. fintl.textdomain("bobomail")
  13. _ = gettext
  14. def HTMLTemplate(template, extra={}, **exchange):
  15. page = open(template_template).read()
  16. extra["%(body)s"] = open(template).read()
  17. for old, new in extra.items():
  18. page = replace(page, old, new)
  19. exchange["imagedir"] = image_dir
  20. html = HTML(page)
  21. return apply(html, (), exchange)
  22. class BoboMail:
  23. "BoboMail main class"
  24. def __init__(self, authtype, folders):
  25. self.auth = authtype
  26. self.folders = folders
  27. def Debug(self, REQUEST):
  28. "Debug session"
  29. return REQUEST
  30. def getFolder(self, name):
  31. mbox = self.folders[name]
  32. if not mbox.connected:
  33. mbox.open(self.auth)
  34. return mbox
  35. def index_html(self, REQUEST, RESPONSE):
  36. "Show start page"
  37. return HTMLTemplate(login_template, title=_("Login"))
  38. def Login(self, userid, password, REQUEST, RESPONSE):
  39. "Log into BoboMail"
  40. if self.auth.login(auth_host, userid, password):
  41. log("OK: %s logged in" % userid)
  42. RESPONSE.redirect(
  43. "%s/List?sid=%s" % (REQUEST["SCRIPT_NAME"], self.auth.hash))
  44. #return self.List(self.auth.hash)
  45. else:
  46. return self.authError()
  47. def List(self, sid, by="Date"):
  48. "Show mails"
  49. if self.auth.relogin(sid):
  50. inbox = self.getFolder("inbox")
  51. msgs = []
  52. for i in range(len(inbox)):
  53. msgs.append(inbox[i, 1])
  54. inbox.close()
  55. t = _("List inbox for %s")
  56. return HTMLTemplate(
  57. list_template, {"%(by)s": by}, mails=msgs, sid=sid,
  58. title=t % self.auth.userid)
  59. else:
  60. return self.authError()
  61. def Read(self, sid, index):
  62. "Read single message"
  63. if self.auth.relogin(sid):
  64. inbox = self.getFolder("inbox")
  65. msg = inbox[index]
  66. inbox.close()
  67. return HTMLTemplate(mail_template,
  68. title=_("Read message"), msg=msg, sid=sid, index=index, message=MessageViewer(msg, sid))
  69. else:
  70. return self.authError()
  71. def GetPart(self, sid, index, num, RESPONSE):
  72. "Get decodes message part"
  73. if self.auth.relogin(sid):
  74. inbox = self.getFolder("inbox")
  75. msg = inbox[index]
  76. inbox.close()
  77. part = getMIMEPart(msg, num)
  78. RESPONSE.setHeader("Content-Type", part.gettype())
  79. if part.filename:
  80. RESPONSE.setHeader("Content-Disposition", 'filename="%s"' % part.filename)
  81. return part.decode()
  82. else:
  83. return self.authError()
  84. def Compose(self, sid, To="", Subject=""):
  85. "Compose new message"
  86. if self.auth.relogin(sid):
  87. return HTMLTemplate(compose_template,
  88. sid=sid, to=To, subject=Subject, title=_("Compose new message"))
  89. else:
  90. return self.authError()
  91. def Reply(self, sid, index):
  92. "Reply to message"
  93. if self.auth.relogin(sid):
  94. inbox = self.getFolder("inbox")
  95. msg = inbox[index]
  96. inbox.close()
  97. return HTMLTemplate(compose_template,
  98. title=_("Reply to message"), sid=sid, to=msg.FromAddr,
  99. subject=_("Re: %s") % msg.Subject, imagedir=image_dir,
  100. body=quotedtext(repr(MessageViewer(msg, sid))))
  101. else:
  102. return self.authError()
  103. def Forward(self, sid, index):
  104. "Forward a message"
  105. if self.auth.relogin(sid):
  106. inbox = self.getFolder("inbox")
  107. msg = inbox[index]
  108. inbox.close()
  109. return HTMLTemplate(compose_template,
  110. title=_("Forward message"), sid=sid, 
  111. subject=_("Fwd: %s - %s") % (msg.FromAddr, msg.Subject),
  112. body=quotedtext(repr(MessageViewer(msg, sid))))
  113. else:
  114. return self.authError()
  115. def Delete(self, sid, REQUEST, RESPONSE, index=None):
  116. "Delete messages"
  117. if self.auth.relogin(sid):
  118. inbox = self.getFolder("inbox")
  119. if index:
  120. del inbox[index]
  121. else:
  122. import cgi, re, string
  123. numpat = re.compile("^[0123456789*]")
  124. form = cgi.FieldStorage()
  125. delcount = 0
  126. log("%s" % form.keys())
  127. for i in form.keys():
  128. log("%s : %s" % (i, numpat.match(i)))
  129. if numpat.match(i):
  130. del inbox[int(i) - delcount]
  131. delcount = delcount + 1
  132. inbox.close()
  133. RESPONSE.redirect("%s/List?sid=%s" % (REQUEST["SCRIPT_NAME"], self.auth.hash))
  134. else: return self.authError()
  135. def Bounce(self, sid, To, REQUEST, index=None):
  136. "Bounce messages"
  137. return "bounce coming soon"
  138. def Send(self, sid, to, cc="", bcc="", subject="", body="", attach=None):
  139. "Send mail"
  140. if self.auth.relogin(sid):
  141. from sendmail import *
  142. if attach is not None: filename = attach.filename
  143. else: filename = ""
  144. errors = sendmail(
  145. "%s@%s" % (self.auth.userid, domain), to, cc, bcc, subject, body, attach, filename)
  146. return HTMLTemplate(sent_template, title=_("Sent mail"), sid=sid, failed=errors)
  147. else: return self.authError()
  148.  
  149. def About(self, sid=None):
  150. "About bobomail"
  151. return HTMLTemplate(about_template, title=_("About"), version=__version__, sid=sid)
  152. def Help(self, sid=None):
  153. "Help for bobomail"
  154. return _("Only loosers and communists need help (Weird Al Yankovic)")
  155. def Prefs(self, sid):
  156. "Preferenes"
  157. return "Currently nothing to configure here. Look into bobomailrc.py"
  158. def AddrBook(self, sid):
  159. "Address book"
  160. return "Address book coming soon"
  161. def AddrAdd(self, name, email):
  162. "Add to address book"
  163. return "Adding adresses coming soon"
  164. def Goto(self, REQUEST, RESPONSE):
  165. "Goto URL (necessary to hide REFERRER information"
  166. url = urlunquote(REQUEST.get("QUERY_STRING", ""))
  167. RESPONSE.redirect(url)
  168. def GetFile(self, REQUEST, RESPONSE):
  169. "Get file (if you use BoboMailHTTPServer)"
  170. import os
  171. fn = urlunquote(REQUEST.get("QUERY_STRING", ""))
  172. if fn[0] not in [".", os.sep]:
  173. import mimetypes
  174. mimetypes.init(["/etc/mime.types", bm_mimetypes])
  175. ext = os.path.splitext(fn)[1]
  176. ctype = mimetypes.guess_type(ext)[0] or "application/octet-stream"
  177. RESPONSE.setHeader("Content-Type", ctype)
  178. return open(os.path.join(app_dir, fn)).read()
  179. def Logout(self, REQUEST, RESPONSE, sid=None):
  180. "Log out"
  181. if self.auth.relogin(sid):
  182. self.auth.logout()
  183. RESPONSE.redirect("%s/index_html" % REQUEST["SCRIPT_NAME"])
  184. def error(self, msg, reason=None):
  185. return HTMLTemplate(error_template,
  186. title=_("Error"), description=msg, reason=reason)
  187. def authError(self):
  188. log("FAILURE: authenticating %s" % getattr(self.auth, "userid", ""))
  189. return self.error(
  190. _("Authentication failed. Please check your userid and password" +
  191. " and try to login again."), reason=_("Or maybe you session has expired"))
  192. # cgi must run as root
  193. #from fetchmail import MailSpool, UserMailbox
  194. #from auth import SimpleAuthentication
  195. #SimpleAuthentication.atable = {"guest": "guest", "testuser": "secret"}
  196. #bobomail = BoboMail(
  197. # SimpleAuthentication(),
  198. # {"inbox": MailSpool(), "sent": UserMailbox("sent")})
  199. from fetchmail import POP3Box
  200. from auth import POP3Authentication
  201. bobomail = BoboMail(POP3Authentication(), {"inbox": POP3Box()})
  202. bobo_application = bobomail # only publish bobomail instance
  203. # Test stuff
  204. if __name__ == "__main__":
  205. class DUMMY:
  206. def __getattr__(*args): pass
  207. def __setattr__(*args): pass
  208. def __getitem__(*args): pass
  209. def __setitem__(*args): pass
  210. def redirect(*args): pass
  211. def setHeader(*args): pass
  212. #print bobomail.GetFile({"QUERY_STRING": "images/bobomail.css"}, DUMMY())
  213. #print bobomail.index_html(DUMMY(), DUMMY())
  214. bobomail.Login("guest", "guest", DUMMY(), DUMMY())
  215. #bobomail.Delete(bobomail.auth.hash, DUMMY(), DUMMY(), index=1)
  216. print bobomail.List(bobomail.auth.hash)
  217. #print bobomail.Read(bobomail.auth.hash, 1)
  218. #bobomail.GetPart(bobomail.auth.hash, 1, [1], DUMMY())