public class SMTPTransport extends Transport
See the com.sun.mail.smtp package documentation for further information on the SMTP protocol provider.
This class includes many protected methods that allow a subclass to
extend this class and add support for non-standard SMTP commands.
The issueCommand(java.lang.String, int)
and sendCommand(java.lang.String)
methods can be
used to send simple SMTP commands. Other methods such as the
mailFrom()
and data()
methods can be overridden to
insert new commands before or after the corresponding SMTP commands.
For example, a subclass could do this to send the XACT command
before sending the DATA command:
protected OutputStream data() throws MessagingException { if (supportsExtension("XACCOUNTING")) issueCommand("XACT", 25); return super.data(); }
ConnectionEvent
,
TransportEvent
Modifier | Constructor and Description |
---|---|
|
SMTPTransport(Session session,
URLName urlname)
Constructor that takes a Session object and a URLName
that represents a specific SMTP server.
|
protected |
SMTPTransport(Session session,
URLName urlname,
String name,
boolean isSSL)
Constructor used by this class and by SMTPSSLTransport subclass.
|
Modifier and Type | Method and Description |
---|---|
protected OutputStream |
bdat()
Return a stream that will use the SMTP BDAT command to send data.
|
protected void |
checkConnected()
Check if we're in the connected state.
|
void |
close()
Close the Transport and terminate the connection to the server.
|
void |
connect(Socket socket)
Start the SMTP protocol on the given socket, which was already
connected by the caller.
|
protected OutputStream |
data()
Send the
DATA command to the SMTP host and return
an OutputStream to which the data is to be written. |
protected boolean |
ehlo(String domain)
Issue the
EHLO command. |
protected void |
finalize()
Stop the event dispatcher thread so the queue can be garbage collected.
|
protected void |
finishBdat()
Terminate the sent data.
|
protected void |
finishData()
Terminate the sent data.
|
String |
getAuthorizationId()
Gets the authorization ID to be used for authentication.
|
String |
getExtensionParameter(String ext)
Return the parameter the server provided for the specified
service extension, or null if the extension isn't supported.
|
int |
getLastReturnCode()
Return the return code from the last response we got from the server.
|
String |
getLastServerResponse()
Return the last response we got from the server.
|
String |
getLocalHost()
Get the name of the local host, for use in the EHLO and HELO commands.
|
boolean |
getNoopStrict()
Is the NOOP command required to return a response code
of 250 to indicate success?
|
String |
getNTLMDomain()
Gets the NTLM domain to be used for NTLM authentication.
|
boolean |
getReportSuccess()
Should we report even successful sends by throwing an exception?
If so, a
SendFailedException will always be thrown and
an SMTPAddressSucceededException will be included in the exception
chain for each successful address, along with the usual
SMTPAddressFailedException for each unsuccessful address. |
boolean |
getRequireStartTLS()
Should we require the STARTTLS command to secure the connection?
|
boolean |
getSASLEnabled()
Is SASL authentication enabled?
|
String[] |
getSASLMechanisms()
Get the list of SASL mechanisms to consider if SASL authentication
is enabled.
|
String |
getSASLRealm()
Gets the SASL realm to be used for DIGEST-MD5 authentication.
|
boolean |
getStartTLS()
Should we use the STARTTLS command to secure the connection
if the server supports it?
|
boolean |
getUseCanonicalHostName()
Should SASL use the canonical host name?
|
boolean |
getUseRset()
Should we use the RSET command instead of the NOOP command
in the @{link #isConnected isConnected} method?
|
protected void |
helo(String domain)
Issue the
HELO command. |
boolean |
isConnected()
Check whether the transport is connected.
|
boolean |
isSSL()
Is this Transport using SSL to connect to the server?
|
void |
issueCommand(String cmd,
int expect)
Send the command to the server.
|
protected void |
mailFrom()
Issue the
MAIL FROM: command to start sending a message. |
protected void |
notifyTransportListeners(int type,
Address[] validSent,
Address[] validUnsent,
Address[] invalid,
Message msg)
Notify all TransportListeners.
|
protected boolean |
protocolConnect(String host,
int port,
String user,
String password)
Performs the actual protocol-specific connection attempt.
|
protected void |
rcptTo()
Sends each address to the SMTP host using the
RCPT TO:
command and copies the address either into
the validSentAddr or invalidAddr arrays. |
protected int |
readServerResponse()
Reads server reponse returning the
returnCode
as the number. |
protected void |
sendCommand(String cmd)
Sends command
cmd to the server terminating
it with CRLF . |
void |
sendMessage(Message message,
Address[] addresses)
Send the Message to the specified list of addresses.
|
void |
setAuthorizationID(String authzid)
Sets the authorization ID to be used for authentication.
|
void |
setLocalHost(String localhost)
Set the name of the local host, for use in the EHLO and HELO commands.
|
void |
setNoopStrict(boolean noopStrict)
Set whether the NOOP command is required to return a response code
of 250 to indicate success.
|
void |
setNTLMDomain(String ntlmDomain)
Sets the NTLM domain to be used for NTLM authentication.
|
void |
setReportSuccess(boolean reportSuccess)
Set whether successful sends should be reported by throwing
an exception.
|
void |
setRequireStartTLS(boolean requireStartTLS)
Set whether the STARTTLS command should be required.
|
void |
setSASLEnabled(boolean enableSASL)
Set whether SASL authentication is enabled.
|
void |
setSASLMechanisms(String[] mechanisms)
Set the list of SASL mechanisms to consider if SASL authentication
is enabled.
|
void |
setSASLRealm(String saslRealm)
Sets the SASL realm to be used for DIGEST-MD5 authentication.
|
void |
setStartTLS(boolean useStartTLS)
Set whether the STARTTLS command should be used.
|
void |
setUseCanonicalHostName(boolean useCanonicalHostName)
Set whether SASL should use the canonical host name.
|
void |
setUseRset(boolean useRset)
Set whether the RSET command should be used instead of the
NOOP command in the @{link #isConnected isConnected} method.
|
protected int |
simpleCommand(byte[] cmd)
Send the command to the server and return the response code
from the server.
|
int |
simpleCommand(String cmd)
Send the command to the server and return the response code
from the server.
|
protected void |
startTLS()
Issue the
STARTTLS command and switch the socket to
TLS mode if it succeeds. |
protected boolean |
supportsAuthentication(String auth)
Does the server we're connected to support the specified
authentication mechanism? Uses the extension information
returned by the server from the EHLO command.
|
boolean |
supportsExtension(String ext)
Return true if the SMTP server supports the specified service
extension.
|
protected static String |
xtext(String s)
Convert a string to RFC 1891 xtext format.
|
protected static String |
xtext(String s,
boolean utf8)
Like xtext(s), but allow UTF-8 strings.
|
addTransportListener, removeTransportListener, send, send, send, send
addConnectionListener, connect, connect, connect, connect, getURLName, notifyConnectionListeners, queueEvent, removeConnectionListener, setConnected, setURLName, toString
public SMTPTransport(Session session, URLName urlname)
session
- the Sessionurlname
- the URLName of this transportprotected SMTPTransport(Session session, URLName urlname, String name, boolean isSSL)
session
- the Sessionurlname
- the URLName of this transportname
- the protocol name of this transportisSSL
- use SSL to connect?public String getLocalHost()
public void setLocalHost(String localhost)
localhost
- the local host namepublic void connect(Socket socket) throws MessagingException
socket
- the already connected socketMessagingException
- for failurespublic String getAuthorizationId()
public void setAuthorizationID(String authzid)
authzid
- the authorization ID to use for
authentication.public boolean getSASLEnabled()
public void setSASLEnabled(boolean enableSASL)
enableSASL
- should we enable SASL authentication?public String getSASLRealm()
public void setSASLRealm(String saslRealm)
saslRealm
- the name of the realm to use for
SASL authentication.public boolean getUseCanonicalHostName()
public void setUseCanonicalHostName(boolean useCanonicalHostName)
useCanonicalHostName
- should SASL use the canonical host name?public String[] getSASLMechanisms()
public void setSASLMechanisms(String[] mechanisms)
mechanisms
- the array of SASL mechanisms to considerpublic String getNTLMDomain()
public void setNTLMDomain(String ntlmDomain)
ntlmDomain
- the name of the domain to use for
NTLM authentication.public boolean getReportSuccess()
SendFailedException
will always be thrown and
an SMTPAddressSucceededException
will be included in the exception
chain for each successful address, along with the usual
SMTPAddressFailedException
for each unsuccessful address.public void setReportSuccess(boolean reportSuccess)
reportSuccess
- should we throw an exception on success?public boolean getStartTLS()
public void setStartTLS(boolean useStartTLS)
useStartTLS
- should we use the STARTTLS command?public boolean getRequireStartTLS()
public void setRequireStartTLS(boolean requireStartTLS)
requireStartTLS
- should we require the STARTTLS command?public boolean isSSL()
public boolean getUseRset()
public void setUseRset(boolean useRset)
useRset
- should we use the RSET command?public boolean getNoopStrict()
public void setNoopStrict(boolean noopStrict)
noopStrict
- is NOOP required to return 250?public String getLastServerResponse()
public int getLastReturnCode()
protected boolean protocolConnect(String host, int port, String user, String password) throws MessagingException
Unless mail.smtp.ehlo is set to false, we'll try to identify ourselves using the ESMTP command EHLO. If mail.smtp.auth is set to true, we insist on having a username and password, and will try to authenticate ourselves if the server supports the AUTH extension (RFC 2554).
protocolConnect
in class Service
host
- the name of the host to connect toport
- the port to use (-1 means use default port)user
- the name of the user to login aspassword
- the user's passwordMessagingException
- for non-authentication failurespublic void sendMessage(Message message, Address[] addresses) throws MessagingException, SendFailedException
If all the addresses
succeed the SMTP check
using the RCPT TO:
command, we attempt to send the message.
A TransportEvent of type MESSAGE_DELIVERED is fired indicating the
successful submission of a message to the SMTP host.
If some of the addresses
fail the SMTP check,
and the mail.smtp.sendpartial
property is not set,
sending is aborted. The TransportEvent of type MESSAGE_NOT_DELIVERED
is fired containing the valid and invalid addresses. The
SendFailedException is also thrown.
If some of the addresses
fail the SMTP check,
and the mail.smtp.sendpartial
property is set to true,
the message is sent. The TransportEvent of type
MESSAGE_PARTIALLY_DELIVERED
is fired containing the valid and invalid addresses. The
SMTPSendFailedException is also thrown.
MessagingException is thrown if the message can't write out
an RFC822-compliant stream using its writeTo
method.
sendMessage
in class Transport
message
- The MimeMessage to be sentaddresses
- List of addresses to send this message toSMTPSendFailedException
- if the send failed because of
an SMTP command errorSendFailedException
- if the send failed because of
invalid addresses.MessagingException
- if the connection is dead
or not in the connected state or if the message is
not a MimeMessage.TransportEvent
public void close() throws MessagingException
close
in interface AutoCloseable
close
in class Service
MessagingException
- for errors while closingConnectionEvent
public boolean isConnected()
isConnected
in class Service
protected void notifyTransportListeners(int type, Address[] validSent, Address[] validUnsent, Address[] invalid, Message msg)
notifyTransportListeners
in class Transport
type
- the TransportEvent typevalidSent
- valid addresses to which message was sentvalidUnsent
- valid addresses to which message was not sentinvalid
- the invalid addressesmsg
- the messageprotected void finalize() throws Throwable
Service
protected void helo(String domain) throws MessagingException
HELO
command.domain
- our domainMessagingException
- for failuresprotected boolean ehlo(String domain) throws MessagingException
EHLO
command.
Collect the returned list of service extensions.domain
- our domainMessagingException
- for failuresprotected void mailFrom() throws MessagingException
MAIL FROM:
command to start sending a message. Gets the sender's address in the following order:
MessagingException
- for failuresprotected void rcptTo() throws MessagingException
RCPT TO:
command and copies the address either into
the validSentAddr or invalidAddr arrays.
Sets the sendFailed
flag to true if any addresses failed.MessagingException
- for failuresprotected OutputStream data() throws MessagingException
DATA
command to the SMTP host and return
an OutputStream to which the data is to be written.MessagingException
- for failuresprotected void finishData() throws IOException, MessagingException
IOException
- for I/O errorsMessagingException
- for other failuresprotected OutputStream bdat() throws MessagingException
MessagingException
- for failuresprotected void finishBdat() throws IOException, MessagingException
IOException
- for I/O errorsMessagingException
- for other failuresprotected void startTLS() throws MessagingException
STARTTLS
command and switch the socket to
TLS mode if it succeeds.MessagingException
- for failurespublic void issueCommand(String cmd, int expect) throws MessagingException
cmd
- the command to sendexpect
- the expected response code (-1 means don't care)MessagingException
- for failurespublic int simpleCommand(String cmd) throws MessagingException
cmd
- the commandMessagingException
- for failuresprotected int simpleCommand(byte[] cmd) throws MessagingException
cmd
- the commandMessagingException
- for failuresprotected void sendCommand(String cmd) throws MessagingException
cmd
to the server terminating
it with CRLF
.cmd
- the commandMessagingException
- for failuresprotected int readServerResponse() throws MessagingException
returnCode
as the number. Returns -1 on failure. Sets
lastServerResponse
and lastReturnCode
.MessagingException
- for failuresprotected void checkConnected()
IllegalStateException
- if not connectedpublic boolean supportsExtension(String ext)
ext
- the service extension namepublic String getExtensionParameter(String ext)
ext
- the service extension nameprotected boolean supportsAuthentication(String auth)
auth
- the authentication mechanismprotected static String xtext(String s)
xtext = *( xchar / hexchar ) xchar = any ASCII CHAR between "!" (33) and "~" (126) inclusive, except for "+" and "=". ; "hexchar"s are intended to encode octets that cannot appear ; as ASCII characters within an esmtp-value. hexchar = ASCII "+" immediately followed by two upper case hexadecimal digits
s
- the string to convertCopyright © 2020 JBoss by Red Hat. All rights reserved.