| java.lang.Object org.apache.mailet.GenericMailet org.apache.james.transport.mailets.AbstractRedirect
All known Subclasses: org.apache.james.transport.mailets.Resend, org.apache.james.transport.mailets.AbstractNotify, org.apache.james.transport.mailets.Redirect, org.apache.james.transport.mailets.Forward,
AbstractRedirect | abstract public class AbstractRedirect extends GenericMailet (Code) | | Abstract mailet providing configurable redirection services.
This mailet can be subclassed to make authoring redirection mailets simple.
By extending it and overriding one or more of these methods new behaviour can
be quickly created without the author having to address any other issue than
the relevant one:
- attachError() , should error messages be appended to the message
- getAttachmentType(), what should be attached to the message
- getInLineType(), what should be included in the message
- getMessage(), The text of the message itself
- getRecipients(), the recipients the mail is sent to
- getReplyTo(), where replies to this message will be sent
- getReversePath(), what to set the reverse-path to
- getSender(), who the mail is from
- getSubject(), a string to replace the message subject
- getSubjectPrefix(), a prefix to be added to the message subject, possibly already replaced by a new subject
- getTo(), a list of people to whom the mail is *apparently* sent
- isReply(), should this mailet set the IN_REPLY_TO header to the id of the current message
- getPassThrough(), should this mailet allow the original message to continue processing or GHOST it.
- getFakeDomainCheck(), should this mailet check if the sender domain address is valid.
- isStatic(), should this mailet run the get methods for every mail, or just once.
For each of the methods above (generically called "getX()" methods in this class
and its subclasses), there is an associated "getX(Mail)" method and most times
a "setX(Mail, Tx, Mail)" method.
The roles are the following:
- a "getX()" method returns the correspondent "X" value that can be evaluated "statically"
once at init time and then stored in a variable and made available for later use by a
"getX(Mail)" method;
- a "getX(Mail)" method is the one called to return the correspondent "X" value
that can be evaluated "dynamically", tipically based on the currently serviced mail;
the default behaviour is to return the value of getX();
- a "setX(Mail, Tx, Mail)" method is called to change the correspondent "X" value
of the redirected Mail object, using the value returned by "gexX(Mail)";
if such value is null, it does nothing.
Here follows the typical pattern of those methods:
...
Tx x;
...
protected boolean getX(Mail originalMail) throws MessagingException {
boolean x = (isStatic()) ? this.x : getX();
...
return x;
}
...
public void init() throws MessagingException {
...
isStatic = (getInitParameter("static") == null) ? false : new Boolean(getInitParameter("static")).booleanValue();
if(isStatic()) {
...
X = getX();
...
}
...
public void service(Mail originalMail) throws MessagingException {
...
setX(newMail, getX(originalMail), originalMail);
...
}
...
The isStatic variable and method is used to allow for the situations
(deprecated since version 2.2, but possibly used by previoulsy written extensions
to
Redirect ) in which the getX() methods are non static: in this case
AbstractRedirect.isStatic() must return false.
Finally, a "getX()" method may return a "special address" (see
SpecialAddress ),
that later will be resolved ("late bound") by a "getX(Mail)" or "setX(Mail, Tx, Mail)":
it is a dynamic value that does not require isStatic to be false.
Supports by default the passThrough init parameter (false if missing).
Subclasses can override this behaviour overriding
AbstractRedirect.getPassThrough() .
version: CVS $Revision: 494012 $ $Date: 2007-01-08 11:23:58 +0100 (Mo, 08 Jan 2007) $ since: 2.2.0 |
Inner Class :protected static class SpecialAddress | |
Field Summary | |
final protected static int | ALL | final protected static int | BODY | final protected static int | HEADS | final protected static int | MESSAGE | final protected static int | NONE | final protected static int | UNALTERED | protected boolean | isDebug Controls certain log messages. | protected boolean | isStatic Holds the value of the static init parameter. |
Method Summary | |
protected boolean | attachError() Gets the attachError property. | protected boolean | attachError(Mail originalMail) Gets the attachError property,
built dynamically using the original Mail object. | protected void | buildAlteredMessage(Mail newMail, Mail originalMail) Builds the message of the newMail in case it has to be altered. | public static void | changeSubject(MimeMessage message, String newValue) It changes the subject of the supplied message to to supplied value
but it also tries to preserve the original charset information.
This method was needed to avoid sending the subject using a charset
(usually the default charset on the server) which doesn't contain
the characters in the subject, resulting in the loss of these characters. | protected String[] | getAllowedInitParameters() Gets the expected init parameters. | protected int | getAttachmentType() Gets the attachment property. | protected int | getAttachmentType(Mail originalMail) Gets the attachment property,
built dynamically using the original Mail object. | protected boolean | getFakeDomainCheck() Gets the fakeDomainCheck property. | protected boolean | getFakeDomainCheck(Mail originalMail) Gets the fakeDomainCheck property,
built dynamically using the original Mail object. | protected int | getInLineType() Gets the inline property. | protected int | getInLineType(Mail originalMail) Gets the inline property,
built dynamically using the original Mail object. | protected String | getMessage() Gets the message property. | protected String | getMessage(Mail originalMail) Gets the message property,
built dynamically using the original Mail object. | protected String | getMessageHeaders(MimeMessage message) | protected boolean | getPassThrough() Gets the passThrough property. | protected boolean | getPassThrough(Mail originalMail) Gets the passThrough property,
built dynamically using the original Mail object. | protected Collection | getRecipients() Gets the recipients property. | protected Collection | getRecipients(Mail originalMail) Gets the recipients property,
built dynamically using the original Mail object. | protected MailAddress | getReplyTo() Gets the replyto property. | protected MailAddress | getReplyTo(Mail originalMail) Gets the replyTo property,
built dynamically using the original Mail object. | protected MailAddress | getReversePath() Gets the reversePath property. | protected MailAddress | getReversePath(Mail originalMail) Gets the reversePath property,
built dynamically using the original Mail object. | protected MailAddress | getSender() Gets the sender property. | protected MailAddress | getSender(Mail originalMail) Gets the sender property,
built dynamically using the original Mail object. | final protected MailAddress | getSpecialAddress(String addressString, String[] allowedSpecials) Returns the
SpecialAddress that corresponds to an init parameter value. | protected String | getSubject() Gets the subject property. | protected String | getSubject(Mail originalMail) Gets the subject property,
built dynamically using the original Mail object. | protected String | getSubjectPrefix() Gets the prefix property. | protected String | getSubjectPrefix(Mail originalMail) Gets the subjectPrefix property,
built dynamically using the original Mail object. | protected InternetAddress[] | getTo() Gets the to property. | protected InternetAddress[] | getTo(Mail originalMail) Gets the to property,
built dynamically using the original Mail object. | protected int | getTypeCode(String param) A private method to convert types from string to int. | public void | init() Mailet initialization routine. | protected boolean | isReply() Gets the isReply property. | protected boolean | isReply(Mail originalMail) Gets the isReply property,
built dynamically using the original Mail object. | protected boolean | isStatic() Gets the static property.
Return true to reduce calls to getTo, getSender, getRecipients, getReplyTo, getReversePath amd getMessage
where these values don't change (eg hard coded, or got at startup from the mailet config);
return false where any of these methods generate their results dynamically eg in response to the message being processed,
or by reference to a repository of users.
It is now (from version 2.2) somehow obsolete, as should be always true because the "good practice"
is to use "getX()" methods statically, and use instead "getX(Mail)" methods for dynamic situations. | protected Collection | replaceInternetAddresses(Mail mail, Collection list) | protected Collection | replaceMailAddresses(Mail mail, Collection list) Returns a new Collection built over list replacing special addresses
with real MailAddress -es.
Manages SpecialAddress.SENDER , SpecialAddress.REVERSE_PATH ,
SpecialAddress.FROM , SpecialAddress.REPLY_TO ,
SpecialAddress.RECIPIENTS , SpecialAddress.TO ,
SpecialAddress.NULL and SpecialAddress.UNALTERED .
SpecialAddress.FROM is made equivalent to SpecialAddress.SENDER ;
SpecialAddress.TO is made equivalent to SpecialAddress.RECIPIENTS .
SpecialAddress.REPLY_TO uses the ReplyTo header if available, otherwise the
From header if available, otherwise the Sender header if available, otherwise the return-path.
SpecialAddress.NULL and SpecialAddress.UNALTERED are ignored.
Any other address is not replaced. | final protected boolean | senderDomainIsValid(Mail mail) | public void | service(Mail originalMail) Service does the hard work,and redirects the originalMail in the form specified. | protected void | setIsReply(Mail newMail, boolean isReply, Mail originalMail) Sets the "In-Reply-To:" header of newMail to the "Message-Id:" of
originalMail, if isReply is true. | protected void | setRecipients(Mail newMail, Collection recipients, Mail originalMail) Sets the recipients of newMail to recipients. | protected void | setReplyTo(Mail newMail, MailAddress replyTo, Mail originalMail) Sets the "Reply-To:" header of newMail to replyTo.
If the requested value is SpecialAddress.NULL will remove the "Reply-To:" header. | protected void | setReversePath(MailImpl newMail, MailAddress reversePath, Mail originalMail) Sets the "reverse-path" of newMail to reversePath. | protected void | setSender(Mail newMail, MailAddress sender, Mail originalMail) Sets the "From:" header of newMail to sender. | protected void | setSubjectPrefix(Mail newMail, String subjectPrefix, Mail originalMail) Builds the subject of newMail appending the subject
of originalMail to subjectPrefix. | protected void | setTo(Mail newMail, InternetAddress[] to, Mail originalMail) Sets the "To:" header of newMail to to. |
ALL | final protected static int ALL(Code) | | |
BODY | final protected static int BODY(Code) | | |
HEADS | final protected static int HEADS(Code) | | |
MESSAGE | final protected static int MESSAGE(Code) | | |
NONE | final protected static int NONE(Code) | | |
UNALTERED | final protected static int UNALTERED(Code) | | |
isDebug | protected boolean isDebug(Code) | | Controls certain log messages.
|
isStatic | protected boolean isStatic(Code) | | Holds the value of the static init parameter.
|
attachError | protected boolean attachError() throws MessagingException(Code) | | Gets the attachError property.
Returns a boolean indicating whether to append a description of any error to the main body part
of the new message, if getInlineType does not return "UNALTERED".
Is a "getX()" method.
the attachError init parameter; false if missing |
attachError | protected boolean attachError(Mail originalMail) throws MessagingException(Code) | | Gets the attachError property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.attachError() |
buildAlteredMessage | protected void buildAlteredMessage(Mail newMail, Mail originalMail) throws MessagingException(Code) | | Builds the message of the newMail in case it has to be altered.
Parameters: originalMail - the original Mail object Parameters: newMail - the Mail object to build |
changeSubject | public static void changeSubject(MimeMessage message, String newValue) throws MessagingException(Code) | | It changes the subject of the supplied message to to supplied value
but it also tries to preserve the original charset information.
This method was needed to avoid sending the subject using a charset
(usually the default charset on the server) which doesn't contain
the characters in the subject, resulting in the loss of these characters.
The most simple method would be to either send it in ASCII unencoded
or in UTF-8 if non-ASCII characters are present but unfortunately UTF-8
is not yet a MIME standard and not all email clients
are supporting it. The optimal method would be to determine the best
charset by analyzing the actual characters. That would require much
more work (exept if an open source library already exists for this).
However there is nothing to stop somebody to add a detection algorithm
for a specific charset.
The current algorithm works correctly if only ASCII characters are
added to an existing subject.
If the new value is ASCII only, then it doesn't apply any encoding to
the subject header. (This is provided by MimeMessage.setSubject()).
Possible enhancement: under java 1.4 java.nio the system can determine if the
suggested charset fits or not (if there is untranslatable
characters). If the charset doesn't fit the new value, it
can fall back to UTF-8.
Parameters: message - the message of which subject is changed Parameters: newValue - the new (unencoded) value of the subject. It mustnot be null. throws: MessagingException - - according to the JavaMail doc most likelythis is never thrown |
getAllowedInitParameters | protected String[] getAllowedInitParameters()(Code) | | Gets the expected init parameters.
null meaning no check |
getAttachmentType | protected int getAttachmentType() throws MessagingException(Code) | | Gets the attachment property.
May return one of the following values to indicate how to attach the original message
to the new message:
BODY : original message body is attached as plain text to the new message
HEADS : original message headers are attached as plain text to the new message
ALL : original is attached as plain text with all headers
MESSAGE : original message is attached as type message/rfc822, a complete mail message.
NONE : original is not attached
Is a "getX()" method.
the attachment init parameter, or NONE if missing |
getAttachmentType | protected int getAttachmentType(Mail originalMail) throws MessagingException(Code) | | Gets the attachment property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getAttachmentType() |
getFakeDomainCheck | protected boolean getFakeDomainCheck() throws MessagingException(Code) | | Gets the fakeDomainCheck property.
Return true to check if the sender domain is valid.
Is a "getX()" method.
the fakeDomainCheck init parameter, or true if missing |
getFakeDomainCheck | protected boolean getFakeDomainCheck(Mail originalMail) throws MessagingException(Code) | | Gets the fakeDomainCheck property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getFakeDomainCheck() |
getInLineType | protected int getInLineType() throws MessagingException(Code) | | Gets the inline property.
May return one of the following values to indicate how to append the original message
to build the new message:
UNALTERED : original message is the new message body
BODY : original message body is appended to the new message
HEADS : original message headers are appended to the new message
ALL : original is appended with all headers
NONE : original is not appended
Is a "getX()" method.
the inline init parameter, or UNALTERED if missing |
getInLineType | protected int getInLineType(Mail originalMail) throws MessagingException(Code) | | Gets the inline property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getInLineType() |
getMessage | protected String getMessage() throws MessagingException(Code) | | Gets the message property.
Returns a message to which the original message can be attached/appended
to build the new message.
Is a "getX()" method.
the message init parameter or an empty string if missing |
getMessageHeaders | protected String getMessageHeaders(MimeMessage message) throws MessagingException(Code) | | Utility method for obtaining a string representation of a
Message's headers
|
getPassThrough | protected boolean getPassThrough() throws MessagingException(Code) | | Gets the passThrough property.
Return true to allow the original message to continue through the processor, false to GHOST it.
Is a "getX()" method.
the passThrough init parameter, or false if missing |
getPassThrough | protected boolean getPassThrough(Mail originalMail) throws MessagingException(Code) | | Gets the passThrough property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getPassThrough() |
getRecipients | protected Collection getRecipients() throws MessagingException(Code) | | Gets the recipients property.
Returns the collection of recipients of the new message,
or null if no change is requested.
Is a "getX()" method.
the recipients init parameteror the postmaster addressor SpecialAddress.SENDER or SpecialAddress.FROM or SpecialAddress.REPLY_TO or SpecialAddress.REVERSE_PATH or SpecialAddress.UNALTERED or SpecialAddress.RECIPIENTS or null if missing |
getReplyTo | protected MailAddress getReplyTo() throws MessagingException(Code) | | Gets the replyto property.
Returns the Reply-To address of the new message,
or null if no change is requested.
Is a "getX()" method.
the replyto init parameteror the postmaster addressor SpecialAddress.SENDER or SpecialAddress.UNALTERED or SpecialAddress.NULL or null if missing |
getReplyTo | protected MailAddress getReplyTo(Mail originalMail) throws MessagingException(Code) | | Gets the replyTo property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getReplyTo()replacing SpecialAddress.UNALTERED if applicable with nulland SpecialAddress.SENDER with the original mail sender |
getReversePath | protected MailAddress getReversePath() throws MessagingException(Code) | | Gets the reversePath property.
Returns the reverse-path of the new message,
or null if no change is requested.
Is a "getX()" method.
the reversePath init parameter or the postmaster addressor SpecialAddress.SENDER or SpecialAddress.NULL or SpecialAddress.UNALTERED or null if missing |
getReversePath | protected MailAddress getReversePath(Mail originalMail) throws MessagingException(Code) | | Gets the reversePath property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getReversePath(),replacing SpecialAddress.SENDER if applicable with null,replacing SpecialAddress.UNALTERED and SpecialAddress.REVERSE_PATH if applicable with null,but not replacing SpecialAddress.NULL that will be handled by AbstractRedirect.setReversePath |
getSender | protected MailAddress getSender() throws MessagingException(Code) | | Gets the sender property.
Returns the new sender as a MailAddress,
or null if no change is requested.
Is a "getX()" method.
the sender init parameteror the postmaster addressor SpecialAddress.SENDER or SpecialAddress.UNALTERED or null if missing |
getSender | protected MailAddress getSender(Mail originalMail) throws MessagingException(Code) | | Gets the sender property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.getSender()replacing SpecialAddress.UNALTERED and SpecialAddress.SENDER if applicable with null |
getSpecialAddress | final protected MailAddress getSpecialAddress(String addressString, String[] allowedSpecials) throws MessagingException(Code) | | Returns the
SpecialAddress that corresponds to an init parameter value.
The init parameter value is checked against a String[] of allowed values.
The checks are case insensitive.
Parameters: addressString - the string to check if is a special address Parameters: allowedSpecials - a String[] with the allowed special addresses a SpecialAddress if found, null if not found or addressString is null throws: MessagingException - if is a special address not in the allowedSpecials array |
getSubject | protected String getSubject() throws MessagingException(Code) | | Gets the subject property.
Returns a string for the new message subject.
Is a "getX()" method.
the subject init parameter or null if missing |
getSubjectPrefix | protected String getSubjectPrefix() throws MessagingException(Code) | | Gets the prefix property.
Returns a prefix for the new message subject.
Is a "getX()" method.
the prefix init parameter or an empty string if missing |
getTo | protected InternetAddress[] getTo() throws MessagingException(Code) | | Gets the to property.
Returns the "To:" recipients of the new message.
or null if no change is requested.
Is a "getX()" method.
the to init parameteror the postmaster addressor SpecialAddress.SENDER or SpecialAddress.REVERSE_PATH or SpecialAddress.FROM or SpecialAddress.REPLY_TO or SpecialAddress.UNALTERED or SpecialAddress.TO or null if missing |
getTypeCode | protected int getTypeCode(String param)(Code) | | A private method to convert types from string to int.
Parameters: param - the string type the corresponding int enumeration |
init | public void init() throws MessagingException(Code) | | Mailet initialization routine.
Will setup static values for each "x" initialization parameter in config.xml,
using getX(), if
AbstractRedirect.isStatic() returns true.
|
isReply | protected boolean isReply() throws MessagingException(Code) | | Gets the isReply property.
Returns a boolean indicating whether the new message must be considered
a reply to the original message, setting the IN_REPLY_TO header of the new
message to the id of the original message.
Is a "getX()" method.
the isReply init parameter; false if missing |
isReply | protected boolean isReply(Mail originalMail) throws MessagingException(Code) | | Gets the isReply property,
built dynamically using the original Mail object.
Is a "getX(Mail)" method.
AbstractRedirect.isReply() |
isStatic | protected boolean isStatic()(Code) | | Gets the static property.
Return true to reduce calls to getTo, getSender, getRecipients, getReplyTo, getReversePath amd getMessage
where these values don't change (eg hard coded, or got at startup from the mailet config);
return false where any of these methods generate their results dynamically eg in response to the message being processed,
or by reference to a repository of users.
It is now (from version 2.2) somehow obsolete, as should be always true because the "good practice"
is to use "getX()" methods statically, and use instead "getX(Mail)" methods for dynamic situations.
A false value is now meaningful only for subclasses of
Redirect older than version 2.2
that were relying on this.
Is a "getX()" method.
true, as normally "getX()" methods shouls be static |
replaceInternetAddresses | protected Collection replaceInternetAddresses(Mail mail, Collection list) throws MessagingException(Code) | | Returns a new Collection built over list replacing special addresses
with real InternetAddress -es.
Manages SpecialAddress.SENDER , SpecialAddress.REVERSE_PATH ,
SpecialAddress.FROM , SpecialAddress.REPLY_TO ,
SpecialAddress.RECIPIENTS , SpecialAddress.TO ,
SpecialAddress.NULL and SpecialAddress.UNALTERED .
SpecialAddress.RECIPIENTS is made equivalent to SpecialAddress.TO .
SpecialAddress.FROM uses the From header if available, otherwise the Sender header if available,
otherwise the return-path.
SpecialAddress.REPLY_TO uses the ReplyTo header if available, otherwise the
From header if available, otherwise the Sender header if available, otherwise the return-path.
SpecialAddress.UNALTERED is ignored.
Any other address is not replaced.
|
replaceMailAddresses | protected Collection replaceMailAddresses(Mail mail, Collection list)(Code) | | Returns a new Collection built over list replacing special addresses
with real MailAddress -es.
Manages SpecialAddress.SENDER , SpecialAddress.REVERSE_PATH ,
SpecialAddress.FROM , SpecialAddress.REPLY_TO ,
SpecialAddress.RECIPIENTS , SpecialAddress.TO ,
SpecialAddress.NULL and SpecialAddress.UNALTERED .
SpecialAddress.FROM is made equivalent to SpecialAddress.SENDER ;
SpecialAddress.TO is made equivalent to SpecialAddress.RECIPIENTS .
SpecialAddress.REPLY_TO uses the ReplyTo header if available, otherwise the
From header if available, otherwise the Sender header if available, otherwise the return-path.
SpecialAddress.NULL and SpecialAddress.UNALTERED are ignored.
Any other address is not replaced.
|
senderDomainIsValid | final protected boolean senderDomainIsValid(Mail mail) throws MessagingException(Code) | | Checks if a sender domain of mail is valid.
If we do not do this check, and someone uses a redirection mailet in a
processor initiated by SenderInFakeDomain, then a fake
sender domain will cause an infinite loop (the forwarded
e-mail still appears to come from a fake domain).
Although this can be viewed as a configuration error, the
consequences of such a mis-configuration are severe enough
to warrant protecting against the infinite loop.
This check can be skipped if
AbstractRedirect.getFakeDomainCheck(Mail) returns true.
Parameters: mail - the mail object to check true if the if the sender is null ororg.apache.mailet.MailetContext.getMailServers returns true forthe sender host part |
service | public void service(Mail originalMail) throws MessagingException(Code) | | Service does the hard work,and redirects the originalMail in the form specified.
Parameters: originalMail - the mail to process and redirect throws: MessagingException - if a problem arises formulating the redirected mail |
setIsReply | protected void setIsReply(Mail newMail, boolean isReply, Mail originalMail) throws MessagingException(Code) | | Sets the "In-Reply-To:" header of newMail to the "Message-Id:" of
originalMail, if isReply is true.
|
setRecipients | protected void setRecipients(Mail newMail, Collection recipients, Mail originalMail) throws MessagingException(Code) | | Sets the recipients of newMail to recipients.
If the requested value is null does nothing.
Is a "setX(Mail, Tx, Mail)" method.
|
setReplyTo | protected void setReplyTo(Mail newMail, MailAddress replyTo, Mail originalMail) throws MessagingException(Code) | | Sets the "Reply-To:" header of newMail to replyTo.
If the requested value is SpecialAddress.NULL will remove the "Reply-To:" header.
If the requested value is null does nothing.
Is a "setX(Mail, Tx, Mail)" method.
|
setReversePath | protected void setReversePath(MailImpl newMail, MailAddress reversePath, Mail originalMail) throws MessagingException(Code) | | Sets the "reverse-path" of newMail to reversePath.
If the requested value is SpecialAddress.NULL sets it to "<>".
If the requested value is null does nothing.
Is a "setX(Mail, Tx, Mail)" method.
|
setSender | protected void setSender(Mail newMail, MailAddress sender, Mail originalMail) throws MessagingException(Code) | | Sets the "From:" header of newMail to sender.
If the requested value is null does nothing.
Is a "setX(Mail, Tx, Mail)" method.
|
setSubjectPrefix | protected void setSubjectPrefix(Mail newMail, String subjectPrefix, Mail originalMail) throws MessagingException(Code) | | Builds the subject of newMail appending the subject
of originalMail to subjectPrefix.
Is a "setX(Mail, Tx, Mail)" method.
|
setTo | protected void setTo(Mail newMail, InternetAddress[] to, Mail originalMail) throws MessagingException(Code) | | Sets the "To:" header of newMail to to.
If the requested value is null does nothing.
Is a "setX(Mail, Tx, Mail)" method.
|
|
|