~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/mail_client.py

  • Committer: Martin
  • Date: 2010-05-25 17:27:52 UTC
  • mfrom: (5254 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5257.
  • Revision ID: gzlist@googlemail.com-20100525172752-amm089xcikv968sw
Merge bzr.dev to unite with similar changes already made

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
89
89
 
90
90
 
91
91
class Editor(MailClient):
92
 
    """DIY mail client that uses commit message editor"""
 
92
    __doc__ = """DIY mail client that uses commit message editor"""
93
93
 
94
94
    supports_body = True
95
95
 
230
230
 
231
231
 
232
232
class ExternalMailClient(BodyExternalMailClient):
233
 
    """An external mail client."""
 
233
    __doc__ = """An external mail client."""
234
234
 
235
235
    supports_body = False
236
236
 
237
237
 
238
238
class Evolution(BodyExternalMailClient):
239
 
    """Evolution mail client."""
 
239
    __doc__ = """Evolution mail client."""
240
240
 
241
241
    _client_commands = ['evolution']
242
242
 
258
258
 
259
259
 
260
260
class Mutt(BodyExternalMailClient):
261
 
    """Mutt mail client."""
 
261
    __doc__ = """Mutt mail client."""
262
262
 
263
263
    _client_commands = ['mutt']
264
264
 
286
286
 
287
287
 
288
288
class Thunderbird(BodyExternalMailClient):
289
 
    """Mozilla Thunderbird (or Icedove)
 
289
    __doc__ = """Mozilla Thunderbird (or Icedove)
290
290
 
291
291
    Note that Thunderbird 1.5 is buggy and does not support setting
292
292
    "to" simultaneously with including a attachment.
321
321
 
322
322
 
323
323
class KMail(ExternalMailClient):
324
 
    """KDE mail client."""
 
324
    __doc__ = """KDE mail client."""
325
325
 
326
326
    _client_commands = ['kmail']
327
327
 
341
341
 
342
342
 
343
343
class Claws(ExternalMailClient):
344
 
    """Claws mail client."""
 
344
    __doc__ = """Claws mail client."""
345
345
 
346
346
    supports_body = True
347
347
 
387
387
 
388
388
 
389
389
class XDGEmail(BodyExternalMailClient):
390
 
    """xdg-email attempts to invoke the user's preferred mail client"""
 
390
    __doc__ = """xdg-email attempts to invoke the user's preferred mail client"""
391
391
 
392
392
    _client_commands = ['xdg-email']
393
393
 
409
409
 
410
410
 
411
411
class EmacsMail(ExternalMailClient):
412
 
    """Call emacsclient to have a mail buffer.
 
412
    __doc__ = """Call emacsclient to have a mail buffer.
413
413
 
414
414
    This only work for emacs >= 22.1 due to recent -e/--eval support.
415
415
 
519
519
 
520
520
 
521
521
class MAPIClient(BodyExternalMailClient):
522
 
    """Default Windows mail client launched using MAPI."""
 
522
    __doc__ = """Default Windows mail client launched using MAPI."""
523
523
 
524
524
    def _compose(self, prompt, to, subject, attach_path, mime_subtype,
525
525
                 extension, body=None):
539
539
                              help=MAPIClient.__doc__)
540
540
 
541
541
 
 
542
class MailApp(BodyExternalMailClient):
 
543
    __doc__ = """Use MacOS X's Mail.app for sending email messages.
 
544
 
 
545
    Although it would be nice to use appscript, it's not installed
 
546
    with the shipped Python installations.  We instead build an
 
547
    AppleScript and invoke the script using osascript(1).  We don't
 
548
    use the _encode_safe() routines as it's not clear what encoding
 
549
    osascript expects the script to be in.
 
550
    """
 
551
 
 
552
    _client_commands = ['osascript']
 
553
 
 
554
    def _get_compose_commandline(self, to, subject, attach_path, body=None,
 
555
                                from_=None):
 
556
       """See ExternalMailClient._get_compose_commandline"""
 
557
 
 
558
       fd, self.temp_file = tempfile.mkstemp(prefix="bzr-send-",
 
559
                                         suffix=".scpt")
 
560
       try:
 
561
           os.write(fd, 'tell application "Mail"\n')
 
562
           os.write(fd, 'set newMessage to make new outgoing message\n')
 
563
           os.write(fd, 'tell newMessage\n')
 
564
           if to is not None:
 
565
               os.write(fd, 'make new to recipient with properties'
 
566
                   ' {address:"%s"}\n' % to)
 
567
           if from_ is not None:
 
568
               # though from_ doesn't actually seem to be used
 
569
               os.write(fd, 'set sender to "%s"\n'
 
570
                   % sender.replace('"', '\\"'))
 
571
           if subject is not None:
 
572
               os.write(fd, 'set subject to "%s"\n'
 
573
                   % subject.replace('"', '\\"'))
 
574
           if body is not None:
 
575
               # FIXME: would be nice to prepend the body to the
 
576
               # existing content (e.g., preserve signature), but
 
577
               # can't seem to figure out the right applescript
 
578
               # incantation.
 
579
               os.write(fd, 'set content to "%s\\n\n"\n' %
 
580
                   body.replace('"', '\\"').replace('\n', '\\n'))
 
581
 
 
582
           if attach_path is not None:
 
583
               # FIXME: would be nice to first append a newline to
 
584
               # ensure the attachment is on a new paragraph, but
 
585
               # can't seem to figure out the right applescript
 
586
               # incantation.
 
587
               os.write(fd, 'tell content to make new attachment'
 
588
                   ' with properties {file name:"%s"}'
 
589
                   ' at after the last paragraph\n'
 
590
                   % self._encode_path(attach_path, 'attachment'))
 
591
           os.write(fd, 'set visible to true\n')
 
592
           os.write(fd, 'end tell\n')
 
593
           os.write(fd, 'end tell\n')
 
594
       finally:
 
595
           os.close(fd) # Just close the handle but do not remove the file.
 
596
       return [self.temp_file]
 
597
mail_client_registry.register('mail.app', MailApp,
 
598
                              help=MailApp.__doc__)
 
599
 
 
600
 
542
601
class DefaultMail(MailClient):
543
 
    """Default mail handling.  Tries XDGEmail (or MAPIClient on Windows),
 
602
    __doc__ = """Default mail handling.  Tries XDGEmail (or MAPIClient on Windows),
544
603
    falls back to Editor"""
545
604
 
546
605
    supports_body = True
575
634
mail_client_registry.register('default', DefaultMail,
576
635
                              help=DefaultMail.__doc__)
577
636
mail_client_registry.default_key = 'default'
 
637
 
 
638