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?

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")

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

(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 ;)

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

Reply via email to