From now, users can store their own "preferences" inside MailNG.
This commit is contained in:
tonio
2010-06-09 15:58:46 +02:00
parent 59fddd81d8
commit 1c35ce5757
32 changed files with 351 additions and 152 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ from mailng.lib import db, parameters
if __name__ == "__main__":
conn = db.getconnection("amavis_quarantine")
max_messages_age = parameters.get("amavis_quarantine", "MAX_MESSAGES_AGE")
max_messages_age = parameters.get_admin("amavis_quarantine", "MAX_MESSAGES_AGE")
print "Deleting messages older than %d days..." % max_messages_age
db.execute(conn, """
+4 -4
View File
@@ -6,14 +6,14 @@ from mailng.lib import parameters
class AMrelease(object):
def __init__(self):
mode = parameters.get("amavis_quarantine", "AM_PDP_MODE")
mode = parameters.get_admin("amavis_quarantine", "AM_PDP_MODE")
if mode == "inet":
host = parameters.get("amavis_quarantine", 'AM_PDP_HOST')
port = parameters.get("amavis_quarantine", 'AM_PDP_PORT')
host = parameters.get_admin("amavis_quarantine", 'AM_PDP_HOST')
port = parameters.get_admin("amavis_quarantine", 'AM_PDP_PORT')
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect((host, int(port)))
else:
path = parameters.get("amavis_quarantine", 'AM_PDP_SOCKET')
path = parameters.get_admin("amavis_quarantine", 'AM_PDP_SOCKET')
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.connect(path)
+14 -12
View File
@@ -16,18 +16,20 @@ def infos():
def init():
events.register("UserMenuDisplay", menu)
parameters.register("amavis_quarantine", "MAX_MESSAGES_AGE", "int", 14,
help=_("Quarantine messages maximum age (in days) before deletion"))
parameters.register("amavis_quarantine", "AM_PDP_MODE", "list", "unix",
values=[("inet", "inet"), ("unix", "unix")],
help="")
parameters.register("amavis_quarantine", "AM_PDP_HOST", "string", "localhost",
help="")
parameters.register("amavis_quarantine", "AM_PDP_PORT", "int", 9998,
help="")
parameters.register("amavis_quarantine", "AM_PDP_SOCKET", "string",
"/var/amavis/amavisd.sock",
help="")
parameters.register_admin("amavis_quarantine", "MAX_MESSAGES_AGE", type="int",
deflt=14,
help=_("Quarantine messages maximum age (in days) before deletion"))
parameters.register_admin("amavis_quarantine", "AM_PDP_MODE", type="list",
deflt="unix",
values=[("inet", "inet"), ("unix", "unix")],
help="")
parameters.register_admin("amavis_quarantine", "AM_PDP_HOST", type="string",
deflt="localhost", help="")
parameters.register_admin("amavis_quarantine", "AM_PDP_PORT", type="int",
deflt=9998, help="")
parameters.register_admin("amavis_quarantine", "AM_PDP_SOCKET", type="string",
deflt="/var/amavis/amavisd.sock",
help="")
def destroy():
events.unregister("UserMenuDisplay", menu)
+3 -2
View File
@@ -28,8 +28,9 @@ def init():
events.register("ModifyMailbox", onModifyMailbox)
events.register("UserMenuDisplay", menu)
parameters.register("postfix_autoreply", "AUTOREPLIES_TIMEOUT", "int", 86400,
help=_("Timeout in seconds between two auto-replies to the same recipient"))
parameters.register_admin("postfix_autoreply", "AUTOREPLIES_TIMEOUT",
type="int", deflt=86400,
help=_("Timeout in seconds between two auto-replies to the same recipient"))
def destroy():
events.unregister("CreateDomain", onCreateDomain)
@@ -7,13 +7,33 @@ from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Renaming model 'ARmessage'
db.rename_table('main_armessage', 'postfix_autoreply_armessage')
# Renaming/Creating model 'ARmessage'
try:
db.rename_table('main_armessage', 'postfix_autoreply_armessage')
except Exception:
db.create_table('postfix_autoreply_armessage', (
('mbox', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['admin.Mailbox'])),
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('subject', self.gf('django.db.models.fields.CharField')(max_length=255)),
('content', self.gf('django.db.models.fields.TextField')()),
('enabled', self.gf('django.db.models.fields.BooleanField')(default=False, blank=True))
))
db.send_create_signal('postfix_autoreply', ['ARmessage'])
db.add_column('postfix_autoreply_armessage', 'untildate',
models.DateTimeField(null=True))
# Renaming model 'ARhistoric'
db.rename_table('main_arhistoric', 'postfix_autoreply_arhistoric')
try:
db.rename_table('main_arhistoric', 'postfix_autoreply_arhistoric')
except Exception:
db.create_table('postfix_autoreply_arhistoric', (
('armessage', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['postfix_autoreply.ARmessage'])),
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('last_sent', self.gf('django.db.models.fields.DateTimeField')(auto_now=True)),
('sender', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('postfix_autoreply', ['ARhistoric'])
def backwards(self, orm):
@@ -29,7 +29,7 @@ if __name__ == "__main__":
try:
lastar = ARhistoric.objects.get(armessage=armessage.id, sender=sender)
parameters.get("postfix_autoreply", "AUTOREPLIES_TIMEOUT")
parameters.get_admin("postfix_autoreply", "AUTOREPLIES_TIMEOUT")
delta = datetime.timedelta(seconds=timeout)
if lastar.last_sent + delta > datetime.datetime.now():
sys.exit(0)
+2 -2
View File
@@ -55,8 +55,8 @@ tpl = {'traffic':traffic_avg_template,
class Grapher(object):
def __init__(self):
self.rrd_rootdir = parameters.get("stats", "RRD_ROOTDIR")
self.img_rootdir = parameters.get("stats", "IMG_ROOTDIR")
self.rrd_rootdir = parameters.get_admin("stats", "RRD_ROOTDIR")
self.img_rootdir = parameters.get_admin("stats", "IMG_ROOTDIR")
def process(self, target, suffix, start, end, tpl=traffic_avg_template):
rrdfile = "%s/%s.rrd" % (self.rrd_rootdir, target)
+2 -2
View File
@@ -276,8 +276,8 @@ class LogParser(object):
G.make_defaults(dom, tpl=grapher.size_avg_template)
if __name__ == "__main__":
log_file = parameters.get("stats", "LOGFILE")
rrd_rootdir = parameters.get("stats", "RRD_ROOTDIR")
log_file = parameters.get_admin("stats", "LOGFILE")
rrd_rootdir = parameters.get_admin("stats", "RRD_ROOTDIR")
parser = OptionParser()
parser.add_option("-l","--logFile", default=log_file,
+9 -6
View File
@@ -21,12 +21,15 @@ def infos():
def init():
events.register("AdminMenuDisplay", menu)
parameters.register("stats", "LOGFILE", "string", "/var/log/mail.log",
help=_("Path to log file used to collect statistics"))
parameters.register("stats", "RRD_ROOTDIR", "string", "/tmp/mailng",
help=_("Path to directory where RRD files are stored"))
parameters.register("stats", "IMG_ROOTDIR", "string", "/tmp/mailng",
help=_("Path to directory where PNG files are stored"))
parameters.register_admin("stats", "LOGFILE", type="string",
deflt="/var/log/mail.log",
help=_("Path to log file used to collect statistics"))
parameters.register_admin("stats", "RRD_ROOTDIR", type="string",
deflt="/tmp/mailng",
help=_("Path to directory where RRD files are stored"))
parameters.register_admin("stats", "IMG_ROOTDIR", type="string",
deflt="/tmp/mailng",
help=_("Path to directory where PNG files are stored"))
def destroy():
events.unregister("AdminMenuDisplay", menu)
+5 -5
View File
@@ -53,7 +53,7 @@ def graph_display(request,dom_id,graph_t=graph_types):
"page" : "Domain statistics", "graph" : graph_nature,
"domain": domain, "domains" : domains, "messages" : errors,
"types" : graph_type, "tmp_path" : tmp_path,
"img_rootdir" : parameters.get("stats", "IMG_ROOTDIR")})
"img_rootdir" : parameters.get_admin("stats", "IMG_ROOTDIR")})
@login_required
@user_passes_test(lambda u: u.is_superuser)
@@ -75,7 +75,7 @@ def adminindex(request):
"graphs" : graph_list,
"periods" : ["day", "week", "month", "year","Custom"],
"period" : period, "cal" : CH_print,
"img_rootdir" : parameters.get("stats", "IMG_ROOTDIR")})
"img_rootdir" : parameters.get_admin("stats", "IMG_ROOTDIR")})
@login_required
@user_passes_test(lambda u: u.is_superuser)
@@ -109,7 +109,7 @@ def custom_period(request):
"start" : start_ref,
"end" : end_ref,
"messages" : ["Custom period not selected"],
"img_rootdir" : parameters.get("stats", "IMG_ROOTDIR")})
"img_rootdir" : parameters.get_admin("stats", "IMG_ROOTDIR")})
period_name = "%s_%s" %(start.replace('/',''),end.replace('/',''))
G = Grapher()
@@ -130,7 +130,7 @@ def custom_period(request):
"start" : start_ref,
"end" : end_ref,
"messages" : None,
"img_rootdir" : parameters.get("stats", "IMG_ROOTDIR")})
"img_rootdir" : parameters.get_admin("stats", "IMG_ROOTDIR")})
@login_required
@@ -147,4 +147,4 @@ def index(request, dom_id=None):
"graphs" : graph_list,
"periods" : ["day", "week", "month", "year","Custom"],
"period" : period,
"img_rootdir" : parameters.get("stats", "IMG_ROOTDIR")})
"img_rootdir" : parameters.get_admin("stats", "IMG_ROOTDIR")})
+10 -8
View File
@@ -140,11 +140,9 @@ class IMAPconnector(object):
__metaclass__ = ConnectionsManager
def __init__(self, user=None, password=None):
print "IMAP constructor"
self.criterions = []
self.address = parameters.get("webmail", "IMAP_SERVER")
self.port = int(parameters.get("webmail", "IMAP_PORT"))
self.address = parameters.get_admin("webmail", "IMAP_SERVER")
self.port = int(parameters.get_admin("webmail", "IMAP_PORT"))
self.invalid = False
status, msg = self.login(user, password)
if not status:
@@ -153,7 +151,7 @@ class IMAPconnector(object):
def login(self, user, passwd):
import imaplib
try:
secured = parameters.get("webmail", "IMAP_SECURED")
secured = parameters.get_admin("webmail", "IMAP_SECURED")
if secured == "yes":
self.m = imaplib.IMAP4_SSL(self.address, self.port)
else:
@@ -321,7 +319,8 @@ class ImapListing(EmailListing):
reset_wm_url = False
def __init__(self, user, **kwargs):
self.mbc = IMAPconnector(user=user)
self.user = user
self.mbc = IMAPconnector(user=user.username)
if kwargs.has_key("pattern"):
self.parse_search_parameters(kwargs["criteria"],
kwargs["pattern"])
@@ -345,8 +344,11 @@ class ImapListing(EmailListing):
md_folders = [{"name" : "INBOX", "icon" : "overview.png"},
{"name" : 'Drafts'},
{"name" : 'Junk'},
{"name" : 'Sent'},
{"name" : 'Trash', "icon" : "trash.png"}]
{"name" : parameters.get_user(self.user, "webmail",
"SENT_FOLDER")},
{"name" : parameters.get_user(self.user, "webmail",
"TRASH_FOLDER"),
"icon" : "trash.png"}]
folders = self.mbc.listfolders(md_folders=md_folders)
md_folders += self.__parse_folders(folders)
for fd in md_folders:
+24 -14
View File
@@ -8,20 +8,30 @@ def init():
events.register("UserMenuDisplay", menu)
events.register("UserLogin", userlogin)
events.register("UserLogout", userlogout)
parameters.register("webmail", "IMAP_SERVER", "string", "127.0.0.1",
help=_("Address of your IMAP server"))
parameters.register("webmail", "IMAP_SECURED", "list_yesno", "no",
help=_("Use a secured connection to access IMAP server"))
parameters.register("webmail", "IMAP_PORT", "int", "143",
help=_("Listening port of your IMAP server"))
parameters.register("webmail", "SMTP_SERVER", "string", "127.0.0.1",
help=_("Address of your SMTP server"))
parameters.register("webmail", "SMTP_PORT", "int", "25",
help=_("Listening port of your SMTP server"))
parameters.register("webmail", "SMTP_AUTHENTICATION", "list_yesno", "no",
help=_("Server needs authentication"))
parameters.register("webmail", "SMTP_SECURED", "list_yesno", "no",
help=_("Use a secured connection to access SMTP server"))
parameters.register_admin("webmail", "IMAP_SERVER", type="string",
deflt="127.0.0.1",
help=_("Address of your IMAP server"))
parameters.register_admin("webmail", "IMAP_SECURED", type="list_yesno",
deflt="no",
help=_("Use a secured connection to access IMAP server"))
parameters.register_admin("webmail", "IMAP_PORT", type="int", deflt="143",
help=_("Listening port of your IMAP server"))
parameters.register_admin("webmail", "SMTP_SERVER", type="string",
deflt="127.0.0.1",
help=_("Address of your SMTP server"))
parameters.register_admin("webmail", "SMTP_PORT", type="int", deflt="25",
help=_("Listening port of your SMTP server"))
parameters.register_admin("webmail", "SMTP_AUTHENTICATION", type="list_yesno",
deflt="no",
help=_("Server needs authentication"))
parameters.register_admin("webmail", "SMTP_SECURED", type="list_yesno",
deflt="no",
help=_("Use a secured connection to access SMTP server"))
parameters.register_user("webmail", "TRASH_FOLDER", type="string", deflt="Trash",
help=_("Folder where deleted messages go"))
parameters.register_user("webmail", "SENT_FOLDER", type="string", deflt="Sent",
help=_("Folder where copies of sent messages go"))
def destroy():
events.unregister("UserMenuDisplay", menu)
+14 -13
View File
@@ -47,7 +47,7 @@ def folder(request, name, updatenav=True):
optparams["criteria"] = request.session["criteria"]
else:
optparams["reset"] = True
lst = ImapListing(request.user.username,
lst = ImapListing(request.user,
baseurl=name, folder=name, order=order, **optparams)
page = lst.paginator.getpage(request.session["page"])
@@ -67,14 +67,14 @@ def folder(request, name, updatenav=True):
@login_required
@is_not_localadmin()
def index(request):
#try:
navp = request.session.has_key("navparams") \
and request.session["navparams"] or {}
lst = ImapListing(request.user.username,
baseurl="INBOX", navparams=navp, folder="INBOX",
empty=True)
#except Exception, exp:
# return _render_error(request, user_context={"error" : exp})
try:
navp = request.session.has_key("navparams") \
and request.session["navparams"] or {}
lst = ImapListing(request.user,
baseurl="INBOX", navparams=navp, folder="INBOX",
empty=True)
except Exception, exp:
return _render_error(request, user_context={"error" : exp})
return lst.render(request)
def fetchmail(request, folder, mail_id, all=False):
@@ -211,18 +211,19 @@ def send_mail(request, withctx=False, origmsg=None):
msg["Cc"] = request.POST["cc"]
rcpts += msg["Cc"].split(",")
try:
s = smtplib.SMTP(parameters.get("webmail", "SMTP_SERVER"))
if parameters.get("webmail", "SMTP_SECURED") == "yes":
s = smtplib.SMTP(parameters.get_admin("webmail", "SMTP_SERVER"))
if parameters.get_admin("webmail", "SMTP_SECURED") == "yes":
s.starttls()
except (smtplib.SMTPException, ssl.SSLError), error:
print error
# Prévoir la remontée de cette erreur au niveau du client!!
if parameters.get("webmail", "SMTP_AUTHENTICATION") == "yes":
if parameters.get_admin("webmail", "SMTP_AUTHENTICATION") == "yes":
s.login(request.user.username, request.session["password"])
s.sendmail(msg['From'], rcpts, msg.as_string())
s.quit()
IMAPconnector(user=request.user.username).push_mail("Sent", msg)
sentfolder = parameters.get_user(request.user, "webmail", "SENT_FOLDER")
IMAPconnector(user=request.user.username).push_mail(sentfolder, msg)
ctx = getctx("ok", url=__get_current_url(request))
else:
ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html",