Le 2010-02-11 à 13:37, Amedeo Mantica a écrit :

> Actually my system doesn't handle Bounces, but check if a recipiend have read 
> email putting an image in the email that calls a direct action
> Pascal suggested me the way POP/IMAP to handle bounces too, I hope to 
> implement it soon

First draft : 

package org.wocommunity.massmailing;

import java.util.Properties;

import javax.mail.Folder;
import javax.mail.internet.MimeMessage;

import com.sun.mail.dsn.DeliveryStatus;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
import com.webobjects.foundation.NSLog;

import er.extensions.foundation.ERXProperties;


public class EmailBounces {
        private IMAPStore imapStore;
        private IMAPFolder inbox;

        public EmailBounces() { 
                
        }
        
        public boolean openIMAPConnection() {
                String imapUserName = 
ERXProperties.stringForKey("imap.username");
                String imapUserPasswd = 
ERXProperties.stringForKey("imap.password");
                String imapServerHostName = 
ERXProperties.stringForKey("imap.host");
                String smtpServerHostName = 
ERXProperties.stringForKey("mail.smtp.host");
                
                try {
                        Properties props = System.getProperties();
                        props.put("mail.smtp.host",smtpServerHostName);
                        javax.mail.Session sessionEmail = 
javax.mail.Session.getDefaultInstance(props,null);
                        sessionEmail.setDebug(false);
                        imapStore = (IMAPStore)sessionEmail.getStore("imap");
                        imapStore.connect(imapServerHostName, imapUserName, 
imapUserPasswd); 
                        inbox = (IMAPFolder)imapStore.getFolder("INBOX");
                        inbox.open(Folder.READ_ONLY);
                        return true;
                } catch (Exception ex) {
                        ex.printStackTrace();
                        return false;
                }
        }

        public boolean closeIMAPConnection(boolean purgeDeletedMessages) {
                try {
                        inbox.close(purgeDeletedMessages);
                        imapStore.close();
                        return true;
                } catch (Exception ex) {
                        ex.printStackTrace();
                        return false;
                }
        }

        public void findBouncesInInbox() {
                try {
                        for (int i = 1; i <= inbox.getMessageCount(); i++) {
                                MimeMessage message = 
(MimeMessage)inbox.getMessage(i);
                                if (message.isMimeType("multipart/report")) {
                                        Object content = message.getContent();
                                        if (content instanceof 
com.sun.mail.dsn.MultipartReport) {
                                                
com.sun.mail.dsn.MultipartReport report = 
(com.sun.mail.dsn.MultipartReport)content;
                                                Object status = 
report.getReport();
                                                if (status instanceof 
com.sun.mail.dsn.DeliveryStatus) {
                                                        DeliveryStatus 
statusReport = (DeliveryStatus)status;
                                                        /*
                                                         * The optional 
Arrival-Date field indicates the date and time at which the message arrived at 
the Reporting MTA. If the Last-Attempt-Date field is also provided in a 
per-recipient field, this can be used to determine the interval between when 
the message arrived at the Reporting MTA and when the report was issued for 
that recipient.
                                                         */
                                                        
NSLog.out.appendln(statusReport.getMessageDSN().getHeader("Arrival-Date")[0]);
                                                        /*
                                                         * A DSN describes the 
results of attempts to deliver, relay, or gateway a message to one or more 
recipients. In all cases, the Reporting-MTA is the MTA which attempted to 
perform the delivery, relay, or gateway operation described in the DSN. This 
field is required.
                                                         */
                                                        
NSLog.out.appendln(statusReport.getMessageDSN().getHeader("Reporting-MTA")[0]);
                                                        for (int k = 0; k < 
statusReport.getRecipientDSNCount(); k++) {
                                                                /*
                                                                 * The 
Original-Recipient field indicates the original recipient address as specified 
by the sender of the message for which the DSN is being issued.
                                                                 */
                                                                
NSLog.out.appendln(statusReport.getRecipientDSN(k).getHeader("Original-Recipient")[0]);
                                                                /*
                                                                 * The 
Final-Recipient field indicates the recipient for which this set of 
per-recipient fields applies. This field MUST be present in each set of 
per-recipient data.
                                                                 */
                                                                
NSLog.out.appendln(statusReport.getRecipientDSN(k).getHeader("Final-Recipient")[0]);
                                                                /* 
                                                                 * The Action 
field indicates the action performed by the Reporting-MTA as a result of its 
attempt to deliver the message to this recipient address. This field MUST be 
present for each recipient named in the DSN.
                                                         * Possible values : 
failed, delayed, delivered, relayed
                                                         */
                                                                
NSLog.out.appendln(statusReport.getRecipientDSN(k).getHeader("Action")[0]);
                                                                /*
                                                                 * The 
per-recipient Status field contains a transport-independent status code which 
indicates the delivery status of the message to that recipient. This field MUST 
be present for each delivery attempt which is described by a DSN.
                                                                 * Status codes 
thus consist of three numerical fields separated by ".". The first sub-field 
indicates whether the delivery attempt was
                                                                        
successful (2 = success, 4 = persistent temporary failure, 5 = permanent 
failure).  The second sub-field indicates the probable
                                                                        source 
of any delivery anomalies, and the third sub-field denotes a precise error 
condition, if known.
                                                                 * Example : 
5.4.4
                                                                 */
                                                                
NSLog.out.appendln(statusReport.getRecipientDSN(k).getHeader("Status")[0]);
                                                                /*
                                                                 * For a 
"failed" or "delayed" recipient, the Diagnostic-Code DSN field contains the 
actual diagnostic code issued by the mail transport. Since such codes vary from 
one mail transport to another, the diagnostic-type subfield is needed to 
specify which type of diagnostic code is represented.
                                                                 * Example : 
DNS; Host not found
                                                                 */
                                                                
NSLog.out.appendln(statusReport.getRecipientDSN(k).getHeader("Diagnostic-Code")[0]);
                                                        }
                                                }
                                        } else {
                                                NSLog.out.appendln("WTF? : " + 
content.getClass().getName());
                                        }
                                }
                        }
                } catch (Exception nspex) {
                        nspex.printStackTrace();
                } 
        }

}

> Regards
> Amedeo
> 
> On 11/feb/2010, at 19.19, Tusker wrote:
> 
>> This looks great!  What about handling bounces?  I work in a really small 
>> team so would  creating/setting up/maintaining this type of system might be 
>> too much?  Like it was mentioned before, you can just let MailChimp handle 
>> all this.  The only problem with that is the fact that we have to store our 
>> customer data on their servers.
>> 
>> M
>> 
>> On Feb 11, 2010, at 3:49 AM, Amedeo Mantica wrote:
>> 
>>> Hello,
>>> 
>>> Some time ago I have made some work for sending "bulk" emails... Let me 
>>> explain how it works, because I think that may be a good start
>>> 
>>> 1) Mailing List management
>>> 
>>> Two Entities MailRecipient (emails) and and MailingList (groups) in a 
>>> many-to-many relationship
>>> I made an UI for managing Lists and email, insert / remove bulk emails 
>>> automatically handling spaces, commas, carriage returns, duplicate 
>>> addresses, etc...
>>> 
>>> 2) Mail Templates
>>> 
>>> In a very similar manner as Appe Mail.app templates, I have made a folder 
>>> with some mail templates
>>> 
>>> 3) Email Sending
>>> 
>>> The user can Send an email using a web form that contains an html editor or 
>>> can send an article published in the website (in my case), I also handle 
>>> attchments sending them as links.
>>> I have a Class called MailTask that take care of sending email in a 
>>> separate Thread while the user can continue to use the webapp/website, and 
>>> can evantually close session without stopping sending.
>>> 
>>> 4) Email Read checking
>>> 
>>> The MailTask thread personalize each email with a special blank image ( 1px 
>>> ) that call a Direct Action that set a timestamp to the MailRecipient raw 
>>> so you know when that email address had last access.
>>> 
>>> Please see screenshots at: 
>>> http://downloads.insigno.net/Amedeo/MailingList.pdf
>>> 
>>> Please le me know what you think about this and if you have some ideas to 
>>> improve this work. Actually is still not an indipendent framework, but i'm 
>>> working to make it universal and share it with wo community.
>>> 
>>> Regards
>>> Amedeo
>>> 
>>> On 10/feb/2010, at 19.44, Tusker wrote:
>>> 
>>>> Hi,
>>>> 
>>>> Is there any webobjects api which will allow sending out mass amounts of 
>>>> custom emails (~200K / week) and also handles the bounces?  I know there 
>>>> are some stand-alone applications which do just that, but I need this 
>>>> integrated tightly with WO and to work with my EOF data.  Should I use 
>>>> Project Wonder ERJavaMail and will it be able to handle the number of 
>>>> emails we plan on sending out?  Any suggestions or ideas would be greatly 
>>>> appreciated.
>>>> 
>>>> Thanks,
>>>> M
>>>> _______________________________________________
>>>> Do not post admin requests to the list. They will be ignored.
>>>> Webobjects-dev mailing list      ([email protected])
>>>> Help/Unsubscribe/Update your Subscription:
>>>> http://lists.apple.com/mailman/options/webobjects-dev/amedeomailing%40insigno.it
>>>> 
>>>> This email sent to [email protected]
>>>> 
>>> 
>> 
>> 
> 
> _______________________________________________
> Do not post admin requests to the list. They will be ignored.
> Webobjects-dev mailing list      ([email protected])
> Help/Unsubscribe/Update your Subscription:
> http://lists.apple.com/mailman/options/webobjects-dev/probert%40macti.ca
> 
> This email sent to [email protected]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to