Package Name | Comment |
com.mycom | |
org.columa.core.config | |
org.columba.addressbook.config |
Addressbook configuration files.
See our wiki for a complete reference
of all configuration options.
Configuration files can be found in /addressbook. This includes
currently options.xml, tree.xml and main_toolbar.xml.
All config-files can be accessed in using AddressbookConfig.get(String) method.
|
org.columba.addressbook.facade |
Facade pattern interface providing outside plugins access to subsystems of
the addressbook.
|
org.columba.addressbook.folder |
Contact and Group folder storage facility
|
org.columba.addressbook.folder.importfilter |
Plugin support for importing contacts to Columba.
|
org.columba.addressbook.folder.virtual | |
org.columba.addressbook.gui.action |
Actions for adding/removing and editing contacts.
|
org.columba.addressbook.gui.autocomplete | |
org.columba.addressbook.gui.base | |
org.columba.addressbook.gui.context | |
org.columba.addressbook.gui.dialog.contact |
Contact editing dialog
|
org.columba.addressbook.gui.dialog.group | |
org.columba.addressbook.gui.dialog.importfilter |
Contact import wizard
|
org.columba.addressbook.gui.focus | |
org.columba.addressbook.gui.frame |
Addressbook specific enhancements for the core frame
|
org.columba.addressbook.gui.list | |
org.columba.addressbook.gui.search | |
org.columba.addressbook.gui.table |
Table gui component showing list of contacts and group cards
|
org.columba.addressbook.gui.table.model | |
org.columba.addressbook.gui.table.renderer | |
org.columba.addressbook.gui.tagging | |
org.columba.addressbook.gui.tree |
Tree component managing all addressbook folders.
|
org.columba.addressbook.gui.tree.util |
Select Addressbook Dialog and diverse helper classes.
|
org.columba.addressbook.gui.util |
Helper classes for the addressbook gui.
|
org.columba.addressbook.main |
Addressbook component main entrypoint.
|
org.columba.addressbook.model | |
org.columba.addressbook.parser |
Parsers for email address, address lists and vcard
|
org.columba.addressbook.plugin | |
org.columba.addressbook.resourceloader | |
org.columba.addressbook.shutdown |
Clean up background tasks.
|
org.columba.addressbook.util |
General helper classes, including resource loader.
|
org.columba.api.backgroundtask | |
org.columba.api.command | |
org.columba.api.desktop | |
org.columba.api.exception | |
org.columba.api.gui | |
org.columba.api.gui.frame | |
org.columba.api.gui.frame.event | |
org.columba.api.plugin | |
org.columba.api.selection | |
org.columba.api.shutdown | |
org.columba.api.statusbar | |
org.columba.calendar |
Main entry point for calendar component in Columba framework.
|
org.columba.calendar.base | |
org.columba.calendar.base.api | |
org.columba.calendar.command |
Provides commands triggered by Swing actions.
|
org.columba.calendar.config |
Provides Configuration handling.
|
org.columba.calendar.config.api | |
org.columba.calendar.context | |
org.columba.calendar.facade | |
org.columba.calendar.model |
Provides models of calendar data.
|
org.columba.calendar.model.api | |
org.columba.calendar.parser | |
org.columba.calendar.resourceloader | |
org.columba.calendar.search | |
org.columba.calendar.store |
Calendar storage
|
org.columba.calendar.store.api | |
org.columba.calendar.ui.action |
Swing actions shared by menuitems and toolbar buttons.
|
org.columba.calendar.ui.action.api | |
org.columba.calendar.ui.base | |
org.columba.calendar.ui.box | |
org.columba.calendar.ui.calendar |
Main calendar component supporting different view modes, including day, week, work week
and month.
|
org.columba.calendar.ui.calendar.api | |
org.columba.calendar.ui.comp |
Provides useful controls/widgets
|
org.columba.calendar.ui.dialog |
Provides common dialogs.
|
org.columba.calendar.ui.frame |
Main frame mediator managing all other components.
|
org.columba.calendar.ui.frame.api | |
org.columba.calendar.ui.list |
Tree providing a hierachy view of all calendars and categories.
|
org.columba.calendar.ui.list.api | |
org.columba.calendar.ui.navigation |
Calendar navigation view.
|
org.columba.calendar.ui.navigation.api | |
org.columba.calendar.ui.search | |
org.columba.calendar.ui.tagging | |
org.columba.chat | |
org.columba.chat.base | |
org.columba.chat.command | |
org.columba.chat.config | |
org.columba.chat.config.api | |
org.columba.chat.conn.api | |
org.columba.chat.model | |
org.columba.chat.model.api | |
org.columba.chat.resourceloader | |
org.columba.chat.ui.action | |
org.columba.chat.ui.conversation | |
org.columba.chat.ui.conversation.api | |
org.columba.chat.ui.dialog | |
org.columba.chat.ui.frame | |
org.columba.chat.ui.frame.api | |
org.columba.chat.ui.presence | |
org.columba.chat.ui.presence.api | |
org.columba.chat.ui.roaster | |
org.columba.chat.ui.roaster.api | |
org.columba.contact.gui.box | |
org.columba.contact.search | |
org.columba.core.association | |
org.columba.core.association.api | |
org.columba.core.associations | |
org.columba.core.backgroundtask |
Background tasks management
|
org.columba.core.base | |
org.columba.core.charset |
Character encoding handling.
See
Supported Encodings.
|
org.columba.core.command |
Scheduler/Dispatcher for a multi-threaded application.
Columba uses the CommandReference pattern. Where {@link Command} instances are decoupled
from their References ({@link DefaultCommandReference}).
Actions ({@link FrameAction}) start Commands and pass the appropriate Reference to them.
This is Preclaiming Scheduler implementation. Meaning tasks get queued until
all resources they need are free at once. Which is no problem, because for
example a "copy message from folder a to folder b" operation needs only two
resources: folder a and folder b.
The org.columba.core.command.Command class has two methods. Execute() is for
time consuming background tasks, updateGUI() is called after the execute-method
is finished (the thread is finished). The nice thing about updateGUI() is that is called
in the awt-event dispatcher thread. It is therefore thread-safe, and can be used to
update the gui.
Note, that execute() has {@link Worker} in its signature, which has a couple of methods
to display a text in the {@link Statusbar}, or updating the progressbar.
Worker registers at the {@link Taskmanager}, which is basically the model for
{@link Statusbar}.
We use an easy listener pattern to register all the workers.
This makes it easy for commands to send status updates.
Then we have actions in org.columba.core.action. These provide the glue between
the gui-elements and the commands. An action initializes a command and passes it
along to the Processor (task scheduler {@link DefaultProcessor}) to execute.
You can find many examples in the packages ending with "action" and "command".
Adapting, this schema should be pretty easy for developers.
|
org.columba.core.component | |
org.columba.core.component.api | |
org.columba.core.config |
XML-based configuration management.
All config files are registered at {@link Config}.
{@link MailConfig} and {@link AddressbookConfig} are just helper classes which register
their configuration files at {@link Config}. This can be seen in the configuration directory
structure of the user's configuration directory. Where mail and addressbook have their
own folders for storing preferences.
Example on how to get a {@link XmlElement}xml treenode:
XmlElement gui = MainInterface.config.get("options").getElement("/options/gui");
This would address the file options.xml . Following a little example
on how this file would look like:
<?xml version="1.0" encoding="UTF-8"?>
<options>
<gui enabled="true">
.. your options here
</gui>
</options>
|
org.columba.core.connectionstate | |
org.columba.core.context | |
org.columba.core.context.api | |
org.columba.core.context.base | |
org.columba.core.context.base.api | |
org.columba.core.context.semantic | |
org.columba.core.context.semantic.api | |
org.columba.core.desktop | |
org.columba.core.facade |
Interfaces for external plugins wanting to access Columba's internal subcomponents.
Using the Facade pattern.
|
org.columba.core.filemonitor | |
org.columba.core.filter | |
org.columba.core.folder | |
org.columba.core.folder.api | |
org.columba.core.gui.action |
Actions all components of Columba share.
|
org.columba.core.gui.base | |
org.columba.core.gui.config |
General Options Dialog for changing global options.
This includes language, toolbar style, Look and Feel, font settings, etc.
|
org.columba.core.gui.context | |
org.columba.core.gui.dialog | |
org.columba.core.gui.docking | |
org.columba.core.gui.docking.event | |
org.columba.core.gui.exception | |
org.columba.core.gui.externaltools |
Configuration dialog and wizard for external application integration.
|
org.columba.core.gui.frame |
Model-View-Controller based frame package.
All components use this package to which creates a simple frame with basic
menu, toolbar and statusbar. Mail and addressbook plug themselves in this
frame and provide customized functionality.
It would be a good idea to provide a framework, which distinguishs
multiview from singleview frames. Depending on what you like you could
just extend the correct class.
|
org.columba.core.gui.frame.api | |
org.columba.core.gui.globalactions | |
org.columba.core.gui.htmlviewer | |
org.columba.core.gui.htmlviewer.api | |
org.columba.core.gui.logdisplay | |
org.columba.core.gui.menu |
Swing Menus get generated using customizable XML configuration files
org.columba.core.action.menu.xml defines the core menu, mail and addressbook
define their own menu.xml, which extend the core menu.
We therefore added placeholders we called extensionpoint, which
are used by mail/addressbook to address the location where they plug
themselves in the core menu.
Note, that the swing menu code is kept separated from the code which actually
creates the menu - the generator classes.
{@link MenuPluginHandler} is responsible to handle all the plugins.
|
org.columba.core.gui.plugin |
Plugin Management dialog for adding, removing and configuring plugins.
|
org.columba.core.gui.profiles | |
org.columba.core.gui.scripting | |
org.columba.core.gui.search | |
org.columba.core.gui.search.api | |
org.columba.core.gui.statusbar |
Swing based statusbar component used by all frames.
|
org.columba.core.gui.tagging | |
org.columba.core.gui.themes |
Look and Feel plugin entrypoint
|
org.columba.core.gui.themes.plugin |
Look and Feel default plugins shipped with Columba.
|
org.columba.core.gui.toolbar |
Swing based Toolbar component used by all frames
The toolbar is created, by using the toolbar.xml file and the actions
classes already used to create the menus.
As with the menus mail/addressbook just extend the toolbar.
|
org.columba.core.gui.trayicon | |
org.columba.core.gui.util |
Miscellanious swing additions
|
org.columba.core.help |
Online help framework using JavaHelp.
Adding context-specific help to a button
HelpManager.enableHelpOnButton(helpButton, "configuring_columba");
This associates the help button (JButton) with the topic ID.
Looking up topic ID
See the file jhelpmap.jhm, which associates topic IDs with html files.
All files can be found in package lib/usermanual.jar.
I've used a very general schema to generate topic IDs.
Following a couple of examples, so you don't need to lookup every
single topic ID:
- index -> index (index.html)
- introduction -> introduction (ch01.html)
- installation -> installing (ch02.html)
- installation_1 -> installating-windows (ch02.html)
- installation_2 -> installating-linux (ch02_2.html)
- installation_3 -> installating-generic (ch02_3.html)
- using_columba_composing_new_email_messages_2 -> composing new email messages (ch04s03.html)
Note that subsections are numbered where sections have names. The last
examples is a very interesting one:
"using_columba" -> section
"composing_new_email_messages" ->first subsection
"2" ->second subsection
Hope you get the idea!
|
org.columba.core.htmleditor.api | |
org.columba.core.htmlviewer | |
org.columba.core.io |
File and Directory Input/Output utilities
|
org.columba.core.logging |
Looging facility using log4j from http://www.apache.org.
Note, that we are most probably replacing log4j with the java.util.logging
package already shipped with jdk1.4
|
org.columba.core.main |
Main program entrypoint for Columba.
|
org.columba.core.plugin |
Plugin Framework
The extensibility system provides a framework for both, providing extensibility hooks,
and for extending the functionality of Columba.
A plugin is a bundle of extensions. An extension provides an implementation of a
specific functionality.
The {@link IPluginManager} manages all plugins as a singleton registry. Additionally, it
is also a registry for all available extension handlers. {@link IExtensionHandler} is a
registry for extensions. It resembles an extension point or hook to extend Columba's
functionality. {@IExtension} provides the metadata, describing an extensions.
Additionally, it is responsible for instanciating an extension. Every extension must
implement the interface {@link IExtensionInterface}.
When looking at {@link IExtensionHandler}, its obvious that it simply resembles a
registry for classes. All extensions have a unique id and the classname. The
extension handler keeps a hashtable of all extensions and uses a custom classloader
to instanciate extensions.
All extension handlers use xml files which can be found in /res directory.
This is merely an easy way to specify extensions easily, without hardcoding them in
Java. A list of all extension points for the core package can be found in:
org.columba.core.plugin.pluginhandler.xml . All core extension handler
files can be found in org.columba.core.plugin .
This is an example extension handler file:
Usually, when making use of extensions in Columba, you first get an instance of the
plugin manager using PluginManager.getInstance() . Then you have to
retrieve an appropriate extension handler getHandler(id) . Using this
handler, you get the extension using IExtensionHandler.getExtension(id) .
Now, you instanciate the plugin using IExtension.instanciate() .
|
org.columba.core.print |
Printing text and html documents.
|
org.columba.core.resourceloader | |
org.columba.core.scripting | |
org.columba.core.scripting.config | |
org.columba.core.scripting.extensions | |
org.columba.core.scripting.interpreter | |
org.columba.core.scripting.model | |
org.columba.core.scripting.service | |
org.columba.core.scripting.service.api | |
org.columba.core.search | |
org.columba.core.search.api | |
org.columba.core.selection |
Selection management handlers which build an additional layer on top of the swing
framework.
|
org.columba.core.shutdown |
Shutdown manager handles the cleanup when exiting Columba.
|
org.columba.core.tagging | |
org.columba.core.tagging.api | |
org.columba.core.url.http | |
org.columba.core.util |
Miscellanious stuff
|
org.columba.core.versioninfo | |
org.columba.core.xml |
Very simple sax-based XML configuration backend.
A more complete example on using the backend:
// use a path-like navigation to get the interesting option
// first part is getting the file "options.xml" from the "mail" directory (MailOptions)
// we also have the same for addressbook -> AddressbookOptions
// second part address the xml-treenode "/options/gui/html"
XmlElement preferHtml = MailConfig.get("options").getElement("/options/gui/html");
// register as observer
preferHtml.addObserver(this);
// example of getting a property
String enableHtml = preferHtml.getAttribute("enable");
|
org.columba.mail | |
org.columba.mail.attachment.handler.example | |
org.columba.mail.command |
Provides {@link Command} and {@link CommandReference} classes for email purposes.
|
org.columba.mail.composer |
Creating email messages as specified by RFC 2822 (obsoletes RFC 822). This
includes building a message for a client program to work with the mail
datastructures as defined in org.columba.mail.message and renderering it
as clear text to allow later sending.
|
org.columba.mail.config |
Configuration files and wrapper classes.
|
org.columba.mail.connector | |
org.columba.mail.facade |
Provides access to Columba's email functionality for plugins.
|
org.columba.mail.filter |
Datastructures for email filtering, filter action handling and searching.
|
org.columba.mail.filter.plugins |
Provides filter and filter action plugins built-in Columba.
|
org.columba.mail.folder |
Provides all abstract classes for a folder-orentiented datastorage.
Every folder class subclasses {@link FolderTreeNode}, which is basically only
a mutable treenode, which uses the tree.xml configuration file as {@link TreeModel}.
Unlike {@link FolderTreeNode} which doesn't contain messages, {@link Folder} should
be subclasses by every mailbox.
{@link LocalFolder} is used by all local folders and builds a plugin-like approach
to make it easy to add new mailbox formats in the futue.
{@link FolderFactory} follows the factory pattern in providing methods to create
new folders.
|
org.columba.mail.folder.command |
Provides commands for accessing the mailbox stores.
Folder shouldn't be accessed directly. Instead we use {@link FolderCommand}, which
in conjunction with {@link FolderCommandReference} provide a looking facility.
This makes sure that only one {@link Command} at a time can modify the folder's
data.
As explained in org.columba.command, {@link DefaultProcessor} is a preclaiming
schedular. FolderCommandReference keeps a list of folders involved in
the operation the Command executes. DefaultProcessor will only start
the Command if all folders (resources) can be claimed at once.
|
org.columba.mail.folder.event | |
org.columba.mail.folder.headercache |
Adds additional caching functionality for local and remote folders.
|
org.columba.mail.folder.imap |
Implementation of a IMAP folder.
|
org.columba.mail.folder.mailboximport |
Provides a mailbox import facility including a plugin extension point.
|
org.columba.mail.folder.mbox | |
org.columba.mail.folder.mh |
Implementation of a MH-based mailbox format.
|
org.columba.mail.folder.outbox |
Implementation of an Outbox folder which keeps messages in a queue for sending
them later.
|
org.columba.mail.folder.search |
Provides searching functionality for folders.
{@link DefaultSearchEngine} is using filter plugins to perform search
requests.
Every {@link QueryEngine} implementation supports a subset of search
requests, for example searching in the body or subject of a message.
{@link DefaultSearchEngine} is also the fall-back for every search request
which is not performed by implementations of {@link QueryEngine}.
We use composition to plug the {@link QueryEngine} in the
{@link DefaultSearchEngine}, using a {@link DummyQueryEngine} which
doesn't support any special search requests, as default.
|
org.columba.mail.folder.temp |
Implementation of a temporary in-memory folder.
|
org.columba.mail.folder.virtual |
Implementation of a virtual folder.
|
org.columba.mail.folder.zippedmh | |
org.columba.mail.folderoptions |
Configuration options, which can be assigned on a per-folder basis,
or globally.
This includes, which columns to show in the message-list. The sorting
order, filter properties, enabling/disabling of the threaded-view, etc.
|
org.columba.mail.gui.action |
Global actions for the mail component.
|
org.columba.mail.gui.attachment | |
org.columba.mail.gui.charset |
Charset menu for switching the character encoding of the currenlty
viewed message.
|
org.columba.mail.gui.composer |
Composer Window to write new messages.
|
org.columba.mail.gui.composer.action |
Provides actions used in the composer window.
|
org.columba.mail.gui.composer.command |
Provides commands used in the composer.
|
org.columba.mail.gui.composer.contact | |
org.columba.mail.gui.composer.html |
Adds HTML editing capability to the composer:
|
org.columba.mail.gui.composer.html.action |
HTML-editing specific actions.
|
org.columba.mail.gui.composer.text |
Abstract texteditor classes used by the text/plain and the text/html editor kits.
|
org.columba.mail.gui.composer.util |
Helper classes including dialogs, renderers and other ui components.
|
org.columba.mail.gui.config.account |
Account Configuration Dialog
|
org.columba.mail.gui.config.accountlist |
Account Preferences Dialog showing a list of accounts
|
org.columba.mail.gui.config.accountwizard |
Wizard for creating new accounts
|
org.columba.mail.gui.config.columns | |
org.columba.mail.gui.config.export |
Dialog for exporting emails to a single mbox file.
|
org.columba.mail.gui.config.filter |
Dialogs for editing filters associated to folders.
|
org.columba.mail.gui.config.filter.plugins |
Plugin enabled filters and filter actions.
|
org.columba.mail.gui.config.filter.util |
Helper classes like renderers, etc. for the filter dialogs
|
org.columba.mail.gui.config.folder |
Folder Options Dialog showing status information and providing support
for exporting messages to a single mbox file.
|
org.columba.mail.gui.config.general |
Mail Options Dialog for changing the mail configuration
|
org.columba.mail.gui.config.mailboximport |
Wizard for importing mailbox files in different formats.
|
org.columba.mail.gui.config.search |
Search Messages Dialog
|
org.columba.mail.gui.config.subscribe | |
org.columba.mail.gui.config.template |
Dialog for choosing template messages from your template folder, used
by the Reply with Template action
|
org.columba.mail.gui.contact.list | |
org.columba.mail.gui.context | |
org.columba.mail.gui.filtertoolbar | |
org.columba.mail.gui.frame |
Provides mail-centric additions to the core frame
|
org.columba.mail.gui.frame.util |
Helper classes
|
org.columba.mail.gui.message |
GUI component for viewing message bodytext and header information.
|
org.columba.mail.gui.message.action |
Actions for message viewer
|
org.columba.mail.gui.message.command |
Commands for message viewer.
|
org.columba.mail.gui.message.filter |
Preprocessing filters modifying the message contents before the message
gets displayed in the message viewer.
In Columba we never change the message contents, is always saved in the mailbox
as it is. But decryption of messages makes it necessary to modify the original
message. Therefore a temporary folder is used where the modified message is
saved. All references are re-mapped to this temporary folder. This makes it
possible to execute all actions on this message as if it would be the original.
|
org.columba.mail.gui.message.util |
Helper classes used by the message viewer
|
org.columba.mail.gui.message.viewer |
Contents viewer for the message viewer component. This includes a header viewer,
a message body viewer, an attachment viewer and a security information viewer.
|
org.columba.mail.gui.messageframe |
Mail window showing only the message. There's no tree or message list
in this frame.
|
org.columba.mail.gui.search | |
org.columba.mail.gui.table |
Table component responsible for displaying the message list.
|
org.columba.mail.gui.table.action |
Provides actions for the message list.
|
org.columba.mail.gui.table.command |
Commands used by the table viewer
|
org.columba.mail.gui.table.model |
Model for the table controller
|
org.columba.mail.gui.table.plugins |
Plugin-enabled column renderers for the table view.
|
org.columba.mail.gui.table.selection |
Provides selection handling for the table component.
Follow these steps if you want to listen to table selection changes:
-
Listener should implement SelectionListener
-
This also means overwriting public void selectionChanged(SelectionChangedEvent e)
-
Don't forget to cast SelectionChangedEvent to TableSelectionChangedEvent
@see org.columba.mail.gui.table.action
|
org.columba.mail.gui.tagging | |
org.columba.mail.gui.tree |
Tree component managing mail folders
|
org.columba.mail.gui.tree.action |
Provides actions used by the tree component
|
org.columba.mail.gui.tree.command |
Provides commands for the tree component
|
org.columba.mail.gui.tree.comparator |
Classes to sort the tree view with.
|
org.columba.mail.gui.tree.selection |
Provides selection handling for the tree component.
Follow these steps if you want to listen to tree selection changes:
-
Listener should implement SelectionListener
-
This also means overwriting public void selectionChanged(SelectionChangedEvent e)
-
Don't forget to cast SelectionChangedEvent to TreeSelectionChangedEvent
@see org.columba.mail.gui.tree.action
|
org.columba.mail.gui.tree.util |
Helper classes used in the tree component including dialogs, renderers, etc.
|
org.columba.mail.gui.util |
Helper classes used by the mail component, including password dialog, Date chooser
dialogs, etc.
|
org.columba.mail.imap |
Low-level IMAP implementation as specified by RFC 3501 (obsolete RFC 2060)
|
org.columba.mail.mailchecking | |
org.columba.mail.main |
Main entrypoint for the mail component
|
org.columba.mail.message |
Data structures handling email data processing as specified in RFC 2822 (obsolete RFC 822)
|
org.columba.mail.nativ.defaultmailclient | |
org.columba.mail.parser |
Parsers handling email data processing as specified in RFC 2822 (obsolete RFC 822)
|
org.columba.mail.parser.text |
Parsers dealing with the modification of text/html contents
|
org.columba.mail.pgp |
GnuPG support for signing/verifying/encryption/decryption of messages based on the
OpenPGP standard
|
org.columba.mail.plugin | |
org.columba.mail.pop3 |
POP3 management classes
|
org.columba.mail.pop3.command |
Provides commands.
|
org.columba.mail.resourceloader | |
org.columba.mail.search | |
org.columba.mail.shutdown |
Background clean up tasks
|
org.columba.mail.smtp |
High-level SMTP management
|
org.columba.mail.smtp.action |
Provides SMTP actions
|
org.columba.mail.smtp.command |
Provides SMTP commands
|
org.columba.mail.spam |
Tightly integrated Spam Filter using Macchiato library.
Users enables spam filter on a per-account basis in the account options dialog.
{@link SpamItem} keeps all options.
Several commands where modified to plug the spam filter into Columba, without
adding additional actions. The user only has to mark messages as spam or not spam
to train the spam filter.
Additionally to {@link MarkMessageCommand}, {@link AddPOP3MessageCommand} was
modified to score new messages downloaded from POP3 servers.
Spam token database is saved in /mail/spam.db.
|
org.columba.mail.spam.command | |
org.columba.mail.spam.rules |
Enhancing the spam filter with handcrafted rules improves the detection of
spam messages. This is especially important in the beginning of the training
process, where the token database is empty.
|
org.columba.mail.spam.spamassassin | |
org.columba.mail.spellcheck |
Spellchecking support using aspellas backend.
|
org.columba.mail.spellcheck.cswilly |
Implementation of the aspell-based backend.
|
org.columba.mail.url.cid | |
org.columba.mail.util |
Miscellanious stuff for email specific stuff.
|