Hi tim
Did your code work out?
Thx, eric
On 14/10/2012 18:40, tim wrote:
Ok, I think I've figured this out finally.
Basically, I split the mail in the ToRecipientsFolder.
Well, I think I split the mail.
@Override
public void attemptService(Mail mail) throws MessagingException
{
if (mail.getRecipients().size() > 1)
{
Collection<MailAddress> targets =
new ArrayList<MailAddress>(mail.getRecipients().size());
targets.addAll(mail.getRecipients());
for (MailAddress i : targets)
{
ArrayList<MailAddress> recipient = new ArrayList<MailAddress>(1);
recipient.add(i);
mail.setRecipients(recipient);
queue.enQueue(mail);
}
}
else
{
sieveMailet.service(mail);
}
}
=====================================================================================
I'll post the code now, this isn't run or debugged yet:
Actually I'll attach, maybe better:
On Oct 14, 2012, at 11:49 AM, tim wrote:
Making a MimeMessageInputStream seems problematic.
I think now I'm going to rewrite the ToSenderFolder and
ToRecipientsFolder. I will remove all of the mailboxes. I can't use them.
I thought about possibly hacking MimeMessageInputStream to include the
Mail in a getter variable, but I would have to change too many places.
It seems the easiest is to remove the current
ToRecipients->Seive->SeiveMailbox->Seive->Mailbox
(MimeMessage)->Poster->Wherever->Repository path and make it:
ToSender&ToRecipients->RepositoryRetry->Repository.
If anyone has any ideas on a better way of doing this, please let me
know. Especially if this functionality is available, but hidden
somewhere I have not found.
-tim
On Sun Oct 14 11:26:07 EDT 2012, tim <[email protected]
<mailto:[email protected]>> wrote:
Ok, it becomes even more complex.
So, I can't bounce mail from the mailbox mapper, because I no longer
have the mail.
It is in Mesage<Long> form. Which seems pretty unbounceable.
I wonder if I could construct a mail from the MimeMessageInputStream.
That would be by far the easiest.
So I trace-read ToRecipientsFolder, and saw how that went to
SieveMailet, and how that went to SieveMailboxMailet and how that
regoes to SieveMailet which in turn goes to Mailbox, etc etc etc.
Unfortunately I really need to change this line:
mailbox.appendMessage(new MimeMessageInputStream(mail),
new Date(), session, true, null);
But if I do that, I will end up having to change things all over the
place. Also I'll have to change all the code where the mail actually
gets to the mailbox.
What to do, what to do. Seems like this should be simple. So many
hours looking trace-reading through the interconnections between all
the james projects.
I guess I'll look into creating a mail from the MimeMessageInputStream.
-tim
On Sat Oct 13 22:36:09 EDT 2012, tim <[email protected]
<mailto:[email protected]>> wrote:
Ok, I've done this:
try
{
Class<?> jamesContext =
Class.forName("org.apache.james.mailetcontainer.impl.JamesMailetContext");
log.info("got jamesContext class " + jamesContext);
Method method = jamesContext.getMethod("getInstance");
log.info("got getInstance method" + method);
mailetContext = (MailetContext)method.invoke(null, (Object[])null);
log.info("Successfully got mailet context " + mailetContext);
}
catch (Exception e)
{
e.printStackTrace();
throw new MailboxException();
}
But now I feel really dirty :-(
If there is a better way of doing this, please let me know.
-tim
On Sat Oct 13 22:06:07 EDT 2012, tim <[email protected]
<mailto:[email protected]>> wrote:
Ok, I've figured out where it is instantiated from, it looks like
it is a bean:
instantiating JamesMailetContext
java.lang.Exception: hi
at
org.apache.james.mailetcontainer.impl.JamesMailetContext.<init>(JamesMailetContext.java:73)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native
Method)
at
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
at
org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)
at
org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:76)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:990)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:943)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:442)
at
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:416)
at
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:549)
at
org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:159)
at
org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
at
org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:303)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517)
at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
at
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
at
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
at
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585)
at
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)
at
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:93)
at
org.apache.james.container.spring.context.JamesServerApplicationContext.<init>(JamesServerApplicationContext.java:39)
at
org.apache.james.app.spring.JamesAppSpringMain.init(JamesAppSpringMain.java:61)
at
org.apache.james.app.spring.JamesAppSpringMain.main(JamesAppSpringMain.java:42)
I'm wondering whether or not there is a trivial way of getting this
JamesMailetContext as a bean.
Will research tomorrow.
If anyone has any input, please let me know.
-tim
On Sat Oct 13 17:05:24 EDT 2012, tim <[email protected]
<mailto:[email protected]>> wrote:
Ok, I've finally found the JamesMailetContext.
I guess this is my question, and then I can implement this:
Is there a way of getting this object from saving from the mailbox?
I'm pondering just hacking it into a singleton which I can then
retrieve get. If I go this route: are there mutliple
"JamesMailetContext"s instantiated during the process?
Thanks in advance,
-tim
On Sat Oct 13 16:37:28 EDT 2012, tim <[email protected]
<mailto:[email protected]>> wrote:
Greetings again,
So my plan was to refactor RemoteDelivery, and create a "Retry"
mailet, from which ToRecipients and ToSender would derive.
Of course this doesn't work. Because ToRecipientFolder would
retry all the recipients, so some users would get the mail
multiple times.
My alternate action would be to modify the repository. But I
don't know how to bounce. Because I don't have a mailet context.
Or I wonder if I can get the mailet context from the config.
If anyone has any thoughts, feel free to chime in.
Is it possible to bounce a mail without a mailet context?
Is it possible to store a mailet context in a DB?
-tim
On Sun Oct 07 10:50:50 EDT 2012, tim <[email protected]
<mailto:[email protected]>> wrote:
Hey there,
I thought I would check if anyone has any input before I go
ahead and implement this:
I need to write to a respository which is sometimes
disconnected. If it is disconnected at mail-receive time, I need
to queue for writing and retry later.
I plan on implementing this by copying RemoteDelivery, cutting
out all of the socket stuff, and inserting the custom write to
repository.
Is there some other way I should attempt which would reuse more
and code less?
Thanks,
-tim
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]