示例#1
0
def get_msg_part( request, folder, uid, part_number, inline = False ):
    '''Gets a message part.
    '''
    folder_name =  base64.urlsafe_b64decode(str(folder))

    M = serverLogin( request )
    folder = M[folder_name]
    message = folder[int(uid)]
    part = message.bodystructure.find_part(part_number)

    response = HttpResponse(content_type='%s/%s' % (part.media, part.media_subtype))

    if part.filename():
        filename = part.filename()
    else:
        filename = _('Unknown')

    if inline:
        response['Content-Disposition'] = 'inline; filename=%s' % filename
    else:
        response['Content-Disposition'] = 'attachment; filename=%s' % filename

    if part.media.upper() == 'TEXT':
        response['Content-Type'] = '%s/%s; charset=%s' % (part.media, part.media_subtype, part.charset())
    else:
        response['Content-Type'] = '%s/%s' % (part.media, part.media_subtype)

    response.write( message.part(part) )
    response.close()

    return response
示例#2
0
def reply_all_message(request, folder, uid):
    '''Reply to a message'''
    # Get the message
    M = serverLogin(request)
    folder_name = base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]
    message = folder[int(uid)]

    # Extract the relevant headers
    to_addr = mail_addr_str(message.envelope['env_from'][0])

    cc_addr = join_address_list(message.envelope['env_to'] +
                                message.envelope['env_cc'])

    subject = _('Re: ') + message.envelope['env_subject'].decode('utf-8')

    # Extract the message text
    text = ''
    for part in message.bodystructure.serial_message():
        if part.is_text() and part.test_plain():
            text += message.part(part)

    # Quote the message
    text = quote_wrap_lines(text)
    text = (mail_addr_name_str(message.envelope['env_from'][0]) +
            _(' wrote:\n') + text)

    # Invoque the compose message form
    return send_message(request,
                        text=text,
                        to_addr=to_addr,
                        cc_addr=cc_addr,
                        subject=subject)
示例#3
0
def show_folders_view(request):
    '''Show the account folders.
    '''
    # Login to the server:
    M = serverLogin(request)

    # Special folders
    # TODO: will get this from the user config
    M.set_special_folders('INBOX', 'INBOX.Drafts', 'INBOX.Templates')

    # Expandable folders
    expand_folders = request.user.folderstoexpand_set.all()
    if expand_folders:
        M.set_expand_list(*[f.folder_name for f in expand_folders])

    # Read the subscribed folder list:
    M.refresh_folders(subscribed=True)

    # Get the default identity
    config = WebpymailConfig(request)
    identity_list = config.identities()
    default_address = identity_list[0]['mail_address']

    return render_to_response('mail/folder_list.html', {
        'server': M,
        'address': default_address
    },
                              context_instance=RequestContext(request))
示例#4
0
def get_msg_part(request, folder, uid, part_number, inline=False):
    '''Gets a message part.
    '''
    folder_name = base64.urlsafe_b64decode(str(folder))

    M = serverLogin(request)
    folder = M[folder_name]
    message = folder[int(uid)]
    part = message.bodystructure.find_part(part_number)

    response = HttpResponse(content_type='%s/%s' %
                            (part.media, part.media_subtype))

    if part.filename():
        filename = part.filename()
    else:
        filename = _('Unknown')

    if inline:
        response['Content-Disposition'] = 'inline; filename=%s' % filename
    else:
        response['Content-Disposition'] = 'attachment; filename=%s' % filename

    if part.media.upper() == 'TEXT':
        response['Content-Type'] = '%s/%s; charset=%s' % (
            part.media, part.media_subtype, part.charset())
    else:
        response['Content-Type'] = '%s/%s' % (part.media, part.media_subtype)

    response.write(message.part(part))
    response.close()

    return response
示例#5
0
def imap_store(request, folder, message):
    '''
    Stores a message on an IMAP folder.
    '''
    M = serverLogin(request)
    folder = M[folder]
    folder.append(message.as_string())
示例#6
0
def forward_message(request, folder, uid):
    '''Reply to a message'''
    # Get the message
    M = serverLogin( request )
    folder_name =  base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]
    message = folder[int(uid)]

    # Create a temporary file
    fl = tempfile.mkstemp(suffix='.tmp', prefix='webpymail_',
        dir=settings.TEMPDIR)

    # Save message source to a file
    os.write( fl[0], message.source() )
    os.close(fl[0])

    # Add a entry to the Attachments table:
    attachment = Attachments(
        user = request.user,
        temp_file = fl[1],
        filename = 'attached_message',
        mime_type = 'MESSAGE/RFC822',
        sent = False )
    attachment.save()

    # Gather some message info
    subject = _('Fwd: ') + message.envelope['env_subject'].decode('utf-8')

    return send_message( request, subject=subject,
        attachments='%d' % attachment.id)
示例#7
0
def forward_message(request, folder, uid):
    '''Reply to a message'''
    # Get the message
    M = serverLogin(request)
    folder_name = base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]
    message = folder[int(uid)]

    # Create a temporary file
    fl = tempfile.mkstemp(suffix='.tmp',
                          prefix='webpymail_',
                          dir=settings.TEMPDIR)

    # Save message source to a file
    os.write(fl[0], message.source())
    os.close(fl[0])

    # Add a entry to the Attachments table:
    attachment = Attachments(user=request.user,
                             temp_file=fl[1],
                             filename='attached_message',
                             mime_type='MESSAGE/RFC822',
                             sent=False)
    attachment.save()

    # Gather some message info
    subject = _('Fwd: ') + message.envelope['env_subject'].decode('utf-8')

    return send_message(request,
                        subject=subject,
                        attachments='%d' % attachment.id)
示例#8
0
def imap_store( request, folder, message ):
    '''
    Stores a message on an IMAP folder.
    '''
    M = serverLogin( request )
    folder = M[folder]
    folder.append(message.as_string())
示例#9
0
def reply_all_message(request, folder, uid):
    '''Reply to a message'''
    # Get the message
    M = serverLogin( request )
    folder_name =  base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]
    message = folder[int(uid)]

    # Extract the relevant headers
    to_addr = mail_addr_str(message.envelope['env_from'][0])

    cc_addr =  join_address_list(message.envelope['env_to']+
        message.envelope['env_cc'])

    subject = _('Re: ') + message.envelope['env_subject'].decode('utf-8')

    # Extract the message text
    text = ''
    for part in message.bodystructure.serial_message():
        if part.is_text() and part.test_plain():
            text += message.part( part )

    # Quote the message
    text = quote_wrap_lines(text)
    text = (mail_addr_name_str(message.envelope['env_from'][0]) +
        _(' wrote:\n') + text)

    # Invoque the compose message form
    return send_message( request, text=text,  to_addr=to_addr, cc_addr=cc_addr,
                         subject=subject)
示例#10
0
def show_folders_view(request):
    '''Show the account folders.
    '''
    # Login to the server:
    M = serverLogin( request )

    # Special folders
    # TODO: will get this from the user config
    M.set_special_folders('INBOX', 'INBOX.Drafts', 'INBOX.Templates')

    # Expandable folders
    expand_folders = request.user.folderstoexpand_set.all()
    if expand_folders:
        M.set_expand_list(*[ f.folder_name for f in expand_folders ])

    # Read the subscribed folder list:
    M.refresh_folders(subscribed=True)

    # Get the default identity
    config =  WebpymailConfig( request )
    identity_list = config.identities()
    default_address = identity_list[0]['mail_address']

    return render_to_response('mail/folder_list.html',
        {'server': M,
         'address': default_address },
        context_instance=RequestContext(request))
示例#11
0
def show_message(request, folder, uid):
    '''Show the message
    '''
    config = WebpymailConfig(request)

    folder_name = base64.urlsafe_b64decode(str(folder))

    M = serverLogin(request)
    folder = M[folder_name]
    message = folder[int(uid)]

    # If it's a POST request
    if request.method == 'POST':
        try:
            msgactions.message_change(request, message)
        except hlimap.imapmessage.MessageNotFound:
            return redirect('message_list', folder=folder.url())

    return render_to_response(
        'mail/message_body.html', {
            'folder': folder,
            'message': message,
            'inline_img': config.getboolean('message', 'show_images_inline')
        },
        context_instance=RequestContext(request))
示例#12
0
def show_message_list_view(request, folder=settings.DEFAULT_FOLDER):
    '''Show the selected Folder message list.
    '''
    M = serverLogin(request)
    folder_name = base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]

    message_list = folder.message_list

    # Set the search criteria:
    search_criteria = 'ALL'
    query = None

    flag = request.GET.get('flag', None)

    if flag:
        query = 'flag=%s' % flag
        search_criteria = 'KEYWORD %s' % flag

    message_list.set_search_expression(search_criteria)
    message_list.refresh_messages()

    # Message action form
    raw_message_list = [(uid, uid) for uid in message_list.flat_message_list]
    form = MessageActionForm(data={}, message_list=raw_message_list, server=M)

    # If it's a POST request
    if request.method == 'POST':
        msgactions.batch_change(request, folder, raw_message_list)

    # Pagination
    message_list.paginator.msg_per_page = 40
    try:
        page = int(request.GET.get('page', 1))
    except:
        page = request.GET.get('page', 1)
        if page == 'all':
            message_list.paginator.msg_per_page = -1
        page = 1
    message_list.paginator.current_page = page
    message_list.add_messages_range()

    # Get the default identity
    config = WebpymailConfig(request)
    identity_list = config.identities()
    default_address = identity_list[0]['mail_address']

    # Show the message list
    return render_to_response('mail/message_list.html', {
        'folder': folder,
        'address': default_address,
        'paginator': folder.paginator(),
        'query': query,
        'form': form
    },
                              context_instance=RequestContext(request))
示例#13
0
def show_message_list_view(request, folder=settings.DEFAULT_FOLDER):
    '''Show the selected Folder message list.
    '''
    M = serverLogin( request )
    folder_name =  base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]

    message_list = folder.message_list

    # Set the search criteria:
    search_criteria = 'ALL'
    query = None

    flag = request.GET.get('flag', None)

    if flag:
        query = 'flag=%s' % flag
        search_criteria = 'KEYWORD %s' % flag

    message_list.set_search_expression(search_criteria)
    message_list.refresh_messages()

    # Message action form
    raw_message_list = [ (uid,uid) for uid in message_list.flat_message_list ]
    form = MessageActionForm(data={}, message_list=raw_message_list, server=M)

    # If it's a POST request
    if request.method == 'POST':
        msgactions.batch_change( request, folder, raw_message_list )

    # Pagination
    message_list.paginator.msg_per_page = 40
    try:
        page = int(request.GET.get('page',1))
    except:
        page = request.GET.get('page',1)
        if page == 'all':
            message_list.paginator.msg_per_page = -1
        page = 1
    message_list.paginator.current_page = page
    message_list.add_messages_range()

    # Get the default identity
    config =  WebpymailConfig( request )
    identity_list = config.identities()
    default_address = identity_list[0]['mail_address']

    # Show the message list
    return render_to_response( 'mail/message_list.html',{
            'folder':folder,
            'address': default_address,
            'paginator': folder.paginator(),
            'query':query,
            'form':form },
            context_instance=RequestContext(request))
示例#14
0
def message_structure( request, folder, uid ):
    '''Show the message header
    '''
    folder_name =  base64.urlsafe_b64decode(str(folder))

    M = serverLogin( request )
    folder = M[folder_name]
    message = folder[int(uid)]

    return render_to_response('mail/message_structure.html',{'folder':folder,
        'message':message},
        context_instance=RequestContext(request))
示例#15
0
def message_structure(request, folder, uid):
    '''Show the message header
    '''
    folder_name = base64.urlsafe_b64decode(str(folder))

    M = serverLogin(request)
    folder = M[folder_name]
    message = folder[int(uid)]

    return render_to_response('mail/message_structure.html', {
        'folder': folder,
        'message': message
    },
                              context_instance=RequestContext(request))
示例#16
0
def message_source( request, folder, uid ):
    '''Show the message header
    '''
    folder_name =  base64.urlsafe_b64decode(str(folder))

    M = serverLogin( request )
    folder = M[folder_name]
    message = folder[int(uid)]
    # Assume that we have a single byte encoded string, this is because there
    # can be several different files with different encodings within the same
    # message.
    source = unicode(message.source(),'ISO-8859-1')

    return render_to_response('mail/message_source.html',{'folder':folder,
        'message':message, 'source': source },
        context_instance=RequestContext(request))
示例#17
0
def message_source(request, folder, uid):
    '''Show the message header
    '''
    folder_name = base64.urlsafe_b64decode(str(folder))

    M = serverLogin(request)
    folder = M[folder_name]
    message = folder[int(uid)]
    # Assume that we have a single byte encoded string, this is because there
    # can be several different files with different encodings within the same
    # message.
    source = unicode(message.source(), 'ISO-8859-1')

    return render_to_response('mail/message_source.html', {
        'folder': folder,
        'message': message,
        'source': source
    },
                              context_instance=RequestContext(request))
示例#18
0
def show_message(request, folder, uid):
    '''Show the message
    '''
    config = WebpymailConfig( request )

    folder_name =  base64.urlsafe_b64decode(str(folder))

    M = serverLogin( request )
    folder = M[folder_name]
    message = folder[int(uid)]

    # If it's a POST request
    if request.method == 'POST':
        try:
            msgactions.message_change( request, message )
        except hlimap.imapmessage.MessageNotFound:
            return redirect('message_list', folder=folder.url() )

    return render_to_response('mail/message_body.html',{'folder':folder,
        'message':message,
        'inline_img': config.getboolean('message', 'show_images_inline')},
        context_instance=RequestContext(request))
示例#19
0
def forward_message_inline(request, folder, uid):
    '''Reply to a message'''
    def message_header(message):
        text = ''
        text += show_addrs(_('From'), message.envelope['env_from'],
                           _('Unknown'))
        text += show_addrs(_('To'), message.envelope['env_to'], _('-'))
        text += show_addrs(_('Cc'), message.envelope['env_cc'], _('-'))
        text += _('Date: ') + message.envelope['env_date'].strftime(
            '%Y-%m-%d %H:%M') + '\n'
        text += _('Subject: ') + message.envelope['env_subject'].decode(
            'utf-8') + '\n\n'

        return text

    # Get the message
    M = serverLogin(request)
    folder_name = base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]
    message = folder[int(uid)]

    # Extract the message text
    text = ''
    text += '\n\n' + _('Forwarded Message').center(40, '-') + '\n'
    text += message_header(message)

    for part in message.bodystructure.serial_message():
        if part.is_text() and part.test_plain() and not part.is_attachment():
            text += message.part(part)

        if part.is_encapsulated():
            if part.is_start():
                text += '\n\n' + _('Encapsuplated Message').center(40,
                                                                   '-') + '\n'
                text += message_header(part)
            else:
                text += '\n' + _('End Encapsuplated Message').center(
                    40, '-') + '\n'
    text += '\n' + _('End Forwarded Message').center(40, '-') + '\n'

    # Extract the message attachments
    attach_list = []
    for part in message.bodystructure.serial_message():
        if part.is_attachment() and not part.is_encapsulated():
            # Create a temporary file
            fl = tempfile.mkstemp(suffix='.tmp',
                                  prefix='webpymail_',
                                  dir=settings.TEMPDIR)

            # Save message source to a file
            os.write(fl[0], message.part(part, decode_text=False))
            os.close(fl[0])

            # Add a entry to the Attachments table:
            attachment = Attachments(
                user=request.user,
                temp_file=fl[1],
                filename=part.filename() if part.filename() else _('Unknown'),
                mime_type='%s/%s' % (part.media, part.media_subtype),
                content_desc=part.body_fld_desc if part.body_fld_desc else '',
                content_id=part.body_fld_id if part.body_fld_id else '',
                show_inline=False
                if part.body_fld_dsp[0].upper() == 'ATTACHMENT' else True,
                sent=False)
            attachment.save()
            attach_list.append(attachment.id)

    # Gather some message info
    subject = _('Fwd: ') + message.envelope['env_subject'].decode('utf-8')

    return send_message(request,
                        subject=subject,
                        text=text,
                        attachments=','.join(['%d' % Xi
                                              for Xi in attach_list]))
示例#20
0
def forward_message_inline(request, folder, uid):
    '''Reply to a message'''
    def message_header( message ):
        text = ''
        text += show_addrs( _('From'), message.envelope['env_from'],
        _('Unknown') )
        text += show_addrs( _('To'), message.envelope['env_to'], _('-') )
        text += show_addrs( _('Cc'), message.envelope['env_cc'], _('-') )
        text += _('Date: ') + message.envelope['env_date'].strftime('%Y-%m-%d %H:%M') + '\n'
        text += _('Subject: ') + message.envelope['env_subject'].decode('utf-8') + '\n\n'

        return text

    # Get the message
    M = serverLogin( request )
    folder_name =  base64.urlsafe_b64decode(str(folder))
    folder = M[folder_name]
    message = folder[int(uid)]

    # Extract the message text
    text = ''
    text += '\n\n' + _('Forwarded Message').center(40,'-') + '\n'
    text += message_header( message )

    for part in message.bodystructure.serial_message():
        if part.is_text() and part.test_plain() and not part.is_attachment():
            text += message.part( part )

        if part.is_encapsulated():
            if part.is_start():
                text += '\n\n' + _('Encapsuplated Message').center(40,'-') + '\n'
                text += message_header( part )
            else:
                text += '\n' + _('End Encapsuplated Message').center(40,'-') + '\n'
    text += '\n' + _('End Forwarded Message').center(40,'-') + '\n'

    # Extract the message attachments
    attach_list = []
    for part in message.bodystructure.serial_message():
        if part.is_attachment() and not part.is_encapsulated():
            # Create a temporary file
            fl = tempfile.mkstemp(suffix='.tmp', prefix='webpymail_',
                dir=settings.TEMPDIR)

            # Save message source to a file
            os.write( fl[0], message.part(part, decode_text = False) )
            os.close(fl[0])

            # Add a entry to the Attachments table:
            attachment = Attachments(
                user = request.user,
                temp_file = fl[1],
                filename = part.filename() if part.filename() else  _('Unknown'),
                mime_type = '%s/%s' % (part.media, part.media_subtype),
                content_desc = part.body_fld_desc if part.body_fld_desc else '',
                content_id = part.body_fld_id if part.body_fld_id else '',
                show_inline = False if part.body_fld_dsp[0].upper() == 'ATTACHMENT' else True,
                sent = False )
            attachment.save()
            attach_list.append(attachment.id)

    # Gather some message info
    subject = _('Fwd: ') + message.envelope['env_subject'].decode('utf-8')

    return send_message( request, subject=subject, text = text,
        attachments=','.join([ '%d' % Xi for Xi in attach_list ]) )