You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-user@james.apache.org by Marco Caimi <ma...@gmail.com> on 2012/05/30 10:49:19 UTC

RemoteDelivery queue

Hi All,
I'm looking for a way to intercept the queue of the remote delivery servlet in order to attach some processing.
I need to implement the 'Expires' headers and discard emails that are expired but already in the queue. For example if a mail send fail the remotedelivery puts the mail in the outgoing queue, the next time it processes the mail the expires header can be expired:-) i need to discard these emails but there is no processor where to apply my matchers/mailet for the outgoing queue.

Emails remain in the remotedelivery queue that is indipendetly managed and i cannot us the matcher/mailet paradigm.

I'm using james 3 beta 4.

Thank you.

----------------------------------
Marco Caimi
marco.caimi@gmail.com
----------------------------------

Considera la responsabilità che hai verso l'ambiente e prima di stampare
questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
Please consider your environmental responsability and before printing this
e-mail ask yourself: do I need an hard copy?






---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
For additional commands, e-mail: server-user-help@james.apache.org


Re: RemoteDelivery queue

Posted by Eric Charles <er...@apache.org>.
I will commit it in the coming days. It will thus be available in trunk 
and in beta5.

We sometimes talk about revamping the remote delivery for the future 
major release.
Just express your point on the Roadmap for Apache James Server 3.1 
(https://issues.apache.org/jira/browse/JAMES-1272)

Thx Marco,

Eric

On 06/08/2012 11:09 AM, Marco Caimi wrote:
> I added issue JAMES-1415 and commented it with the patch. The patch is made against v3.0-beta4.
>
> I hope it will be included in the beta5 release. But i think the real solution is to permit to apply the matcher/mailet paradigm even on the outoing queue and not only on the spool queue.
>
> Bye.
>
>
> Il giorno 07/giu/2012, alle ore 20.01, Eric Charles ha scritto:
>
>> Hi Marco,
>>
>> Great! Can you please open a JIRA on [1] and attach there the patch file (granting apache for the licence).
>>
>> Thx a lot,
>>
>> Eric
>>
>> [1] https://issues.apache.org/jira/browse/JAMES
>>
>> On 06/07/2012 06:27 PM, Marco Caimi wrote:
>>> Hi eric this is a patch supporting the Expires header
>>> The check is activated only if you define an expireProcessor. I modified the run method because is the mail is expired it must not enter the delivery process.
>>> The patch is included here.
>>> Bye
>>>
>>> Index: src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
>>> ===================================================================
>>> --- src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(revision 1347556)
>>> +++ src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(working copy)
>>> @@ -60,6 +60,7 @@
>>>   import java.net.UnknownHostException;
>>>   import java.util.ArrayList;
>>>   import java.util.Arrays;
>>> +import java.util.Calendar;
>>>   import java.util.Collection;
>>>   import java.util.Date;
>>>   import java.util.Hashtable;
>>> @@ -154,6 +155,8 @@
>>>
>>>       /** Compiled pattern of the above String. */
>>>       private static Pattern PATTERN = null;
>>> +
>>> +    private static String RFC_1036_EXPIRES_HEADER= "Expires";
>>>
>>>       /** The DNSService */
>>>       private DNSService dnsServer;
>>> @@ -257,6 +260,8 @@
>>>       private boolean startTLS = false;
>>>
>>>       private boolean isSSLEnable = false;
>>> +    /**the processor to handle expired mail */
>>> +	private String expireProcessor = null;
>>>
>>>       @Resource(name = "domainlist")
>>>       public void setDomainList(DomainList domainList) {
>>> @@ -363,6 +368,8 @@
>>>           sendPartial = (getInitParameter("sendpartial") == null) ? false : Boolean.valueOf(getInitParameter("sendpartial"));
>>>
>>>           bounceProcessor = getInitParameter("bounceProcessor");
>>> +
>>> +        expireProcessor = getInitParameter("expireProcessor");
>>>
>>>           String sTLS = getInitParameter("startTLS");
>>>           if (sTLS != null) {
>>> @@ -778,9 +785,27 @@
>>>                               String message = Thread.currentThread().getName() + " will process mail " + key;
>>>                               log(message);
>>>                           }
>>> +                        //if expire processor is configured take into account Expires header
>>> +                        //log("Expires processor: "+expireProcessor);
>>> +                        if(expireProcessor!=null&&   isExpired(mail)){
>>> +                        	//log("Mail is expired "+expireProcessor);
>>> +                        	//pass the mail to expireprocess if exists, otherway discard it
>>> +                                //mail.setAttribute("time-exeeded", );
>>> +                                mail.setState(expireProcessor);
>>> +                                // re-insert the mail into the spool for getting it passed to the
>>> +                                // dsn-processor
>>> +                                MailetContext mc = getMailetContext();
>>> +                                try {
>>> +                                    mc.sendMail(mail);
>>> +                                } catch (MessagingException e) {
>>> +                                    // we shouldn't get an exception, because the mail was already
>>> +                                    // processed
>>> +                                    log("Exception re-inserting failed mail: ", e);
>>> +                                }                       		
>>>
>>> -                        // Deliver message
>>> -                        if (deliver(mail, session)) {
>>> +                        	LifecycleUtil.dispose(mail);
>>> +                        	// Deliver message
>>> +                        }else if (deliver(mail, session)) {
>>>                               // Message was successfully delivered/fully
>>>                               // failed...
>>>                               // delete it
>>> @@ -850,7 +875,44 @@
>>>           }
>>>       }
>>>
>>> -    /**
>>> +    private boolean isExpired(Mail mail) {
>>> +    	try {
>>> +			String[] expireHeaders = mail.getMessage().getHeader(RFC_1036_EXPIRES_HEADER);
>>> +			if(expireHeaders!=null&&   expireHeaders.length>0){
>>> +				String value = expireHeaders[0].trim();
>>> +				//convert into date and check
>>> +				java.text.DateFormat df = new javax.mail.internet.MailDateFormat();
>>> +			    java.util.Date expire = df.parse(value);
>>> +			    java.util.Date now = new java.util.Date();
>>> +			    //log("Now is: "+now+" Expires is: "+expire);
>>> +				if(expire!=null&&   now.getTime()>   expire.getTime()){
>>> +					StringBuilder logMessageBuffer =
>>> +	                     new StringBuilder(256)
>>> +	                     .append("Mail ")
>>> +	                     .append(mail.getName())
>>> +	                     .append(" to host ")
>>> +	                     .append(mail.getRemoteHost())
>>> +	                     .append(" to addresses ")
>>> +	                     .append(Arrays.asList(mail.getRecipients()))
>>> +	                     .append(" is expired since ")
>>> +	                     .append(expire);
>>> +					if(expireProcessor !=null){
>>> +						logMessageBuffer.append(" and is be passed to processor ")
>>> +						.append(expireProcessor);
>>> +               	 	}else{
>>> +               	 		logMessageBuffer.append(" and is discarded");
>>> +               	 	}
>>> +                    log(logMessageBuffer.toString());
>>> +					return true;
>>> +				}
>>> +			}
>>> +		} catch (MessagingException e) {
>>> +		} catch (java.text.ParseException e) {
>>> +		}
>>> +		return false;
>>> +	}
>>> +
>>> +	/**
>>>        * We can assume that the recipients of this message are all going to the
>>>        * same mail server. We will now rely on the DNS server to do DNS MX record
>>>        * lookup and try to deliver to the multiple mail servers. If it fails, it
>>>
>>>
>>>
>>>
>>>
>>>
>>> Il giorno 31/mag/2012, alle ore 10.27, Eric Charles ha scritto:
>>>
>>>> Hi,
>>>>
>>>> You will need to implement your own RemoteDelivery [1]. (look at  the deliver(Mail mail, Session session) method)
>>>>
>>>> If you like to code in the existing one and submit a pathc, we will be happy to review it to integrate it in trunk.
>>>>
>>>> This being said, I don't know how geronimo mailclient (we use it to send the remote mails via SMTP) behaves regarding any Expires header. You could check this and see if it's not already covered.
>>>>
>>>> Thx,
>>>>
>>>> Eric
>>>>
>>>> [1] http://svn.apache.org/repos/asf/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
>>>>
>>>>
>>>> On 05/30/2012 10:49 AM, Marco Caimi wrote:
>>>>> Hi All,
>>>>> I'm looking for a way to intercept the queue of the remote delivery servlet in order to attach some processing.
>>>>> I need to implement the 'Expires' headers and discard emails that are expired but already in the queue. For example if a mail send fail the remotedelivery puts the mail in the outgoing queue, the next time it processes the mail the expires header can be expired:-) i need to discard these emails but there is no processor where to apply my matchers/mailet for the outgoing queue.
>>>>>
>>>>> Emails remain in the remotedelivery queue that is indipendetly managed and i cannot us the matcher/mailet paradigm.
>>>>>
>>>>> I'm using james 3 beta 4.
>>>>>
>>>>> Thank you.
>>>>>
>>>>> ----------------------------------
>>>>> Marco Caimi
>>>>> marco.caimi@gmail.com
>>>>> ----------------------------------
>>>>>
>>>>> Considera la responsabilità che hai verso l'ambiente e prima di stampare
>>>>> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
>>>>> Please consider your environmental responsability and before printing this
>>>>> e-mail ask yourself: do I need an hard copy?
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>>>>> For additional commands, e-mail: server-user-help@james.apache.org
>>>>>
>>>>
>>>> --
>>>> eric | http://about.echarles.net | @echarles
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>>>> For additional commands, e-mail: server-user-help@james.apache.org
>>>>
>>>
>>> ----------------------------------
>>> Marco Caimi
>>> marco.caimi@gmail.com
>>> ----------------------------------
>>>
>>> Considera la responsabilità che hai verso l'ambiente e prima di stampare
>>> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
>>> Please consider your environmental responsability and before printing this
>>> e-mail ask yourself: do I need an hard copy?
>>>
>>>
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>>> For additional commands, e-mail: server-user-help@james.apache.org
>>>
>>
>> --
>> eric | http://about.echarles.net | @echarles
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>> For additional commands, e-mail: server-user-help@james.apache.org
>>
>
> ----------------------------------
> Marco Caimi
> marco.caimi@gmail.com
> ----------------------------------
>
> Considera la responsabilità che hai verso l'ambiente e prima di stampare
> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
> Please consider your environmental responsability and before printing this
> e-mail ask yourself: do I need an hard copy?
>
>
>
>
>
>

-- 
eric | http://about.echarles.net | @echarles

---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
For additional commands, e-mail: server-user-help@james.apache.org


Re: RemoteDelivery queue

Posted by Marco Caimi <ma...@gmail.com>.
I added issue JAMES-1415 and commented it with the patch. The patch is made against v3.0-beta4.

I hope it will be included in the beta5 release. But i think the real solution is to permit to apply the matcher/mailet paradigm even on the outoing queue and not only on the spool queue. 

Bye.


Il giorno 07/giu/2012, alle ore 20.01, Eric Charles ha scritto:

> Hi Marco,
> 
> Great! Can you please open a JIRA on [1] and attach there the patch file (granting apache for the licence).
> 
> Thx a lot,
> 
> Eric
> 
> [1] https://issues.apache.org/jira/browse/JAMES
> 
> On 06/07/2012 06:27 PM, Marco Caimi wrote:
>> Hi eric this is a patch supporting the Expires header
>> The check is activated only if you define an expireProcessor. I modified the run method because is the mail is expired it must not enter the delivery process.
>> The patch is included here.
>> Bye
>> 
>> Index: src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
>> ===================================================================
>> --- src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(revision 1347556)
>> +++ src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(working copy)
>> @@ -60,6 +60,7 @@
>>  import java.net.UnknownHostException;
>>  import java.util.ArrayList;
>>  import java.util.Arrays;
>> +import java.util.Calendar;
>>  import java.util.Collection;
>>  import java.util.Date;
>>  import java.util.Hashtable;
>> @@ -154,6 +155,8 @@
>> 
>>      /** Compiled pattern of the above String. */
>>      private static Pattern PATTERN = null;
>> +
>> +    private static String RFC_1036_EXPIRES_HEADER= "Expires";
>> 
>>      /** The DNSService */
>>      private DNSService dnsServer;
>> @@ -257,6 +260,8 @@
>>      private boolean startTLS = false;
>> 
>>      private boolean isSSLEnable = false;
>> +    /**the processor to handle expired mail */
>> +	private String expireProcessor = null;
>> 
>>      @Resource(name = "domainlist")
>>      public void setDomainList(DomainList domainList) {
>> @@ -363,6 +368,8 @@
>>          sendPartial = (getInitParameter("sendpartial") == null) ? false : Boolean.valueOf(getInitParameter("sendpartial"));
>> 
>>          bounceProcessor = getInitParameter("bounceProcessor");
>> +
>> +        expireProcessor = getInitParameter("expireProcessor");
>> 
>>          String sTLS = getInitParameter("startTLS");
>>          if (sTLS != null) {
>> @@ -778,9 +785,27 @@
>>                              String message = Thread.currentThread().getName() + " will process mail " + key;
>>                              log(message);
>>                          }
>> +                        //if expire processor is configured take into account Expires header
>> +                        //log("Expires processor: "+expireProcessor);
>> +                        if(expireProcessor!=null&&  isExpired(mail)){
>> +                        	//log("Mail is expired "+expireProcessor);
>> +                        	//pass the mail to expireprocess if exists, otherway discard it
>> +                                //mail.setAttribute("time-exeeded", );
>> +                                mail.setState(expireProcessor);
>> +                                // re-insert the mail into the spool for getting it passed to the
>> +                                // dsn-processor
>> +                                MailetContext mc = getMailetContext();
>> +                                try {
>> +                                    mc.sendMail(mail);
>> +                                } catch (MessagingException e) {
>> +                                    // we shouldn't get an exception, because the mail was already
>> +                                    // processed
>> +                                    log("Exception re-inserting failed mail: ", e);
>> +                                }                       		
>> 
>> -                        // Deliver message
>> -                        if (deliver(mail, session)) {
>> +                        	LifecycleUtil.dispose(mail);
>> +                        	// Deliver message
>> +                        }else if (deliver(mail, session)) {
>>                              // Message was successfully delivered/fully
>>                              // failed...
>>                              // delete it
>> @@ -850,7 +875,44 @@
>>          }
>>      }
>> 
>> -    /**
>> +    private boolean isExpired(Mail mail) {
>> +    	try {
>> +			String[] expireHeaders = mail.getMessage().getHeader(RFC_1036_EXPIRES_HEADER);
>> +			if(expireHeaders!=null&&  expireHeaders.length>0){
>> +				String value = expireHeaders[0].trim();
>> +				//convert into date and check
>> +				java.text.DateFormat df = new javax.mail.internet.MailDateFormat();
>> +			    java.util.Date expire = df.parse(value);
>> +			    java.util.Date now = new java.util.Date();
>> +			    //log("Now is: "+now+" Expires is: "+expire);
>> +				if(expire!=null&&  now.getTime()>  expire.getTime()){
>> +					StringBuilder logMessageBuffer =
>> +	                     new StringBuilder(256)
>> +	                     .append("Mail ")
>> +	                     .append(mail.getName())
>> +	                     .append(" to host ")
>> +	                     .append(mail.getRemoteHost())
>> +	                     .append(" to addresses ")
>> +	                     .append(Arrays.asList(mail.getRecipients()))
>> +	                     .append(" is expired since ")
>> +	                     .append(expire);
>> +					if(expireProcessor !=null){
>> +						logMessageBuffer.append(" and is be passed to processor ")
>> +						.append(expireProcessor);
>> +               	 	}else{
>> +               	 		logMessageBuffer.append(" and is discarded");
>> +               	 	}
>> +                    log(logMessageBuffer.toString());
>> +					return true;
>> +				}
>> +			}
>> +		} catch (MessagingException e) {
>> +		} catch (java.text.ParseException e) {
>> +		}
>> +		return false;
>> +	}
>> +
>> +	/**
>>       * We can assume that the recipients of this message are all going to the
>>       * same mail server. We will now rely on the DNS server to do DNS MX record
>>       * lookup and try to deliver to the multiple mail servers. If it fails, it
>> 
>> 
>> 
>> 
>> 
>> 
>> Il giorno 31/mag/2012, alle ore 10.27, Eric Charles ha scritto:
>> 
>>> Hi,
>>> 
>>> You will need to implement your own RemoteDelivery [1]. (look at  the deliver(Mail mail, Session session) method)
>>> 
>>> If you like to code in the existing one and submit a pathc, we will be happy to review it to integrate it in trunk.
>>> 
>>> This being said, I don't know how geronimo mailclient (we use it to send the remote mails via SMTP) behaves regarding any Expires header. You could check this and see if it's not already covered.
>>> 
>>> Thx,
>>> 
>>> Eric
>>> 
>>> [1] http://svn.apache.org/repos/asf/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
>>> 
>>> 
>>> On 05/30/2012 10:49 AM, Marco Caimi wrote:
>>>> Hi All,
>>>> I'm looking for a way to intercept the queue of the remote delivery servlet in order to attach some processing.
>>>> I need to implement the 'Expires' headers and discard emails that are expired but already in the queue. For example if a mail send fail the remotedelivery puts the mail in the outgoing queue, the next time it processes the mail the expires header can be expired:-) i need to discard these emails but there is no processor where to apply my matchers/mailet for the outgoing queue.
>>>> 
>>>> Emails remain in the remotedelivery queue that is indipendetly managed and i cannot us the matcher/mailet paradigm.
>>>> 
>>>> I'm using james 3 beta 4.
>>>> 
>>>> Thank you.
>>>> 
>>>> ----------------------------------
>>>> Marco Caimi
>>>> marco.caimi@gmail.com
>>>> ----------------------------------
>>>> 
>>>> Considera la responsabilità che hai verso l'ambiente e prima di stampare
>>>> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
>>>> Please consider your environmental responsability and before printing this
>>>> e-mail ask yourself: do I need an hard copy?
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>>>> For additional commands, e-mail: server-user-help@james.apache.org
>>>> 
>>> 
>>> --
>>> eric | http://about.echarles.net | @echarles
>>> 
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>>> For additional commands, e-mail: server-user-help@james.apache.org
>>> 
>> 
>> ----------------------------------
>> Marco Caimi
>> marco.caimi@gmail.com
>> ----------------------------------
>> 
>> Considera la responsabilità che hai verso l'ambiente e prima di stampare
>> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
>> Please consider your environmental responsability and before printing this
>> e-mail ask yourself: do I need an hard copy?
>> 
>> 
>> 
>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>> For additional commands, e-mail: server-user-help@james.apache.org
>> 
> 
> -- 
> eric | http://about.echarles.net | @echarles
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> For additional commands, e-mail: server-user-help@james.apache.org
> 

----------------------------------
Marco Caimi
marco.caimi@gmail.com
----------------------------------

Considera la responsabilità che hai verso l'ambiente e prima di stampare
questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
Please consider your environmental responsability and before printing this
e-mail ask yourself: do I need an hard copy?






Re: RemoteDelivery queue

Posted by Eric Charles <er...@apache.org>.
Hi Marco,

Great! Can you please open a JIRA on [1] and attach there the patch file 
(granting apache for the licence).

Thx a lot,

Eric

[1] https://issues.apache.org/jira/browse/JAMES

On 06/07/2012 06:27 PM, Marco Caimi wrote:
> Hi eric this is a patch supporting the Expires header
> The check is activated only if you define an expireProcessor. I modified the run method because is the mail is expired it must not enter the delivery process.
> The patch is included here.
> Bye
>
> Index: src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
> ===================================================================
> --- src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(revision 1347556)
> +++ src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(working copy)
> @@ -60,6 +60,7 @@
>   import java.net.UnknownHostException;
>   import java.util.ArrayList;
>   import java.util.Arrays;
> +import java.util.Calendar;
>   import java.util.Collection;
>   import java.util.Date;
>   import java.util.Hashtable;
> @@ -154,6 +155,8 @@
>
>       /** Compiled pattern of the above String. */
>       private static Pattern PATTERN = null;
> +
> +    private static String RFC_1036_EXPIRES_HEADER= "Expires";
>
>       /** The DNSService */
>       private DNSService dnsServer;
> @@ -257,6 +260,8 @@
>       private boolean startTLS = false;
>
>       private boolean isSSLEnable = false;
> +    /**the processor to handle expired mail */
> +	private String expireProcessor = null;
>
>       @Resource(name = "domainlist")
>       public void setDomainList(DomainList domainList) {
> @@ -363,6 +368,8 @@
>           sendPartial = (getInitParameter("sendpartial") == null) ? false : Boolean.valueOf(getInitParameter("sendpartial"));
>
>           bounceProcessor = getInitParameter("bounceProcessor");
> +
> +        expireProcessor = getInitParameter("expireProcessor");
>
>           String sTLS = getInitParameter("startTLS");
>           if (sTLS != null) {
> @@ -778,9 +785,27 @@
>                               String message = Thread.currentThread().getName() + " will process mail " + key;
>                               log(message);
>                           }
> +                        //if expire processor is configured take into account Expires header
> +                        //log("Expires processor: "+expireProcessor);
> +                        if(expireProcessor!=null&&  isExpired(mail)){
> +                        	//log("Mail is expired "+expireProcessor);
> +                        	//pass the mail to expireprocess if exists, otherway discard it
> +                                //mail.setAttribute("time-exeeded", );
> +                                mail.setState(expireProcessor);
> +                                // re-insert the mail into the spool for getting it passed to the
> +                                // dsn-processor
> +                                MailetContext mc = getMailetContext();
> +                                try {
> +                                    mc.sendMail(mail);
> +                                } catch (MessagingException e) {
> +                                    // we shouldn't get an exception, because the mail was already
> +                                    // processed
> +                                    log("Exception re-inserting failed mail: ", e);
> +                                }                       		
>
> -                        // Deliver message
> -                        if (deliver(mail, session)) {
> +                        	LifecycleUtil.dispose(mail);
> +                        	// Deliver message
> +                        }else if (deliver(mail, session)) {
>                               // Message was successfully delivered/fully
>                               // failed...
>                               // delete it
> @@ -850,7 +875,44 @@
>           }
>       }
>
> -    /**
> +    private boolean isExpired(Mail mail) {
> +    	try {
> +			String[] expireHeaders = mail.getMessage().getHeader(RFC_1036_EXPIRES_HEADER);
> +			if(expireHeaders!=null&&  expireHeaders.length>0){
> +				String value = expireHeaders[0].trim();
> +				//convert into date and check
> +				java.text.DateFormat df = new javax.mail.internet.MailDateFormat();
> +			    java.util.Date expire = df.parse(value);
> +			    java.util.Date now = new java.util.Date();
> +			    //log("Now is: "+now+" Expires is: "+expire);
> +				if(expire!=null&&  now.getTime()>  expire.getTime()){
> +					StringBuilder logMessageBuffer =
> +	                     new StringBuilder(256)
> +	                     .append("Mail ")
> +	                     .append(mail.getName())
> +	                     .append(" to host ")
> +	                     .append(mail.getRemoteHost())
> +	                     .append(" to addresses ")
> +	                     .append(Arrays.asList(mail.getRecipients()))
> +	                     .append(" is expired since ")
> +	                     .append(expire);
> +					if(expireProcessor !=null){
> +						logMessageBuffer.append(" and is be passed to processor ")
> +						.append(expireProcessor);
> +               	 	}else{
> +               	 		logMessageBuffer.append(" and is discarded");
> +               	 	}
> +                    log(logMessageBuffer.toString());
> +					return true;
> +				}
> +			}
> +		} catch (MessagingException e) {
> +		} catch (java.text.ParseException e) {
> +		}
> +		return false;
> +	}
> +
> +	/**
>        * We can assume that the recipients of this message are all going to the
>        * same mail server. We will now rely on the DNS server to do DNS MX record
>        * lookup and try to deliver to the multiple mail servers. If it fails, it
>
>
>
>
>
>
> Il giorno 31/mag/2012, alle ore 10.27, Eric Charles ha scritto:
>
>> Hi,
>>
>> You will need to implement your own RemoteDelivery [1]. (look at  the deliver(Mail mail, Session session) method)
>>
>> If you like to code in the existing one and submit a pathc, we will be happy to review it to integrate it in trunk.
>>
>> This being said, I don't know how geronimo mailclient (we use it to send the remote mails via SMTP) behaves regarding any Expires header. You could check this and see if it's not already covered.
>>
>> Thx,
>>
>> Eric
>>
>> [1] http://svn.apache.org/repos/asf/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
>>
>>
>> On 05/30/2012 10:49 AM, Marco Caimi wrote:
>>> Hi All,
>>> I'm looking for a way to intercept the queue of the remote delivery servlet in order to attach some processing.
>>> I need to implement the 'Expires' headers and discard emails that are expired but already in the queue. For example if a mail send fail the remotedelivery puts the mail in the outgoing queue, the next time it processes the mail the expires header can be expired:-) i need to discard these emails but there is no processor where to apply my matchers/mailet for the outgoing queue.
>>>
>>> Emails remain in the remotedelivery queue that is indipendetly managed and i cannot us the matcher/mailet paradigm.
>>>
>>> I'm using james 3 beta 4.
>>>
>>> Thank you.
>>>
>>> ----------------------------------
>>> Marco Caimi
>>> marco.caimi@gmail.com
>>> ----------------------------------
>>>
>>> Considera la responsabilità che hai verso l'ambiente e prima di stampare
>>> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
>>> Please consider your environmental responsability and before printing this
>>> e-mail ask yourself: do I need an hard copy?
>>>
>>>
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>>> For additional commands, e-mail: server-user-help@james.apache.org
>>>
>>
>> --
>> eric | http://about.echarles.net | @echarles
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>> For additional commands, e-mail: server-user-help@james.apache.org
>>
>
> ----------------------------------
> Marco Caimi
> marco.caimi@gmail.com
> ----------------------------------
>
> Considera la responsabilità che hai verso l'ambiente e prima di stampare
> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
> Please consider your environmental responsability and before printing this
> e-mail ask yourself: do I need an hard copy?
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> For additional commands, e-mail: server-user-help@james.apache.org
>

-- 
eric | http://about.echarles.net | @echarles

---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
For additional commands, e-mail: server-user-help@james.apache.org


Re: RemoteDelivery queue

Posted by Marco Caimi <ma...@gmail.com>.
Hi eric this is a patch supporting the Expires header
The check is activated only if you define an expireProcessor. I modified the run method because is the mail is expired it must not enter the delivery process.
The patch is included here.
Bye

Index: src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
===================================================================
--- src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(revision 1347556)
+++ src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java	(working copy)
@@ -60,6 +60,7 @@
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
 import java.util.Hashtable;
@@ -154,6 +155,8 @@
 
     /** Compiled pattern of the above String. */
     private static Pattern PATTERN = null;
+    
+    private static String RFC_1036_EXPIRES_HEADER= "Expires";
 
     /** The DNSService */
     private DNSService dnsServer;
@@ -257,6 +260,8 @@
     private boolean startTLS = false;
     
     private boolean isSSLEnable = false;
+    /**the processor to handle expired mail */
+	private String expireProcessor = null;
 
     @Resource(name = "domainlist")
     public void setDomainList(DomainList domainList) {
@@ -363,6 +368,8 @@
         sendPartial = (getInitParameter("sendpartial") == null) ? false : Boolean.valueOf(getInitParameter("sendpartial"));
 
         bounceProcessor = getInitParameter("bounceProcessor");
+        
+        expireProcessor = getInitParameter("expireProcessor");
 
         String sTLS = getInitParameter("startTLS");
         if (sTLS != null) {
@@ -778,9 +785,27 @@
                             String message = Thread.currentThread().getName() + " will process mail " + key;
                             log(message);
                         }
+                        //if expire processor is configured take into account Expires header
+                        //log("Expires processor: "+expireProcessor);
+                        if(expireProcessor!=null && isExpired(mail)){
+                        	//log("Mail is expired "+expireProcessor);
+                        	//pass the mail to expireprocess if exists, otherway discard it
+                                //mail.setAttribute("time-exeeded", );
+                                mail.setState(expireProcessor);
+                                // re-insert the mail into the spool for getting it passed to the
+                                // dsn-processor
+                                MailetContext mc = getMailetContext();
+                                try {
+                                    mc.sendMail(mail);
+                                } catch (MessagingException e) {
+                                    // we shouldn't get an exception, because the mail was already
+                                    // processed
+                                    log("Exception re-inserting failed mail: ", e);
+                                }                       		
 
-                        // Deliver message
-                        if (deliver(mail, session)) {
+                        	LifecycleUtil.dispose(mail);
+                        	// Deliver message
+                        }else if (deliver(mail, session)) {
                             // Message was successfully delivered/fully
                             // failed...
                             // delete it
@@ -850,7 +875,44 @@
         }
     }
 
-    /**
+    private boolean isExpired(Mail mail) {
+    	try {
+			String[] expireHeaders = mail.getMessage().getHeader(RFC_1036_EXPIRES_HEADER);
+			if(expireHeaders!=null && expireHeaders.length>0){
+				String value = expireHeaders[0].trim();
+				//convert into date and check
+				java.text.DateFormat df = new javax.mail.internet.MailDateFormat();
+			    java.util.Date expire = df.parse(value);
+			    java.util.Date now = new java.util.Date();
+			    //log("Now is: "+now+" Expires is: "+expire);
+				if(expire!=null && now.getTime() > expire.getTime()){
+					StringBuilder logMessageBuffer =
+	                     new StringBuilder(256)
+	                     .append("Mail ")
+	                     .append(mail.getName())
+	                     .append(" to host ")
+	                     .append(mail.getRemoteHost())
+	                     .append(" to addresses ")
+	                     .append(Arrays.asList(mail.getRecipients()))
+	                     .append(" is expired since ")
+	                     .append(expire);
+					if(expireProcessor !=null){
+						logMessageBuffer.append(" and is be passed to processor ")
+						.append(expireProcessor);
+               	 	}else{
+               	 		logMessageBuffer.append(" and is discarded");
+               	 	}                   
+                    log(logMessageBuffer.toString());
+					return true;
+				}
+			}
+		} catch (MessagingException e) {
+		} catch (java.text.ParseException e) {
+		}
+		return false;
+	}
+
+	/**
      * We can assume that the recipients of this message are all going to the
      * same mail server. We will now rely on the DNS server to do DNS MX record
      * lookup and try to deliver to the multiple mail servers. If it fails, it






Il giorno 31/mag/2012, alle ore 10.27, Eric Charles ha scritto:

> Hi,
> 
> You will need to implement your own RemoteDelivery [1]. (look at  the deliver(Mail mail, Session session) method)
> 
> If you like to code in the existing one and submit a pathc, we will be happy to review it to integrate it in trunk.
> 
> This being said, I don't know how geronimo mailclient (we use it to send the remote mails via SMTP) behaves regarding any Expires header. You could check this and see if it's not already covered.
> 
> Thx,
> 
> Eric
> 
> [1] http://svn.apache.org/repos/asf/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java
> 
> 
> On 05/30/2012 10:49 AM, Marco Caimi wrote:
>> Hi All,
>> I'm looking for a way to intercept the queue of the remote delivery servlet in order to attach some processing.
>> I need to implement the 'Expires' headers and discard emails that are expired but already in the queue. For example if a mail send fail the remotedelivery puts the mail in the outgoing queue, the next time it processes the mail the expires header can be expired:-) i need to discard these emails but there is no processor where to apply my matchers/mailet for the outgoing queue.
>> 
>> Emails remain in the remotedelivery queue that is indipendetly managed and i cannot us the matcher/mailet paradigm.
>> 
>> I'm using james 3 beta 4.
>> 
>> Thank you.
>> 
>> ----------------------------------
>> Marco Caimi
>> marco.caimi@gmail.com
>> ----------------------------------
>> 
>> Considera la responsabilità che hai verso l'ambiente e prima di stampare
>> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
>> Please consider your environmental responsability and before printing this
>> e-mail ask yourself: do I need an hard copy?
>> 
>> 
>> 
>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
>> For additional commands, e-mail: server-user-help@james.apache.org
>> 
> 
> -- 
> eric | http://about.echarles.net | @echarles
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> For additional commands, e-mail: server-user-help@james.apache.org
> 

----------------------------------
Marco Caimi
marco.caimi@gmail.com
----------------------------------

Considera la responsabilità che hai verso l'ambiente e prima di stampare
questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
Please consider your environmental responsability and before printing this
e-mail ask yourself: do I need an hard copy?






---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
For additional commands, e-mail: server-user-help@james.apache.org


Re: RemoteDelivery queue

Posted by Eric Charles <er...@apache.org>.
Hi,

You will need to implement your own RemoteDelivery [1]. (look at  the 
deliver(Mail mail, Session session) method)

If you like to code in the existing one and submit a pathc, we will be 
happy to review it to integrate it in trunk.

This being said, I don't know how geronimo mailclient (we use it to send 
the remote mails via SMTP) behaves regarding any Expires header. You 
could check this and see if it's not already covered.

Thx,

Eric

[1] 
http://svn.apache.org/repos/asf/james/server/trunk/mailets/src/main/java/org/apache/james/transport/mailets/RemoteDelivery.java


On 05/30/2012 10:49 AM, Marco Caimi wrote:
> Hi All,
> I'm looking for a way to intercept the queue of the remote delivery servlet in order to attach some processing.
> I need to implement the 'Expires' headers and discard emails that are expired but already in the queue. For example if a mail send fail the remotedelivery puts the mail in the outgoing queue, the next time it processes the mail the expires header can be expired:-) i need to discard these emails but there is no processor where to apply my matchers/mailet for the outgoing queue.
>
> Emails remain in the remotedelivery queue that is indipendetly managed and i cannot us the matcher/mailet paradigm.
>
> I'm using james 3 beta 4.
>
> Thank you.
>
> ----------------------------------
> Marco Caimi
> marco.caimi@gmail.com
> ----------------------------------
>
> Considera la responsabilità che hai verso l'ambiente e prima di stampare
> questa e-mail domandati: ho davvero bisogno di una copia cartacea ?
> Please consider your environmental responsability and before printing this
> e-mail ask yourself: do I need an hard copy?
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
> For additional commands, e-mail: server-user-help@james.apache.org
>

-- 
eric | http://about.echarles.net | @echarles

---------------------------------------------------------------------
To unsubscribe, e-mail: server-user-unsubscribe@james.apache.org
For additional commands, e-mail: server-user-help@james.apache.org