Finally, I did it myself, and I am posting it here to help people looking for a solution to my problem.
I decided to use tags to specify a group of emails, thus the same contact can be part of several groups simply by tagging it several times.
Here is an example of contacts file:
* John Doe :MailingListA:GroupB:
:PROPERTIES:
:EMAIL: john.doe@example.com
:NICK:
:DESCRIPTION:
:BIRTHDAY:
:END:
* Nick Smith :GroupB:
:PROPERTIES:
:EMAIL: nick.smith@aaaa.bb
:NICK:
:DESCRIPTION:
:BIRTHDAY:
:END:
* Rick Armstrong :MailingListA:
:PROPERTIES:
:EMAIL: rick.armstrong@bbbb.dd
:NICK:
:DESCRIPTION:
:BIRTHDAY:
:END:
And here is the code for parsing it and putting it in the current buffer:
(defun my-contact-extract-all (elem)
(let ((lname (nth 0 elem))
(ladd (cdr (assoc "EMAIL" (nth 2 elem)))))
(concat lname " <" ladd ">")))
(defun get-mailing-list-from-tag(tag)
(let ((my-list (org-contacts-filter nil tag nil)))
(mapconcat 'my-contact-extract-all my-list ", ")))
(defun org-contacts-get-list-from-tag (tag)
"Returns a string containing all addresses from all contacts with a certain TAG"
(interactive "sEnter tag:")
(message (get-mailing-list-from-tag tag))
(insert (get-mailing-list-from-tag tag)))
If you have suggestion on improvements to my code, please post a comment below.