On Wed, Dec 26, 2012 at 4:18 PM, Vincent Massol <[email protected]> wrote:
> > On Dec 26, 2012, at 4:01 PM, Thomas Delafosse <[email protected]> > wrote: > > > On Wed, Dec 26, 2012 at 3:23 PM, Vincent Massol <[email protected]> > wrote: > > > >> > >> On Dec 26, 2012, at 3:15 PM, Thomas Delafosse < > [email protected]> > >> wrote: > >> > >>> Ok, so I would rather have a component API like > >>> > >>> - Mail prepareMail(from, to, cc, bcc, subject) > >> > >> createMail is better than prepareMail IMO. > >> > >> I'd make the cc and bcc not part of the constructor and instead move > them > >> as setters since they're optional. > >> > >>> - int sendMail(Mail mail) > >> > >> Either that or add a send() method in Mail. > >> > >>> while the methods addToContent, addHtml, addAttachment, etc... would be > >>> directly used from the Mail class. > >> > >> I don't understand what addToContent is and what different it has to > >> addHtml. > >> > > > > addToContent (String mimeType, String partToAdd) is more generic : you > > specify the Mime Type of the part you want to add. So addHtml(String s) > is > > just the same as addToContent("text/html", s). But as most of the time > you > > add only Html or text, I was thinking it was better to have a specific > > method to add an Html part in the scripting API. I can do the same with a > > addTextContent method. > > I think I prefer addContent instead of addToContent. > > So just to be sure, doing the following will work: > > addContent("content1", "text") > addContent("content2", "text") > addContent("content3", "html") > > right? > > It's going to create a multipart email? > > Yes, I add a BodyPart to my global mail multipart every time I call addContent. > I think a single addContent method is good enough, passing an enum as the > second parameter (the mimetype). Enums are magically constructed from > velocity with our custom uberspector. > > >> Can I call addContent several times? > >> > > > > Yes, so for example if you want to have an email with an html part and a > > calendar part, you call addToContent("text/html", html Text) and then > > addToContent("text/calendar", calendar Code). > > > > > >> > >>> So a use-case would rather be : > >>> {{velocity}} > >>> $mail = $services.mailSender.prepareMail(from, to,...) > >>> $mail.addHtml('<p>Blabla</p>') > >> > >> addHTMLContent would be nicer. So you need also a addTextContent? > >> why not have an addContent(String, boolean isHTML) > >> or a more generic addContent(String, String mimeType) > >> or both > >> > >>> $mail.addCalendar() > >> > >> What is a calendar? > >> > > > > It is either a vCalendar or an iCalendar (it is used by Gmail to send > > invitations). It corresponds to the Mime Type "text/calendar". Here again > > addCalendar(String calendar) is just the same as > > addToContent("text/calendar", calendar). It's just to make it easier to > > use. > > ok. So I think in the future we could add some calendar helper that will > create the calendar string information. > > For now this is good enough IMO: > addContent("calendar info content as per RFC 2445", "calendar") > > And then later on something like: > > addContent($mailsender.createCalendarMimeTypeData(param1, param2, ….), > "calendar") > Yes. Anyway I was already thinking about doing something like that for my "Meetings" application :) Thanks > > >> You should also show an example when using the Java API. > >> > > > > On Java it would give something like : > > > > @Inject > > private MailSender mailSender > > > > Mail mail = this.mailSender.newMail(from,to,subject) ; > > I don't like this too much. Why not use a constructor on the Mail object? > Yes you're right, I can just do Mail mail = new Mail(from, to, subject). I was just getting confused with the components :). > > (The other option is a perlookup component is you really need to have some > other components injected in the Mail object; in that case you'll need > setters to from/to/subject since we currently don't support constructor > injection). > > > String htmlCode = "<p>Blabla</p>" ; > > String calendar = "BEGIN VCALENDAR... END VCALENDAR" ; > > mail.addToContent("text/html", htmlCode) ; > > mail.addToContent("text/calendar", calendar) ; > > this.mailSender.sendMail(mail) ; > > why sendMail and not send? We're in a MailSender component so we know > we're sending mail already ;) > Indeed ! I will make an effort on the naming of my methods. > > Thanks > -Vincent > > >> Thanks > >> -Vincent > >> > >>> $services.mailSender.sendMail($mail) > >>> {{/velocity}} > >>> > >>> Thanks, > >>> > >>> Thomas > >>> > >>> On Wed, Dec 26, 2012 at 3:04 PM, Vincent Massol <[email protected]> > >> wrote: > >>> > >>>> Hi Thomas, > >>>> > >>>> On Dec 26, 2012, at 2:58 PM, Thomas Delafosse < > >> [email protected]> > >>>> wrote: > >>>> > >>>>> I've been thinking a bit more on the mailSender component, and here's > >> the > >>>>> APIs I have in mind : > >>>>> > >>>>> The component API would have the following methods : > >>>>> - void prepareMail(String from, String to, String cc, String bcc, > >> String > >>>>> subject) > >>>>> - void addToContent(String contentType, String content) //To add a > >>>> part > >>>>> to the mail, contentType being the Mime Type of this part > >>>>> - void addAttachment(Attachment file) > >>>>> - int sendMail() //Returns 1 on success and 0 otherwise > >>>>> > >>>>> And the scripting API would have the following : > >>>>> - void prepareMail(String from, String to, String cc, String bcc, > >> String > >>>>> subject) > >>>>> - void addToContent(String contentType, String content) > >>>>> - void addHtml(String content) > >>>>> - void addCalendar(String vCalendar) > >>>>> - int sendMail() > >>>>> - int sendHtmlMail(String from, String to, String subject, String > html, > >>>>> String alternativeText) //Simple method for non-experienced users > >>>> sending > >>>>> a simple html mail > >>>>> { > >>>>> this.mailSender.prepareMail(from, to, null, null, subject) ; > >>>>> this.mailSender.addToContent("text/html", html) ; > >>>>> this.mailSender.addToContent("text/plain", alternativeText); > >>>>> return this.mailSender.sendMail() ; > >>>>> } > >>>>> > >>>>> So, a simple use-case would look something like : > >>>>> {{velocity}} > >>>>> $services.mailSender.prepareMail("[email protected]", "[email protected]", "", > "", > >>>>> "Subject") > >>>>> $services.mailSender.addHtml("<strong>This is an email with a > >>>>> calendar</strong>") > >>>>> $services.mailSender.addCalendar($calendar) > >>>>> $services.mailSender.sendMail() > >>>>> {{/velocity}} > >>>> > >>>> This is not very good because you're making the service stateful and > >>>> services mist absolutely be stateless. They need to be able to be used > >> by > >>>> several threads and not hold any state. Your API calls must return > some > >>>> object if you want to have several calls. > >>>> > >>>> Thanks > >>>> -Vincent > >>>> > >>>>> > >>>>> What do you think ? Is there anything you think is missing ? In > >>>> peticular, > >>>>> I'm wondering whether it would be useful to recreate methods similar > to > >>>> the > >>>>> parseRawMessage() and sendMailFromTemplate() methods that were > >>>> implemented > >>>>> in the former mailSender ? > >>>>> > >>>>> Cheers, > >>>>> > >>>>> Thomas > >>>>> > >>>>> > >>>>> On Thu, Dec 20, 2012 at 7:00 PM, Sergiu Dumitriu <[email protected]> > >>>> wrote: > >>>>> > >>>>>> On 12/20/2012 06:55 AM, Thomas Delafosse wrote: > >>>>>>> Hi all, > >>>>>>> > >>>>>>> I would be happy to work on the mailSender plugin. > >>>>>>> I propose to make it a component and add it a few functionalities. > >>>>>> Namely, > >>>>>>> I was thinking about adding an API like: > >>>>>>> public int sendMultiContentMessage (String from, String to, String > >> cc, > >>>>>>> String bcc, String subject, String[] contents, List<Attachment> > >>>>>>> attachments) (1) > >>>>>> > >>>>>> Methods with too many arguments are not recommended. It even breaks > >> our > >>>>>> checkstyle, which allows at most 7 parameters (which I think is too > >>>>>> much, anyway). Listing possible mail tokens is bad, since in most > >> cases > >>>>>> not all of them are needed, and in some cases others will be needed > >> with > >>>>>> no way of specifying them, other than writing the whole message > >>>>>> including headers by hand. > >>>>>> > >>>>>> Either use a typed object, or a generic map. > >>>>>> > >>>>>>> where contents would be a string array containing all the contents > to > >>>> be > >>>>>>> embed in the mail (text, html but also a vCalendar for example) > along > >>>>>> with > >>>>>>> their MIME type. > >>>>>>> So for example, if you want to send a mail containing some html > part > >>>> and > >>>>>> a > >>>>>>> vCalendar, "contents" would look something like : > >>>>>>> contents = ['text/html', Your Html code, 'text/calendar', Your > >>>>>> vCalendar] . > >>>>>> > >>>>>> This is an untyped convention. You're hoping that all users will > read > >>>>>> the documentation and know that they're supposed to provide pairs of > >>>>>> values, MIME + content. That's not a nice thing to do. A list of > typed > >>>>>> objects would be better, since it doesn't allow mistakes. > >>>>>> > >>>>>>> Another way to achieve this would be to use a single String "body" > >>>>>> instead > >>>>>>> of "contents", with a specific syntax indicating each part MIME > type, > >>>>>> thus > >>>>>>> allowing us to parse it. For example we could imagine having > >> something > >>>>>> like > >>>>>>> : > >>>>>>> public int sendMultiContentMessage (String from, String to, String > >> cc, > >>>>>>> String bcc, String subject, String body, List<Attachment> > >> attachments) > >>>>>> with > >>>>>>> body = "{{html}}HTML code{{/html}} {{calendar}}Calendar > >>>>>> code{{/calendar}}" > >>>>>>> (2) or even > >>>>>>> body = "{{mailPart type='text/html'}}HTML code{{/mailPart}} > >> {{mailPart > >>>>>>> type="text/calendar"}}Calendar code{{/mailPart}}" (3). > >>>>>>> This would be easier to use ((2) most of all), but probably > trickier, > >>>>>>> slower and for (2), less flexible. > >>>>>> > >>>>>> I don't like this either, it's even more error prone. > >>>>>> > >>>>>> Java is an OOP language, use good OOP design as much as possible. > >>>>>> > >>>>>>> WDYT ? And of course, if there is anything else you would like to > >>>> change > >>>>>> in > >>>>>>> the mailSender, let me know ! > >>>>>>> > >>>>>>> Thomas > _______________________________________________ > devs mailing list > [email protected] > http://lists.xwiki.org/mailman/listinfo/devs > _______________________________________________ devs mailing list [email protected] http://lists.xwiki.org/mailman/listinfo/devs

