/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/mail_client.py

  • Committer: Aaron Bentley
  • Date: 2007-08-10 00:03:44 UTC
  • mto: (2681.5.3 bzr-mail)
  • mto: This revision was merged to the branch mainline in revision 2736.
  • Revision ID: aaron.bentley@utoronto.ca-20070810000344-cyfuo1igj88pwb2s
Refactor to increase code sharing, allow multiple command names for tbird

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
 
17
import errno
17
18
import os
18
19
import subprocess
19
20
import tempfile
60
61
                                        attachment_mime_subtype=mime_subtype)
61
62
 
62
63
 
63
 
class Thunderbird(MailClient):
 
64
class Evolution(MailClient):
 
65
    """Evolution mail client."""
 
66
 
 
67
    _client_commands = ['evolution']
 
68
 
 
69
    def compose(self, prompt, to, subject, attachment, mime_subtype,
 
70
                extension):
 
71
        fd, pathname = tempfile.mkstemp(extension, 'bzr-mail-')
 
72
        try:
 
73
            os.write(fd, attachment)
 
74
        finally:
 
75
            os.close(fd)
 
76
        for name in self._client_commands:
 
77
            cmdline = [name]
 
78
            cmdline.extend(self._get_compose_commandline(to, subject,
 
79
                                                         pathname))
 
80
            try:
 
81
                subprocess.call(cmdline)
 
82
            except OSError, e:
 
83
                if e.errno != errno.ENOENT:
 
84
                    raise
 
85
            else:
 
86
                break
 
87
        else:
 
88
            raise errors.MailClientNotFound(self._client_commands)
 
89
 
 
90
    def _get_compose_commandline(self, to, subject, attach_path):
 
91
        message_options = {}
 
92
        if subject is not None:
 
93
            message_options['subject'] = subject
 
94
        if attach_path is not None:
 
95
            message_options['attach'] = attach_path
 
96
        options_list = ['%s=%s' % (k, urlutils.escape(v)) for (k, v) in
 
97
                        message_options.iteritems()]
 
98
        return ['mailto:%s?%s' % (to or '', '&'.join(options_list))]
 
99
 
 
100
 
 
101
class Thunderbird(Evolution):
64
102
    """Mozilla Thunderbird (or Icedove)
65
103
 
66
104
    Note that Thunderbird 1.5 is buggy and does not support setting
70
108
    send attachments.
71
109
    """
72
110
 
73
 
    def compose(self, prompt, to, subject, attachment, mime_subtype,
74
 
                extension):
75
 
        fd, pathname = tempfile.mkstemp(extension, 'bzr-mail-')
76
 
        try:
77
 
            os.write(fd, attachment)
78
 
        finally:
79
 
            os.close(fd)
80
 
        cmdline = ['thunderbird']
81
 
        cmdline.extend(self._get_compose_commandline(to, subject, pathname))
82
 
        subprocess.call(cmdline)
 
111
    _client_commands = ['thunderbird', 'mozilla-thunderbird', 'icedove']
83
112
 
84
113
    def _get_compose_commandline(self, to, subject, attach_path):
85
114
        message_options = {}
93
122
        options_list = ["%s='%s'" % (k, v) for k, v in
94
123
                        sorted(message_options.iteritems())]
95
124
        return ['-compose', ','.join(options_list)]
96
 
 
97
 
 
98
 
class Evolution(MailClient):
99
 
    """Evolution mail client."""
100
 
 
101
 
    def compose(self, prompt, to, subject, attachment, mime_subtype,
102
 
                extension):
103
 
        fd, pathname = tempfile.mkstemp(extension, 'bzr-mail-')
104
 
        try:
105
 
            os.write(fd, attachment)
106
 
        finally:
107
 
            os.close(fd)
108
 
        cmdline = ['evolution']
109
 
        cmdline.append(self._get_compose_commandline(to, subject, pathname))
110
 
        subprocess.call(cmdline)
111
 
 
112
 
    def _get_compose_commandline(self, to, subject, attach_path):
113
 
        message_options = {}
114
 
        if subject is not None:
115
 
            message_options['subject'] = subject
116
 
        if attach_path is not None:
117
 
            message_options['attach'] = attach_path
118
 
        options_list = ['%s=%s' % (k, urlutils.escape(v)) for (k, v) in
119
 
                        message_options.iteritems()]
120
 
        return 'mailto:%s?%s' % (to or '', '&'.join(options_list))