summaryrefslogtreecommitdiff
path: root/alot/mail
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2021-01-30 16:42:23 +0100
committerAnton Khirnov <anton@khirnov.net>2021-01-30 16:42:23 +0100
commit10135f6d1563ccd01c9afc90613f7dd16ca4c541 (patch)
treeedc64134cb6d5f1414033368226fb81c0a1580a9 /alot/mail
parent309fb25e9b089618c37f1a741fa6009cce54ac9e (diff)
db/attachment: move to mail/
It has nothing whatsoever to do with the database.
Diffstat (limited to 'alot/mail')
-rw-r--r--alot/mail/attachment.py56
-rw-r--r--alot/mail/envelope.py13
2 files changed, 62 insertions, 7 deletions
diff --git a/alot/mail/attachment.py b/alot/mail/attachment.py
new file mode 100644
index 00000000..5c993a68
--- /dev/null
+++ b/alot/mail/attachment.py
@@ -0,0 +1,56 @@
+# Copyright (C) 2011-2012 Patrick Totzke <patricktotzke@gmail.com>
+# Copyright © 2018 Dylan Baker
+# This file is released under the GNU GPL, version 3 or a later revision.
+# For further details see the COPYING file
+
+import os.path
+
+def _humanize_size(size):
+ """Create a nice human readable representation of the given number
+ (understood as bytes) using the "KiB" and "MiB" suffixes to indicate
+ kibibytes and mebibytes. A kibibyte is defined as 1024 bytes (as opposed to
+ a kilobyte which is 1000 bytes) and a mibibyte is 1024**2 bytes (as opposed
+ to a megabyte which is 1000**2 bytes).
+
+ :param size: the number to convert
+ :type size: int
+ :returns: the human readable representation of size
+ :rtype: str
+ """
+ for factor, format_string in ((1, '%i'),
+ (1024, '%iKiB'),
+ (1024 * 1024, '%.1fMiB')):
+ if size / factor < 1024:
+ return format_string % (size / factor)
+ return format_string % (size / factor)
+
+
+
+class Attachment:
+ """represents a mail attachment"""
+
+ data = None
+ content_type = None
+ filename = None
+ params = None
+
+ def __init__(self, data, ctype, filename, params):
+ self.data = data
+ self.content_type = ctype
+ self.params = params
+
+ # make sure the filename is a relative path
+ # that does not go upwards
+ filename = os.path.normpath(filename)
+ if filename.startswith('/') or filename.startswith('..'):
+ raise ValueError('Dangerous attachment filename: %s' % filename)
+
+ self.filename = filename
+
+ def __str__(self):
+ ret = self.content_type
+ if self.filename:
+ ret += ':' + self.filename
+ ret += ' (%s)' % _humanize_size(len(self.data))
+
+ return ret
diff --git a/alot/mail/envelope.py b/alot/mail/envelope.py
index 540c0342..db907340 100644
--- a/alot/mail/envelope.py
+++ b/alot/mail/envelope.py
@@ -14,7 +14,7 @@ from urllib.parse import unquote
import gpg
import magic
-from ..db.attachment import Attachment
+from .attachment import Attachment
from .. import __version__
from .. import helper
from .. import crypto
@@ -99,7 +99,7 @@ class Envelope:
tmpfile = None
"""template text for initial content"""
attachments = None
- """list of :class:`Attachments <alot.db.attachment.Attachment>`"""
+ """list of :class:`Attachments <alot.mail.attachment.Attachment>`"""
tags = None
"""tags to add after successful sendout"""
account = None
@@ -119,7 +119,7 @@ class Envelope:
:param headers: unencoded header values
:type headers: dict (str -> [unicode])
:param attachments: file attachments to include
- :type attachments: list of :class:`~alot.db.attachment.Attachment`
+ :type attachments: list of :class:`~alot.mail.attachment.Attachment`
:param tags: tags to add after successful sendout and saving this msg
:type tags: set of str
:param replied: message being replied to
@@ -231,11 +231,10 @@ class Envelope:
def attach(self, attachment):
"""
- attach a file
+ attach data
- :param attachment: File to attach, given as
- :class:`~alot.db.attachment.Attachment` object
- :type attachment: :class:`~alot.db.attachment.Attachment`
+ :param attachment: data to attach
+ :type attachment: :class:`~alot.mail.attachment.Attachment`
"""
self.attachments.append(attachment)
if self.sent_time: