Hi,
Reviving this thread, because I wonder how multiparts are managed ...
More precisely, nowhere in current mailsender API do we choose the type of
multipart to manage (ie, multipart/mixed, multipart/alternative...). From
what is said above, and the api signatures, it seems that by default the
component will generate mails with multipart/alternative content, which may
be most common use-case.
If it's multipart/alternative, then calling:
$mail.addContent("text1", "plain/text")
$mail.addContent("text2", "plain/text")
$mail.addContent("text3", "plain/html")
... has very little meaning. A multipart alternative is supposed to present
alternative representations of the same information, most usual use-case
being to provide text and html parts. The client is supposed to display the
last part he can handle (ie, pure text client would display the text part,
and html capable client will display the html part).
When there are several calls to addContent(...) for the same content type,
is provided text appended to content already present in existing part ?
Ie, in sample above, I would get an email with a plain/text part containing
"text1text2" and an html part with "text3" ?
If text/plain parts are added instead of concatenated, then in sample
below, it would mean that "text2" would obliterate "text1" added
before, as
it will maybe never be displayed by the client (depending on how the client
interprets this case).
Another thing, when you add html content to an email, it's usually for its
better formatting features compared to plain text. A common use-case (for
example, if you want to send a newsletter), is to include some images in
the html page sent.
To do that, you can't just provide the html content, then some attached
images. Doing that you can only send an html page (without inline images)
and images attached. To send an html document with inline image, you need
to send a multipart/related, instead of a "text/html" part, and generate
content-ids for each image/attachment.
Is it managed by the mail sender ?
By the way it would be quite nice, to be able to round-trip between an
XWiki page content (html) and a multipart/related part. I wonder how it is
managed by Newsletter Application...
Note: concerning the "mail parser" implemented in Mail Archive app,
currently, it does not differentiate multipart/related,
multipart/alternative and multipart/mixed. The same process applies: all
"text/html" parts are parsed into a unique concatenated html content, all
"text/plain" parts are parsed into a unique concatenated pure text content.
If some attachments have content-ids, their reference are replaced in the
html content by a link to proper attached file. This almost respects
RFC1341, in that it almost considers all multiparts as "mixed" (but not in
sequence, as text and html are grouped together). The resulting display is
fine in 99,99% of cases, as far as I tested.
BR,
Jeremie
2013/1/7 Thomas Mortagne <thomas.mortagne(a)xwiki.com>
On Mon, Jan 7, 2013 at 12:12 AM, Vincent Massol
<vincent(a)massol.net>
wrote:
On Jan 6, 2013, at 10:54 PM, Thomas Delafosse <
thomas.delafosse(a)xwiki.com>
wrote:
> The advantage of jSoup is that it handles the problems I could have if
the
html part
is not well written,
Actually this is exactly what the XWiki HTML parser does too :)
I really think you should use our parser.
Plus de HTML parser is very important so the more we test it the better.
Thanks
-Vincent
> so I was thinking it was more secure to use
> it than just parsing the "<>" in the html part . But I must admit
that I
> haven't had a close look on the xwiki renderers, and if there are some
that
do it
well, I should probably rather use them... I will give it a closer
look tomorrow.
>
> Cheers,
>
> Thomas
>
> On Sun, Jan 6, 2013 at 8:53 AM, Jeremie BOUSQUET <
jeremie.bousquet(a)gmail.com
>> wrote:
>
>> Le 2 janv. 2013 18:44, "Thomas Delafosse"
<thomas.delafosse(a)xwiki.com>
a
>> écrit :
>>>
>>> On Fri, Dec 28, 2012 at 9:01 PM, Sergiu Dumitriu <sergiu(a)xwiki.org>
>> wrote:
>>>
>>>> On 12/26/2012 10:18 AM, Vincent Massol wrote:
>>>>>
>>>>> On Dec 26, 2012, at 4:01 PM, Thomas Delafosse <
>>>> thomas.delafosse(a)xwiki.com> wrote:
>>>>>
>>>>>> On Wed, Dec 26, 2012 at 3:23 PM, Vincent Massol <
vincent(a)massol.net
>>>
>>>> wrote:
>>>>>>
>>>>>>>
>>>>>>> On Dec 26, 2012, at 3:15 PM, Thomas Delafosse <
>>>> thomas.delafosse(a)xwiki.com>
>>>>>>> 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.
>>>>
>>>> -1 for enums. That limits the possible content types we can add.
>>>>
>>>
>>> I agree on that point : there are simpler methods such as
>>> $services.mailSender.sendHtmlMail(from, to, subject, html,
alternative)
>> for
>>> people who don't know much about mimeTypes, so it would be a shame to
>> limit
>>> this method.
>>>
>>>>
>>>> I prefer:
>>>>
>>>> addMimePart(String content, string mimeType)
>>>>
>>>>
>>> So far it's exactly the way my addContent method works. But I can
change
>>> its name to addMimePart if you
prefer.
>>>
>>>
>>>> There's also a MimePart in the standard javax.mail library, and we
>> could
>>>> actually use this one, since it's more standard, and more flexible:
>>>>
>>>>
>>
http://javamail.kenai.com/nonav/javadocs/javax/mail/internet/MimePart.html
>>>>
>>>>
>>>>
>>
>>
http://javamail.kenai.com/nonav/javadocs/javax/mail/internet/MimeBodyPart.h…
>>>>
>>>> But this might be a bit too verbose and complex to use.
>>>>
>>>> I hope that the implementation will be smart enough to send a plain
>>>> message when only one body part (of type text or html) is present.
>>>>
>>>>
>>> If there is only a text or html part to the mail, I add an alternative
>>> text/plain part to the mail, using jSoup to convert the html content
into
>>> text, if it's what you mean.
>>
>> On mail reader side, I used xwiki parsers/renderers to convert html to
>> plain text. What is added value of jsoup ?
>>
>>>
>>>>>> 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.
>>>>
>>>> -1 for a specific addCalendar method. Why not addVCard, addImage,
>>>> addPDF, addDoc and so on? This makes a stuffed API, where anything
that
>>>> doesn't have a dedicated API
method will feel like a second-class
>>>> citizen.
>>>
>>>
>>>>> 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?
>>>>
>>>> Constructors are bad, in a component-based world. I'd rather have
the
>>>> Mail object an interface, with an internal implementation used by the
>>>> MailSender implementation.
>>>>
>>>>> (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
;)
>>>>
>>>> +1 for send.
>>>>
>>>> By the way, I've put a first version of my component on github :
>>>
https://github.com/tdelafosse/mailSender. Feel free to have a look
and
> to
>> tell me if there's things to change / add / enhance.
>>
>> Cheers,
>>
>> Thomas
_______________________________________________
devs mailing list
devs(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs
--
Thomas Mortagne
_______________________________________________
devs mailing list
devs(a)xwiki.org
http://lists.xwiki.org/mailman/listinfo/devs