Subject: [sup-talk] sent_source - singular or per-account?

From: [email-masked] (Jim Cheetham)
Date: Wed, 1 Jul 2009 21:48:30 +1200

It looks like there is only one place that outbound mail can be stored
-- sent_source in config.yaml specifies it globally.

I'd like to be able to save outgoing email into the mailstore for the
matching account; can anyone suggest some way to do this? Hacking code
is an option, although I'd appreciate some pointers ...

---

From: [email-masked] (Ben Walton)
Date: Wed, 01 Jul 2009 15:39:57 -0400

> is an option, although I'd appreciate some pointers ...

This is an interesting idea.  I think the best way to do it might be
to implement a sent_source hook that can override the global default.
It would be wise to either a) not use mbox or b) have dedicated mboxes
for this purpose...until I finally get around to finishing the lock
manager to make shared access safe.

The other gotcha with a hook to pick the source for message storage is
that not all sources are capable of storing mail presently (mbox,
maildir and imap are the only supported types, which admittedly should
cover most people).

I think this would be quite simple to add.

I've also toyed around with the idea of 'patterned' sources so that
you could specify a source as maildir:///u/bwalton/Maildir/inbox-%Y%m
and have new sources picked up automatically as they're created
(possibly by procmail doing autofiling, or something).

-Ben
-- 
Ben Walton
Systems Programmer - CHASS
University of Toronto
C:416.407.5610 | W:416.978.4302

GPG Key Id: 8E89F6D2; Key Server: pgp.mit.edu
Contact me to arrange for a CAcert assurance meeting.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/sup-talk/attachments/20090701/64c4a100/attachment.bin>

---

From: [email-masked] (Jim Cheetham)
Date: Thu, 2 Jul 2009 14:30:25 +1200

On Thu, Jul 2, 2009 at 7:39 AM, Ben Walton<bwalton at artsci.utoronto.ca> wrote:
> This is an interesting idea. ?I think the best way to do it might be

'best' or 'simplest'?

There already exists logic for determining which account a given
outgoing message belongs to, because that's how the :sendmail: target
is being used.

If you are arguing that having a different sent_source per (outgoing)
message is useful, then perhaps a hook makes sense; but the simpler
case probably doesn't need it.

> manager to make shared access safe.

Certainly the sent_source mbox shouldn't be subject to something
inconvenient like delivery of new mail while we're updating it :-) but
I'm not sure that mbox people would be unhappy having sent mail in a
separate file ... ?

-jim

---

From: [email-masked] (Ben Walton)
Date: Wed, 01 Jul 2009 23:17:57 -0400

> > to implement a sent_source hook that can override the global default.

Both?

> outgoing message belongs to, because that's how the :sendmail:
> target is being used.
>

I'm not arguing anything, and perhaps using sent_source as the
(hypothetical) hook name was a bad choice...

If I'm understanding you correctly, you want to write to a different
source depending on which address is used in the From.  You'd either
need to make a separate config entry in each account that gets setup
(similar to the sendmail that you note) or provide the ability for the
user to select the sent box in some other way.

In the 'simpler' case where the decision is made based on account
used, you've got a chunk of static code making the choice and
defaulting as it would now.  The hook would simply take the place of
the static decision maker.  The decision has to be made per message
regardless of how it's implemented, so doing it in a hook is a better
option, imo.  The Hook route would be slightly slower, since there are
extra activation records on the stack for the function calls, but it
should be negligible.

The other advantage to a Hook is that the decision could be made based
on more than simply the From:.  Maybe other users would prefer to
store mail based on who it was sent To...or a combo of From/To?

I'm interested in William's thoughts on this.  It's not a feature I'd
use, but I do think it's a good feature to have.

I hope this explains my thinking more clearly.

-Ben

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/sup-talk/attachments/20090701/eb941c06/attachment.bin>

---

From: [email-masked] (Jim Cheetham)
Date: Thu, 2 Jul 2009 22:14:23 +1200

On Thu, Jul 2, 2009 at 3:17 PM, Ben Walton<bwalton at artsci.utoronto.ca> wrote:
> source depending on which address is used in the From.

Almost; what I (could have) said was that I wanted to write to a
different source depending on which account is in use for the current
message; I wasn't fixating on the From address itself, although with a
better understanding of the code you might declare that they are
effectively the same anyway :-)

> ?You'd either

Yes; and in either case I think we can't just override the current
global sent_source, because this is being used to read messages from,
in order to include them in the threads.

> defaulting as it would now. ?The hook would simply take the place of
> the static decision maker. ?The decision has to be made per message
> option, imo. ?The Hook route would be slightly slower, since there are

Mmm, I think the hook route would expose you to a lot of change,
because whenever a 'new' source (i.e. one not known about as load
time) is declared in the hook, you'll have to remember it so it can be
included in the index, and be available next time sup starts too.

Whereas requiring sent_sources to be declared at load time only means
they can be added as sources just like the current singular one is.

I've been browsing the source this evening, I don't have a very good
grasp of Ruby idiom but I do find it to be very readable in general
:-) However, I've come to a halt in SentManager.write_sent_message,
because I haven't figured out how @source.store_message relates to my
store URI, and therefore the relevant store_message function. I mean,
if :sent_store: is configured, how does @source get created from
@source_uri?

If we have multiple sent_sources, that contradicts the singleton
SentManager, unless @source becomes a hash keyed off from_email ... at
which point I'm pushing my Ruby skills too far for the evening.

Any comments or specific code pointers welcomed! I'd be happy to
attempt a patch for this, but I may need a little help ...

-jim

---

From: [email-masked] (Ben Walton)
Date: Thu, 02 Jul 2009 10:02:56 -0400

Excerpts from Jim Cheetham's message of Thu Jul 02 06:14:23 -0400 2009:

> different source depending on which account is in use for the
> current message; I wasn't fixating on the From address itself,
> although with a better understanding of the code you might declare
> that they are effectively the same anyway :-)

Ok.  I _think_ that difference would come out in the wash, unless I'm
overlooking a subtlety.  Thanks for clarifying your needs/wants
though.

> > ?You'd either need to make a separate config entry in each account
> > that gets setup (similar to the sendmail that you note) or provide
> > the ability for the user to select the sent box in some other way.
>

As long as sup is configured with all sources that might be returned
from the hook, including the default source, it should be ok.  It'll
still poll all sources and thread messages appropriately.

> included in the index, and be available next time sup starts too.

My take on this is that the hook would be constrained to return only
existing sources.  On the other hand, aside from an initial import of
any existing mail in a new folder, I'm not sure that adding new
sources on the fly would be that bad.

> they can be added as sources just like the current singular one is.

I was picturing the hook return value to be a uri suitable for passing
to Index.source_for.  If that method call failed, the default would be
used.  There are of course other (maybe better) ways to do this, but
that's what I was thinking last night.  Using this technique, you're
limited to existing sources and you also have an easy way to back out
of a 'hook gone wild.'

> :-) However, I've come to a halt in SentManager.write_sent_message,

It is a beautiful, expressive language! :)

> if :sent_store: is configured, how does @source get created from

At startup, SentManager is initialized with a URI.  This is either the
value of :sent_source: from config.yaml or the default (special) value
sup://sent.  A little later on, after the Index has been initialized,
it is asked for the source that corresponds to the URI value passed to
SentManager.  If this source is found in the Index, it is assigned to
the @source value.  Otherwise, the SentManager.default_source method
is triggered.

So, when one of the message modes calls write_sent_message, it has
either a specific source or the default ready to go.  Sources usable
by SentManager are constrained such that they must respond to
store_message.  This excludes ssh+mbox URI's from being a valid sent
mail source.

> which point I'm pushing my Ruby skills too far for the evening.

I don't think it precludes it from being a singleton, but it would
require some heavy reworking of the initialization logic for it.

I just popped into sent.rb and was all set to knock out a patch to add
the hook and I discovered that my memory of this wasn't what I
thought.  SentManager doesn't ever _see_ the message.  It simply
facilitates calling the store_message method of whatever source is
configured and that source object in turn provides an object that acts
like an IO object to the edit-message-mode call site.  This
complicates either approach discussed here since the determination of
which source to use can't be constrained to SentManager...presently,
it would end up in edit-message-mode, which wouldn't be the right spot
for the logic, I don't think.

More thinking required, I believe.

-Ben

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://rubyforge.org/pipermail/sup-talk/attachments/20090702/9f959f68/attachment.bin>