~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/mail_client.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-04-09 20:23:07 UTC
  • mfrom: (4265.1.4 bbc-merge)
  • Revision ID: pqm@pqm.ubuntu.com-20090409202307-n0depb16qepoe21o
(jam) Change _fetch_uses_deltas = False for CHK repos until we can
        write a better fix.

Show diffs side-by-side

added added

removed removed

Lines of Context:
155
155
                      extension, **kwargs)
156
156
 
157
157
    def _compose(self, prompt, to, subject, attach_path, mime_subtype,
158
 
                 extension, body=None, from_=None):
 
158
                extension, body=None):
159
159
        """Invoke a mail client as a commandline process.
160
160
 
161
161
        Overridden by MAPIClient.
166
166
            "text", but the precise subtype can be specified here
167
167
        :param extension: A file extension (including period) associated with
168
168
            the attachment type.
169
 
        :param body: Optional body text.
170
 
        :param from_: Optional From: header.
171
169
        """
172
170
        for name in self._get_client_commands():
173
171
            cmdline = [self._encode_path(name, 'executable')]
175
173
                kwargs = {'body': body}
176
174
            else:
177
175
                kwargs = {}
178
 
            if from_ is not None:
179
 
                kwargs['from_'] = from_
180
176
            cmdline.extend(self._get_compose_commandline(to, subject,
181
177
                                                         attach_path,
182
178
                                                         **kwargs))
257
253
                              help=Evolution.__doc__)
258
254
 
259
255
 
260
 
class Mutt(BodyExternalMailClient):
 
256
class Mutt(ExternalMailClient):
261
257
    """Mutt mail client."""
262
258
 
263
259
    _client_commands = ['mutt']
264
260
 
265
 
    def _get_compose_commandline(self, to, subject, attach_path, body=None):
 
261
    def _get_compose_commandline(self, to, subject, attach_path):
266
262
        """See ExternalMailClient._get_compose_commandline"""
267
263
        message_options = []
268
264
        if subject is not None:
270
266
        if attach_path is not None:
271
267
            message_options.extend(['-a',
272
268
                self._encode_path(attach_path, 'attachment')])
273
 
        if body is not None:
274
 
            # Store the temp file object in self, so that it does not get
275
 
            # garbage collected and delete the file before mutt can read it.
276
 
            self._temp_file = tempfile.NamedTemporaryFile(
277
 
                prefix="mutt-body-", suffix=".txt")
278
 
            self._temp_file.write(body)
279
 
            self._temp_file.flush()
280
 
            message_options.extend(['-i', self._temp_file.name])
281
269
        if to is not None:
282
 
            message_options.extend(['--', self._encode_safe(to)])
 
270
            message_options.append(self._encode_safe(to))
283
271
        return message_options
284
272
mail_client_registry.register('mutt', Mutt,
285
273
                              help=Mutt.__doc__)
343
331
class Claws(ExternalMailClient):
344
332
    """Claws mail client."""
345
333
 
346
 
    supports_body = True
347
 
 
348
334
    _client_commands = ['claws-mail']
349
335
 
350
 
    def _get_compose_commandline(self, to, subject, attach_path, body=None,
351
 
                                 from_=None):
 
336
    def _get_compose_commandline(self, to, subject, attach_path):
352
337
        """See ExternalMailClient._get_compose_commandline"""
353
 
        compose_url = []
354
 
        if from_ is not None:
355
 
            compose_url.append('from=' + urllib.quote(from_))
 
338
        compose_url = ['mailto:']
 
339
        if to is not None:
 
340
            compose_url.append(self._encode_safe(to))
 
341
        compose_url.append('?')
356
342
        if subject is not None:
357
343
            # Don't use urllib.quote_plus because Claws doesn't seem
358
344
            # to recognise spaces encoded as "+".
359
345
            compose_url.append(
360
 
                'subject=' + urllib.quote(self._encode_safe(subject)))
361
 
        if body is not None:
362
 
            compose_url.append(
363
 
                'body=' + urllib.quote(self._encode_safe(body)))
364
 
        # to must be supplied for the claws-mail --compose syntax to work.
365
 
        if to is None:
366
 
            raise errors.NoMailAddressSpecified()
367
 
        compose_url = 'mailto:%s?%s' % (
368
 
            self._encode_safe(to), '&'.join(compose_url))
 
346
                'subject=%s' % urllib.quote(self._encode_safe(subject)))
369
347
        # Collect command-line options.
370
 
        message_options = ['--compose', compose_url]
 
348
        message_options = ['--compose', ''.join(compose_url)]
371
349
        if attach_path is not None:
372
350
            message_options.extend(
373
351
                ['--attach', self._encode_path(attach_path, 'attachment')])
374
352
        return message_options
375
 
 
376
 
    def _compose(self, prompt, to, subject, attach_path, mime_subtype,
377
 
                 extension, body=None, from_=None):
378
 
        """See ExternalMailClient._compose"""
379
 
        if from_ is None:
380
 
            from_ = self.config.get_user_option('email')
381
 
        super(Claws, self)._compose(prompt, to, subject, attach_path,
382
 
                                    mime_subtype, extension, body, from_)
383
 
 
384
 
 
385
353
mail_client_registry.register('claws', Claws,
386
354
                              help=Claws.__doc__)
387
355
 
517
485
    """Default Windows mail client launched using MAPI."""
518
486
 
519
487
    def _compose(self, prompt, to, subject, attach_path, mime_subtype,
520
 
                 extension, body=None):
 
488
                 extension, body):
521
489
        """See ExternalMailClient._compose.
522
490
 
523
491
        This implementation uses MAPI via the simplemapi ctypes wrapper
538
506
    """Default mail handling.  Tries XDGEmail (or MAPIClient on Windows),
539
507
    falls back to Editor"""
540
508
 
541
 
    supports_body = True
542
 
 
543
509
    def _mail_client(self):
544
510
        """Determine the preferred mail client for this platform"""
545
511
        if osutils.supports_mapi():