in protocols/smtp/src/main/java/org/apache/james/protocols/smtp/core/RcptCmdHandler.java [105:189]
protected Response doFilterChecks(SMTPSession session, String command,
String argument) {
String recipient = null;
if ((argument != null) && (argument.indexOf(":") > 0)) {
int colonIndex = argument.indexOf(":");
recipient = argument.substring(colonIndex + 1);
argument = argument.substring(0, colonIndex);
}
if (!session.getAttachment(SMTPSession.SENDER, State.Transaction).isPresent()) {
return MAIL_NEEDED;
} else if (argument == null
|| !argument.toUpperCase(Locale.US).equals("TO")
|| recipient == null) {
return SYNTAX_ERROR_ARGS;
}
recipient = recipient.trim();
int lastChar = recipient.lastIndexOf('>');
// Check to see if any options are present and, if so, whether they
// are correctly formatted
// (separated from the closing angle bracket by a ' ').
String rcptOptionString = null;
if ((lastChar > 0) && (recipient.length() > lastChar + 2)
&& (recipient.charAt(lastChar + 1) == ' ')) {
rcptOptionString = recipient.substring(lastChar + 2);
// Remove the options from the recipient
recipient = recipient.substring(0, lastChar + 1);
}
if (session.getConfiguration().useAddressBracketsEnforcement()
&& (!recipient.startsWith("<") || !recipient.endsWith(">"))) {
LOGGER.info("Error parsing recipient address: Address did not start and end with < >{}", getContext(session, null, recipient));
return SYNTAX_ERROR_DELIVERY;
}
MailAddress recipientAddress = null;
// Remove < and >
if (session.getConfiguration().useAddressBracketsEnforcement()
|| (recipient.startsWith("<") && recipient.endsWith(">"))) {
recipient = recipient.substring(1, recipient.length() - 1);
}
if (!recipient.contains("@")) {
// set the default domain
recipient = recipient
+ "@"
+ getDefaultDomain();
}
try {
recipientAddress = new MailAddress(recipient);
} catch (Exception pe) {
LOGGER.info("Error parsing recipient address{}", getContext(session, recipientAddress, recipient), pe);
/*
* from RFC2822; 553 Requested action not taken: mailbox name
* not allowed (e.g., mailbox syntax incorrect)
*/
return SYNTAX_ERROR_ADDRESS;
}
if (rcptOptionString != null) {
StringTokenizer optionTokenizer = new StringTokenizer(
rcptOptionString, " ");
while (optionTokenizer.hasMoreElements()) {
String rcptOption = optionTokenizer.nextToken();
Pair<String, String> parameter = parseParameter(rcptOption);
if (!supportedParameter(parameter.getKey())) {
// Unexpected option attached to the RCPT command
LOGGER.debug("RCPT command had unrecognized/unexpected option {} with value {}{}",
parameter.getKey(), parameter.getValue(), getContext(session, recipientAddress, recipient));
return new SMTPResponse(
SMTPRetCode.PARAMETER_NOT_IMPLEMENTED,
"Unrecognized or unsupported option: "
+ parameter.getKey());
}
}
optionTokenizer = null;
}
session.setAttachment(CURRENT_RECIPIENT, recipientAddress, State.Transaction);
return null;
}