Changeset 117:46e0f085f4ef


Ignore:
Timestamp:
09/03/2010 15:39:43 (5 months ago)
Author:
tonio
Branch:
default
Message:

Email forwarding.

Files:
7 edited

Legend:

Unmodified
Added
Removed
  • extensions/webmail/imap_listing.py

    r116 r117  
    5757        self.fulladdress = "%s <%s>" % (self.name, self.address) 
    5858 
     59    def __str__(self): 
     60        return self.fulladdress 
     61 
    5962class IMAPheader(object): 
    6063    @staticmethod 
    61     def parse_address(value): 
     64    def parse_address(value, **kwargs): 
    6265        addr = EmailAddress(value) 
     66        if "full" in kwargs.keys() and kwargs["full"]: 
     67            return addr.fulladdress 
    6368        return addr.name and addr.name or value 
    6469 
    6570    @staticmethod 
    66     def parse_address_list(values): 
     71    def parse_address_list(values, **kwargs): 
    6772        lst = values.split(",") 
    6873        result = "" 
     
    7075            if result != "": 
    7176                result += ", " 
    72             result += IMAPheader.parse_address(addr) 
     77            result += IMAPheader.parse_address(addr, **kwargs) 
    7378        return result 
    7479 
    7580    @staticmethod 
    76     def parse_from(value): 
    77         return IMAPheader.parse_address(value) 
    78  
    79     @staticmethod 
    80     def parse_to(value): 
    81         return IMAPheader.parse_address_list(value) 
    82  
    83     @staticmethod 
    84     def parse_cc(value): 
    85         return IMAPheader.parse_address_list(value) 
    86  
    87     @staticmethod 
    88     def parse_date(value): 
     81    def parse_from(value, **kwargs): 
     82        return IMAPheader.parse_address(value, **kwargs) 
     83 
     84    @staticmethod 
     85    def parse_to(value, **kwargs): 
     86        return IMAPheader.parse_address_list(value, **kwargs) 
     87 
     88    @staticmethod 
     89    def parse_cc(value, **kwargs): 
     90        return IMAPheader.parse_address_list(value, **kwargs) 
     91 
     92    @staticmethod 
     93    def parse_reply_to(value, **kwargs): 
     94        return IMAPheader.parse_address_list(value, **kwargs) 
     95 
     96    @staticmethod 
     97    def parse_date(value, **kwargs): 
    8998        tmp = email.utils.parsedate_tz(value) 
    9099        if not tmp: 
     
    97106 
    98107    @staticmethod 
    99     def parse_subject(value): 
     108    def parse_subject(value, **kwargs): 
    100109        res = "" 
    101110        dcd = decode_header(value) 
     
    186195        folder, id = imapid.split("/") 
    187196        self.m.store(id, "+FLAGS", "\\Seen") 
     197 
     198    def msgforwarded(self, folder, imapid): 
     199        self.m.select(self._encodefolder(folder), True) 
     200        self.m.store(imapid, "+FLAGS", "$Forwarded") 
    188201 
    189202    def move(self, msgset, oldfolder, newfolder): 
     
    255268 
    256269class ImapEmail(Email): 
    257     def __init__(self, msg, **kwargs): 
     270    def __init__(self, msg, addrfull=False, **kwargs): 
    258271        Email.__init__(self, msg, **kwargs) 
    259272 
     
    266279                    continue 
    267280            try: 
    268                 self.headers += [{"name" : label, "value" : getattr(IMAPheader, "parse_%s" % f.lower())(msg[f])}] 
     281                key = re.sub("-", "_", f).lower() 
     282                value = getattr(IMAPheader, "parse_%s" % key)(msg[f], full=addrfull) 
     283                self.headers += [{"name" : label, "value" : value}] 
    269284            except AttributeError: 
    270285                self.headers += [{"name" : label, "value" : msg[f]}] 
    271  
     286            try: 
     287                label = re.sub("-", "_", label) 
     288                setattr(self, label, value) 
     289            except: 
     290                pass 
     291 
  • extensions/webmail/main.py

    r116 r117  
    181181    return folder(request, name, False) 
    182182 
    183 def render_compose(request, form, bodyheader=None, body=None): 
     183def render_compose(request, form, posturl, bodyheader=None, body=None): 
    184184    menu = compose_menu("", request.session, request.user.get_all_permissions()) 
    185185    content = render_to_string("webmail/compose.html", { 
    186             "form" : form, "bodyheader" : bodyheader, "body" : body 
     186            "form" : form, "bodyheader" : bodyheader, "body" : body, 
     187            "posturl" : posturl 
    187188            }) 
    188189    ctx = getctx("ok", level=2, menu=menu, listing=content) 
    189190    return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") 
    190191 
    191 def send_mail(request): 
     192def send_mail(request, withctx=False): 
    192193    form = ComposeMailForm(request.POST) 
    193194    if form.is_valid(): 
     
    210211        except (smtplib.SMTPException, ssl.SSLError), error: 
    211212            print error 
     213            # Prévoir la remontée de cette erreur au niveau du client!! 
    212214 
    213215        if parameters.get("webmail", "SMTP_AUTHENTICATION") == "yes": 
     
    217219        ctx = getctx("ok", url="%s?page=%s" % (request.session["folder"],  
    218220                                               request.session["page"])) 
     221    else: 
     222        ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html",  
     223                                                    {"form" : form})) 
     224    if not withctx: 
    219225        return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") 
     226    return ctx, HttpResponse(simplejson.dumps(ctx), mimetype="application/json") 
    220227 
    221228@login_required 
     
    226233    form = ComposeMailForm() 
    227234    form.fields["from_"].initial = request.user.username 
    228     return render_compose(request, form) 
     235    return render_compose(request, form, reverse(compose)) 
    229236 
    230237@login_required 
     
    233240        return send_mail(request) 
    234241    msg = fetchmail(request, folder, mail_id, True) 
    235     email = ImapEmail(msg) 
     242    email = ImapEmail(msg, True) 
    236243    lines = email.body.split('\n') 
    237244    body = "" 
     
    243250    form.fields["from_"].initial = request.user.username 
    244251    if not "Reply-To" in msg.keys(): 
    245         form.fields["to"].initial = msg["From"] 
    246     else: 
    247         form.fields["to"].initial = msg["Reply-To"] 
     252        form.fields["to"].initial = email.From 
     253    else: 
     254        form.fields["to"].initial = email.Reply_To 
    248255    if request.GET.has_key("all"): 
    249256        form.fields["cc"].initial = "" 
     
    258265                form.fields["cc"].initial += ", " 
    259266            form.fields["cc"].initial += tmp.fulladdress 
    260     subject = IMAPheader.parse_subject(msg["Subject"]) 
    261     m = re.match("re\s*:\s*.+", subject.lower()) 
     267    m = re.match("re\s*:\s*.+", email.Subject.lower()) 
    262268    if m: 
    263         form.fields["subject"].initial = subject 
    264     else: 
    265         form.fields["subject"].initial = "Re: %s" % subject 
    266     textheader = EmailAddress(msg["From"]).fulladdress + " " + _("wrote:") 
    267     return render_compose(request, form, textheader, body) 
     269        form.fields["subject"].initial = email.Subject 
     270    else: 
     271        form.fields["subject"].initial = "Re: %s" % email.Subject 
     272    textheader = "%s %s" % (email.From, _("wrote:")) 
     273    return render_compose(request, form, reverse(reply, args[folder, mail_id]), 
     274                          textheader, body) 
     275 
     276@login_required 
     277def forward(request, folder, mail_id): 
     278    if request.method == "POST": 
     279        ctx, response = send_mail(request, True) 
     280        if ctx["status"] == "ok": 
     281            IMAPconnector(request).msgforwarded(folder, mail_id) 
     282        return response 
     283 
     284    msg = fetchmail(request, folder, mail_id, True) 
     285    email = ImapEmail(msg, True) 
     286    textheader = "----- %s -----" % _("Original message") 
     287    textheader += "\n%s: %s" % (_("Subject"), email.Subject) 
     288    textheader += "\n%s: %s" % (_("Date"), msg["Date"]) 
     289    for hdr in ["From", "To", "Reply-To"]: 
     290        try: 
     291            key = re.sub("-", "_", hdr) 
     292            value = getattr(email, key) 
     293            textheader += "\n%s: %s" % (_(hdr), value) 
     294        except: 
     295            pass 
     296    textheader += "\n" 
     297 
     298    form = ComposeMailForm() 
     299    form.fields["from_"].initial = request.user.username 
     300    form.fields["subject"].initial = "Fwd: %s" % email.Subject 
     301    return render_compose(request, form, reverse(forward, args=[folder, mail_id]),  
     302                          textheader, email.body) 
  • extensions/webmail/templates/compose.html

    r116 r117  
    3838</style> 
    3939 
    40 {% url extensions.webmail.main.compose as compurl %} 
    41 <form method="POST" action="{{ compurl }}" id="composemail"> 
     40<form method="POST" action="{{ posturl }}" id="composemail"> 
    4241  <div id="compose-container"> 
    4342    <div id="mailheader"> 
  • extensions/webmail/templates/index.html

    r116 r117  
    162162    $$("a[name=reply]").addEvent("click", reply); 
    163163    $$("a[name=replyall]").addEvent("click", replyall); 
     164    $$("a[name=forward]").addEvent("click", forward); 
    164165    $$("a[name=delete]").addEvent("click", function(event) { 
    165166      var lnk = event.target; 
     
    183184        onSuccess: function(resp) { 
    184185          resp = JSON.decode(resp); 
     186          if (resp.status == "ko") { 
     187            updatelisting(resp); 
     188            window.fireEvent("resize"); 
     189            return; 
     190          } 
    185191          current_anchor.parse_string(resp.url, true).setparams(navparams); 
    186192          current_anchor.update(); 
     
    208214  } 
    209215  register_callback("replyall", compose_callback); 
     216  forward = function(event) { 
     217    event.stop(); 
     218    location.hash += event.target.get("href"); 
     219  } 
     220  register_callback("forward", compose_callback); 
    210221 
    211222  loadFolder = function(event, obj) { 
  • extensions/webmail/templatetags/webextras.py

    r116 r117  
    4040         "label" : _("Reply all")}, 
    4141        {"name" : "forward", 
    42          "url" : "", 
     42         "url" : "forward/", 
    4343         "img" : "/static/pics/alias.png", 
    4444         "label" : _("Forward")}, 
  • extensions/webmail/urls.py

    r115 r117  
    99                       (r'^(?P<fdname>.+)/(?P<mail_id>[\w\-\+]+)/delete/$', 'delete'), 
    1010                       (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/content/$', 'getmailcontent'), 
     11                       (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/forward/$', 'forward'), 
    1112                       (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/reply/$', 'reply'), 
    1213                       (r'^(?P<folder>.+)/(?P<mail_id>[\w\-\+]+)/$', 'viewmail'), 
  • static/stylesheets/default.css

    r113 r117  
    348348    color: #FF2A00; 
    349349} 
     350 
     351.errorlist ul { 
     352    float: left; 
     353    list-style: none; 
     354} 
     355 
     356.errorlist li {  
     357    margin-left: 10px; 
     358    float: left; 
     359    display: inline; 
     360    color: red; 
     361} 
Note: See TracChangeset for help on using the changeset viewer.