ConcurrentLinkedQueue to unmodifiable list
Lists.newArrayList will allocate a new list (as the name indicates) so there is no reason to wrap it in a Collections.unmodifiableList.

What you have is a defensive copy. This won't allow propagation of changes back to the queue, but requires you to get a new list each time you want an update.

If you still want a queue backed view then you should return Collections.unmodifiableCollection:

public Collection&lt;MimeMessage&gt; getMailsToSend() {
    return Collections.unmodifiableCollection(mailsToSend);
}


This has the downside that only way to get all items from a generic Collection is using the iterator or the toArray methods. Though each time you call it on them you get an up to date view (with the same caveats of the same methods of the queue).