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]> 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]> 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]> 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]> 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]> 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]> 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 > > > > > > > > > > > >
