~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/mail_client.py

  • Committer: Patch Queue Manager
  • Date: 2016-04-21 04:10:52 UTC
  • mfrom: (6616.1.1 fix-en-user-guide)
  • Revision ID: pqm@pqm.ubuntu.com-20160421041052-clcye7ns1qcl2n7w
(richard-wilbur) Ensure build of English use guide always uses English text
 even when user's locale specifies a different language. (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 Canonical Ltd
 
1
# Copyright (C) 2007-2010 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
from __future__ import absolute_import
 
18
 
17
19
import errno
18
20
import os
19
21
import subprocess
20
22
import sys
21
23
import tempfile
22
 
import urllib
23
24
 
24
25
import bzrlib
25
26
from bzrlib import (
 
27
    config as _mod_config,
26
28
    email_message,
27
29
    errors,
28
30
    msgeditor,
89
91
 
90
92
 
91
93
class Editor(MailClient):
92
 
    """DIY mail client that uses commit message editor"""
 
94
    __doc__ = """DIY mail client that uses commit message editor"""
93
95
 
94
96
    supports_body = True
95
97
 
110
112
        if body == '':
111
113
            raise errors.NoMessageSupplied()
112
114
        email_message.EmailMessage.send(self.config,
113
 
                                        self.config.username(),
 
115
                                        self.config.get('email'),
114
116
                                        to,
115
117
                                        subject,
116
118
                                        body,
230
232
 
231
233
 
232
234
class ExternalMailClient(BodyExternalMailClient):
233
 
    """An external mail client."""
 
235
    __doc__ = """An external mail client."""
234
236
 
235
237
    supports_body = False
236
238
 
237
239
 
238
240
class Evolution(BodyExternalMailClient):
239
 
    """Evolution mail client."""
 
241
    __doc__ = """Evolution mail client."""
240
242
 
241
243
    _client_commands = ['evolution']
242
244
 
258
260
 
259
261
 
260
262
class Mutt(BodyExternalMailClient):
261
 
    """Mutt mail client."""
 
263
    __doc__ = """Mutt mail client."""
262
264
 
263
265
    _client_commands = ['mutt']
264
266
 
286
288
 
287
289
 
288
290
class Thunderbird(BodyExternalMailClient):
289
 
    """Mozilla Thunderbird (or Icedove)
 
291
    __doc__ = """Mozilla Thunderbird (or Icedove)
290
292
 
291
293
    Note that Thunderbird 1.5 is buggy and does not support setting
292
294
    "to" simultaneously with including a attachment.
310
312
            message_options['attachment'] = urlutils.local_path_to_url(
311
313
                attach_path)
312
314
        if body is not None:
313
 
            options_list = ['body=%s' % urllib.quote(self._encode_safe(body))]
 
315
            options_list = ['body=%s' % urlutils.quote(self._encode_safe(body))]
314
316
        else:
315
317
            options_list = []
316
318
        options_list.extend(["%s='%s'" % (k, v) for k, v in
321
323
 
322
324
 
323
325
class KMail(ExternalMailClient):
324
 
    """KDE mail client."""
 
326
    __doc__ = """KDE mail client."""
325
327
 
326
328
    _client_commands = ['kmail']
327
329
 
341
343
 
342
344
 
343
345
class Claws(ExternalMailClient):
344
 
    """Claws mail client."""
 
346
    __doc__ = """Claws mail client."""
345
347
 
346
348
    supports_body = True
347
349
 
352
354
        """See ExternalMailClient._get_compose_commandline"""
353
355
        compose_url = []
354
356
        if from_ is not None:
355
 
            compose_url.append('from=' + urllib.quote(from_))
 
357
            compose_url.append('from=' + urlutils.quote(from_))
356
358
        if subject is not None:
357
 
            # Don't use urllib.quote_plus because Claws doesn't seem
 
359
            # Don't use urlutils.quote_plus because Claws doesn't seem
358
360
            # to recognise spaces encoded as "+".
359
361
            compose_url.append(
360
 
                'subject=' + urllib.quote(self._encode_safe(subject)))
 
362
                'subject=' + urlutils.quote(self._encode_safe(subject)))
361
363
        if body is not None:
362
364
            compose_url.append(
363
 
                'body=' + urllib.quote(self._encode_safe(body)))
 
365
                'body=' + urlutils.quote(self._encode_safe(body)))
364
366
        # to must be supplied for the claws-mail --compose syntax to work.
365
367
        if to is None:
366
368
            raise errors.NoMailAddressSpecified()
377
379
                 extension, body=None, from_=None):
378
380
        """See ExternalMailClient._compose"""
379
381
        if from_ is None:
380
 
            from_ = self.config.get_user_option('email')
 
382
            from_ = self.config.get('email')
381
383
        super(Claws, self)._compose(prompt, to, subject, attach_path,
382
384
                                    mime_subtype, extension, body, from_)
383
385
 
387
389
 
388
390
 
389
391
class XDGEmail(BodyExternalMailClient):
390
 
    """xdg-email attempts to invoke the user's preferred mail client"""
 
392
    __doc__ = """xdg-email attempts to invoke the user's preferred mail client"""
391
393
 
392
394
    _client_commands = ['xdg-email']
393
395
 
409
411
 
410
412
 
411
413
class EmacsMail(ExternalMailClient):
412
 
    """Call emacsclient to have a mail buffer.
 
414
    __doc__ = """Call emacsclient to have a mail buffer.
413
415
 
414
416
    This only work for emacs >= 22.1 due to recent -e/--eval support.
415
417
 
519
521
 
520
522
 
521
523
class MAPIClient(BodyExternalMailClient):
522
 
    """Default Windows mail client launched using MAPI."""
 
524
    __doc__ = """Default Windows mail client launched using MAPI."""
523
525
 
524
526
    def _compose(self, prompt, to, subject, attach_path, mime_subtype,
525
527
                 extension, body=None):
540
542
 
541
543
 
542
544
class MailApp(BodyExternalMailClient):
543
 
    """Use MacOS X's Mail.app for sending email messages.
 
545
    __doc__ = """Use MacOS X's Mail.app for sending email messages.
544
546
 
545
547
    Although it would be nice to use appscript, it's not installed
546
548
    with the shipped Python installations.  We instead build an
599
601
 
600
602
 
601
603
class DefaultMail(MailClient):
602
 
    """Default mail handling.  Tries XDGEmail (or MAPIClient on Windows),
 
604
    __doc__ = """Default mail handling.  Tries XDGEmail (or MAPIClient on Windows),
603
605
    falls back to Editor"""
604
606
 
605
607
    supports_body = True
616
618
        """See MailClient.compose"""
617
619
        try:
618
620
            return self._mail_client().compose(prompt, to, subject,
619
 
                                               attachment, mimie_subtype,
 
621
                                               attachment, mime_subtype,
620
622
                                               extension, basename, body)
621
623
        except errors.MailClientNotFound:
622
624
            return Editor(self.config).compose(prompt, to, subject,
623
 
                          attachment, mimie_subtype, extension, body)
 
625
                          attachment, mime_subtype, extension, body)
624
626
 
625
627
    def compose_merge_request(self, to, subject, directive, basename=None,
626
628
                              body=None):
635
637
                              help=DefaultMail.__doc__)
636
638
mail_client_registry.default_key = 'default'
637
639
 
638
 
 
 
640
opt_mail_client = _mod_config.RegistryOption('mail_client',
 
641
        mail_client_registry, help='E-mail client to use.', invalid='error')