Mrs
> Documentation > Add-on: Message Remote Services
- Depuis adullact.net
Message Remote Services is an add-on for Mozilla Thunderbird 2 which exposes remote services to external processes.
A Java API to communicate with this add-on is available. Thus, an external Java program can use a running instance of Thunderbird installed on the same OS.
Features:
- Send emails.
- Browse/Receive emails.
Sommaire
Requirements
Current version requires Trustedbird 2.
Configuration
To configure, right-click on the extension in the Add-ons window.
- Services can be enabled at startup. This feature can be switched off.
- When this feature is changed, Thunderbird must be restarted.
Java API
The Message Remote Services add-on exposes services which can be called by another application.
This application uses MRS Java API to call these services.
The MRS API is composed of a JAR File (MessageRemoteServices.jar) to be included in the application. The library lib/commons-io-1.4.jar must be installed.
API initialization and services creation
import org.milimail.messageRemoteServiceAPI.init.*;
import org.milimail.messageRemoteServiceAPI.compose.*;
import org.milimail.messageRemoteServiceAPI.account.*;
public static void main(String[] args) {
ServiceCreator serviceCreator = API.init();
MessageComposeServiceProxy composeService = serviceCreator.createMessageComposeService();
AccountServiceProxy accountService = serviceCreator.createAccountService();
MessageBrowseServiceProxy browseService = serviceCreator.createBrowseService();
}
Account Service
//Call to the running Thunderbird, Get all Accounts for the current profile
List<Account> accounts = accountService.GetAllAccounts();
for (Account account : accounts) {
//Server Imap Name
String serverName = account.getServerHostName();
//Account Id
String key = account.getKey();
System.out.println(serverName + " " + key);
}
Compose Service
Send a simple message to a recipient.
ServiceCreator serviceCreator = API.init(); MessageComposeServiceProxy composeService = serviceCreator.createMessageComposeService(); AccountServiceProxy accountService = serviceCreator.createAccountService(); //Simple implementation of MessageSendListener interface which print the Send status MessageSendListener messageListener = serviceCreator
.createMessageSendListener(new MessageSendListenerServantConsole());
//Take the second Thunderbird's account for the current profile
Account account = accountService.GetAllAccounts().get(1);
//Create the message to send
Message message = new Message();
message.setSubject("Subject from API");
message.setBody("body from API");
String[] to = { "user2@test.milimail.org" };
message.setTo(to);
//Call to Thunderbird, Callback to messageListener (print status to console)
composeService.sendMessage(account, message, messageListener);
- Encrypt message
Security security = new Security(); security.setEncrypted(true); message.setSecurity(security);
- Sign message
Security security = new Security(); security.setSigned(true); message.setSecurity(security);
- Header
List<Header> headers = new ArrayList<Header>();
Header header0 = new Header();
header0.setKey("X-MRS-TEST-1");
header0.setValue("X-MRS-VALUE-1");
headers.add(header0);
message.setHeaders(headers);
- MDN Read receipt
Notification notification = new Notification(); notification.setMDNReadRequested(true); message.setNotification(notification);
- DSN Delivery receipt
//Only with milimail (thunderbird 2.x patched) Notification notification = new Notification(); notification.setDSNRequested(true); DSNType type = new DSNType(); //RET=FULL else RET=HDRS type.setReturnFullHDRRequested(true); //You can mix the three options type.setOnSuccessRequested(true); type.setOnDelayRequested(true); type.setOnFailureRequested(true); notification.setDsnType(type); message.setNotification(notification);
//Only with milimail (thunderbird 2.x patched) Notification notification = new Notification(); notification.setDSNRequested(true); DSNType type = new DSNType(); //RET=FULL else RET=HDRS type.setReturnFullHDRRequested(false); //NOTIFY=NEVER type.setNeverRequested(true); notification.setDsnType(type); message.setNotification(notification);
- Attachments
List<Attachment> attachments = new ArrayList<Attachment>();
Attachment attachment0 = new Attachment();
attachment0 = new Attachment();
attachment0.setDirPath("/tmp/res/");
attachment0.setFileName("attachment1.txt");
attachment0.setMimeType("text/plain");
attachments.add(attachment0);
message.setAttachments(attachments);
Browse Service
Get Inbox Folder :
ServiceCreator serviceCreator = API.init();
MessageBrowseServiceProxy browseService = serviceCreator.createBrowseService();
FolderHolder folderHolder = new FolderHolder();
browseService.getRootFolder(account, folderHolder);
Folder folder = folderHolder.getValue();
System.out.println("inbox folder name : " + folder.getName());
Get Local Folder :
FolderHolder folderHolder = new FolderHolder();
browseService.getLocalFolder(folderHolder);
Folder folder = folderHolder.getValue();
System.out.println("local folder name : " + folder.getName());
Get all folders, children of one folder
FoldersHolder foldersHolder = new FoldersHolder(); browseService.getAllFolders(fatherFolder, foldersHolder); Folder[] folders = foldersHolder.getValue();
Get all message handlers of a folder, the message handlers contain all important information of the messages but not their content.
MessageHandlersHolder messageHandlersHolder = new MessageHandlersHolder();
browseService.getMessageHandlers(folder, messageHandlersHolder);
MessageHandler[] handlers = messageHandlersHolder.getValue();
for (int i = 0; i < handlers.length; i++) {
System.out.println(handlers.getSubject());
}
Get raw Source of the message
//You have to subclass abstract class SourceListenerPOA,
//because the process to get mail from Thunderbird is asynchronous
sourceMessageListener = serviceCreator.createSourceMessageListener(new SourceListenerPOA() {
public void OnLoad(byte[] source) {
String sourceString = new String(source);
System.out.println(sourceString);
}
});
browseService.getSource(handler, sourceMessageListener);
Get Javamail MimeMessage of the message (decrypted if necessary)
//You have to subclass abstract class AbstractMimeMessageListener,
//because the process to get mail from Thunderbird is asynchronous
sourceMessageListener = serviceCreator.createSourceMessageListener(new AbstractMimeMessageListener() {
@Override
public void onLoad(MimeMessage mimeMessage) {
//Do your job, this a Javamail MimeMessage
}
});
browseService.getDecryptedSource(handler, sourceMessageListener);

