- All Implemented Interfaces:
AutoCloseable
- Direct Known Subclasses:
SMTPSSLTransport
See the org.eclipse.angus.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();
}
- See Also:
-
Field Summary
-
Constructor Summary
ConstructorsModifierConstructorDescriptionSMTPTransport(Session session, URLName urlname) Constructor that takes a Session object and a URLName that represents a specific SMTP server.protectedSMTPTransport(Session session, URLName urlname, String name, boolean isSSL) Constructor used by this class and by SMTPSSLTransport subclass. -
Method Summary
Modifier and TypeMethodDescriptionprotected OutputStreambdat()Return a stream that will use the SMTP BDAT command to send data.protected voidCheck if we're in the connected state.voidclose()Close the Transport and terminate the connection to the server.voidStart the SMTP protocol on the given socket, which was already connected by the caller.protected OutputStreamdata()Send theDATAcommand to the SMTP host and return an OutputStream to which the data is to be written.protected booleanIssue theEHLOcommand.protected voidfinalize()protected voidTerminate the sent data.protected voidTerminate the sent data.Gets the authorization ID to be used for authentication.Return the parameter the server provided for the specified service extension, or null if the extension isn't supported.intReturn the return code from the last response we got from the server.Return the last response we got from the server.Get the name of the local host, for use in the EHLO and HELO commands.booleanIs the NOOP command required to return a response code of 250 to indicate success?Gets the NTLM domain to be used for NTLM authentication.booleanShould we report even successful sends by throwing an exception? If so, aSendFailedExceptionwill always be thrown and anSMTPAddressSucceededExceptionwill be included in the exception chain for each successful address, along with the usualSMTPAddressFailedExceptionfor each unsuccessful address.booleanShould we require the STARTTLS command to secure the connection?booleanIs SASL authentication enabled?String[]Get the list of SASL mechanisms to consider if SASL authentication is enabled.Gets the SASL realm to be used for DIGEST-MD5 authentication.booleanShould we use the STARTTLS command to secure the connection if the server supports it?booleanShould SASL use the canonical host name?booleanShould we use the RSET command instead of the NOOP command in the @{link #isConnected isConnected} method?protected voidIssue theHELOcommand.booleanCheck whether the transport is connected.booleanisSSL()Is this Transport using SSL to connect to the server?voidissueCommand(String cmd, int expect) Send the command to the server.protected voidmailFrom()Issue theMAIL FROM:command to start sending a message.protected voidnotifyTransportListeners(int type, Address[] validSent, Address[] validUnsent, Address[] invalid, Message msg) Notify all TransportListeners.protected booleanprotocolConnect(String host, int port, String user, String password) Performs the actual protocol-specific connection attempt.protected voidrcptTo()Sends each address to the SMTP host using theRCPT TO:command and copies the address either into the validSentAddr or invalidAddr arrays.protected intReads server reponse returning thereturnCodeas the number.protected voidsendCommand(String cmd) Sends commandcmdto the server terminating it withCRLF.voidsendMessage(Message message, Address[] addresses) Send the Message to the specified list of addresses.voidsetAuthorizationID(String authzid) Sets the authorization ID to be used for authentication.voidsetLocalHost(String localhost) Set the name of the local host, for use in the EHLO and HELO commands.voidsetNoopStrict(boolean noopStrict) Set whether the NOOP command is required to return a response code of 250 to indicate success.voidsetNTLMDomain(String ntlmDomain) Sets the NTLM domain to be used for NTLM authentication.voidsetReportSuccess(boolean reportSuccess) Set whether successful sends should be reported by throwing an exception.voidsetRequireStartTLS(boolean requireStartTLS) Set whether the STARTTLS command should be required.voidsetSASLEnabled(boolean enableSASL) Set whether SASL authentication is enabled.voidsetSASLMechanisms(String[] mechanisms) Set the list of SASL mechanisms to consider if SASL authentication is enabled.voidsetSASLRealm(String saslRealm) Sets the SASL realm to be used for DIGEST-MD5 authentication.voidsetStartTLS(boolean useStartTLS) Set whether the STARTTLS command should be used.voidsetUseCanonicalHostName(boolean useCanonicalHostName) Set whether SASL should use the canonical host name.voidsetUseRset(boolean useRset) Set whether the RSET command should be used instead of the NOOP command in the @{link #isConnected isConnected} method.protected intsimpleCommand(byte[] cmd) Send the command to the server and return the response code from the server.intsimpleCommand(String cmd) Send the command to the server and return the response code from the server.protected voidstartTLS()Issue theSTARTTLScommand and switch the socket to TLS mode if it succeeds.protected booleansupportsAuthentication(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.booleansupportsExtension(String ext) Return true if the SMTP server supports the specified service extension.protected static StringConvert a string to RFC 1891 xtext format.protected static StringLike xtext(s), but allow UTF-8 strings.Methods inherited from class jakarta.mail.Transport
addTransportListener, removeTransportListener, send, send, send, sendMethods inherited from class jakarta.mail.Service
addConnectionListener, connect, connect, connect, connect, getURLName, notifyConnectionListeners, queueEvent, removeConnectionListener, setConnected, setURLName, toString
-
Constructor Details
-
SMTPTransport
Constructor that takes a Session object and a URLName that represents a specific SMTP server.- Parameters:
session- the Sessionurlname- the URLName of this transport
-
SMTPTransport
Constructor used by this class and by SMTPSSLTransport subclass.- Parameters:
session- the Sessionurlname- the URLName of this transportname- the protocol name of this transportisSSL- use SSL to connect?
-
-
Method Details
-
getLocalHost
Get the name of the local host, for use in the EHLO and HELO commands. The property mail.smtp.localhost overrides mail.smtp.localaddress, which overrides what InetAddress would tell us.- Returns:
- the local host name
-
setLocalHost
Set the name of the local host, for use in the EHLO and HELO commands.- Parameters:
localhost- the local host name- Since:
- JavaMail 1.3.1
-
connect
Start the SMTP protocol on the given socket, which was already connected by the caller. Useful for implementing the SMTP ATRN command (RFC 2645) where an existing connection is used when the server reverses roles and becomes the client.- Parameters:
socket- the already connected socket- Throws:
MessagingException- for failures- Since:
- JavaMail 1.3.3
-
getAuthorizationId
Gets the authorization ID to be used for authentication.- Returns:
- the authorization ID to use for authentication.
- Since:
- JavaMail 1.4.4
-
setAuthorizationID
Sets the authorization ID to be used for authentication.- Parameters:
authzid- the authorization ID to use for authentication.- Since:
- JavaMail 1.4.4
-
getSASLEnabled
public boolean getSASLEnabled()Is SASL authentication enabled?- Returns:
- true if SASL authentication is enabled
- Since:
- JavaMail 1.4.4
-
setSASLEnabled
public void setSASLEnabled(boolean enableSASL) Set whether SASL authentication is enabled.- Parameters:
enableSASL- should we enable SASL authentication?- Since:
- JavaMail 1.4.4
-
getSASLRealm
Gets the SASL realm to be used for DIGEST-MD5 authentication.- Returns:
- the name of the realm to use for SASL authentication.
- Since:
- JavaMail 1.3.1
-
setSASLRealm
Sets the SASL realm to be used for DIGEST-MD5 authentication.- Parameters:
saslRealm- the name of the realm to use for SASL authentication.- Since:
- JavaMail 1.3.1
-
getUseCanonicalHostName
public boolean getUseCanonicalHostName()Should SASL use the canonical host name?- Returns:
- true if SASL should use the canonical host name
- Since:
- JavaMail 1.5.2
-
setUseCanonicalHostName
public void setUseCanonicalHostName(boolean useCanonicalHostName) Set whether SASL should use the canonical host name.- Parameters:
useCanonicalHostName- should SASL use the canonical host name?- Since:
- JavaMail 1.5.2
-
getSASLMechanisms
Get the list of SASL mechanisms to consider if SASL authentication is enabled. If the list is empty or null, all available SASL mechanisms are considered.- Returns:
- the array of SASL mechanisms to consider
- Since:
- JavaMail 1.4.4
-
setSASLMechanisms
Set the list of SASL mechanisms to consider if SASL authentication is enabled. If the list is empty or null, all available SASL mechanisms are considered.- Parameters:
mechanisms- the array of SASL mechanisms to consider- Since:
- JavaMail 1.4.4
-
getNTLMDomain
Gets the NTLM domain to be used for NTLM authentication.- Returns:
- the name of the domain to use for NTLM authentication.
- Since:
- JavaMail 1.4.3
-
setNTLMDomain
Sets the NTLM domain to be used for NTLM authentication.- Parameters:
ntlmDomain- the name of the domain to use for NTLM authentication.- Since:
- JavaMail 1.4.3
-
getReportSuccess
public boolean getReportSuccess()Should we report even successful sends by throwing an exception? If so, aSendFailedExceptionwill always be thrown and anSMTPAddressSucceededExceptionwill be included in the exception chain for each successful address, along with the usualSMTPAddressFailedExceptionfor each unsuccessful address.- Returns:
- true if an exception will be thrown on successful sends.
- Since:
- JavaMail 1.3.2
-
setReportSuccess
public void setReportSuccess(boolean reportSuccess) Set whether successful sends should be reported by throwing an exception.- Parameters:
reportSuccess- should we throw an exception on success?- Since:
- JavaMail 1.3.2
-
getStartTLS
public boolean getStartTLS()Should we use the STARTTLS command to secure the connection if the server supports it?- Returns:
- true if the STARTTLS command will be used
- Since:
- JavaMail 1.3.2
-
setStartTLS
public void setStartTLS(boolean useStartTLS) Set whether the STARTTLS command should be used.- Parameters:
useStartTLS- should we use the STARTTLS command?- Since:
- JavaMail 1.3.2
-
getRequireStartTLS
public boolean getRequireStartTLS()Should we require the STARTTLS command to secure the connection?- Returns:
- true if the STARTTLS command will be required
- Since:
- JavaMail 1.4.2
-
setRequireStartTLS
public void setRequireStartTLS(boolean requireStartTLS) Set whether the STARTTLS command should be required.- Parameters:
requireStartTLS- should we require the STARTTLS command?- Since:
- JavaMail 1.4.2
-
isSSL
public boolean isSSL()Is this Transport using SSL to connect to the server?- Returns:
- true if using SSL
- Since:
- JavaMail 1.4.6
-
getUseRset
public boolean getUseRset()Should we use the RSET command instead of the NOOP command in the @{link #isConnected isConnected} method?- Returns:
- true if RSET will be used
- Since:
- JavaMail 1.4
-
setUseRset
public void setUseRset(boolean useRset) Set whether the RSET command should be used instead of the NOOP command in the @{link #isConnected isConnected} method.- Parameters:
useRset- should we use the RSET command?- Since:
- JavaMail 1.4
-
getNoopStrict
public boolean getNoopStrict()Is the NOOP command required to return a response code of 250 to indicate success?- Returns:
- true if NOOP must return 250
- Since:
- JavaMail 1.4.3
-
setNoopStrict
public void setNoopStrict(boolean noopStrict) Set whether the NOOP command is required to return a response code of 250 to indicate success.- Parameters:
noopStrict- is NOOP required to return 250?- Since:
- JavaMail 1.4.3
-
getLastServerResponse
Return the last response we got from the server. A failed send is often followed by an RSET command, but the response from the RSET command is not saved. Instead, this returns the response from the command before the RSET command.- Returns:
- last response from server
- Since:
- JavaMail 1.3.2
-
getLastReturnCode
public int getLastReturnCode()Return the return code from the last response we got from the server.- Returns:
- return code from last response from server
- Since:
- JavaMail 1.4.1
-
protocolConnect
protected boolean protocolConnect(String host, int port, String user, String password) throws MessagingException Performs the actual protocol-specific connection attempt. Will attempt to connect to "localhost" if the host was null.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).
- Overrides:
protocolConnectin classService- Parameters:
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 password- Returns:
- true if connection successful, false if authentication failed
- Throws:
MessagingException- for non-authentication failures
-
sendMessage
public void sendMessage(Message message, Address[] addresses) throws MessagingException, SendFailedException Send the Message to the specified list of addresses.If all the
addressessucceed the SMTP check using theRCPT 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
addressesfail the SMTP check, and themail.smtp.sendpartialproperty 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
addressesfail the SMTP check, and themail.smtp.sendpartialproperty 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
writeTomethod.- Specified by:
sendMessagein classTransport- Parameters:
message- The MimeMessage to be sentaddresses- List of addresses to send this message to- Throws:
SMTPSendFailedException- 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.- See Also:
-
close
Close the Transport and terminate the connection to the server.- Specified by:
closein interfaceAutoCloseable- Overrides:
closein classService- Throws:
MessagingException- for errors while closing- See Also:
-
isConnected
public boolean isConnected()Check whether the transport is connected. Override superclass method, to actually ping our server connection.- Overrides:
isConnectedin classService- Returns:
- true if the service is connected, false if it is not connected
-
notifyTransportListeners
protected void notifyTransportListeners(int type, Address[] validSent, Address[] validUnsent, Address[] invalid, Message msg) Notify all TransportListeners. Keep track of whether notification has been done so as to only notify once per send.- Overrides:
notifyTransportListenersin classTransport- Parameters:
type- the TransportEvent typevalidSent- valid addresses to which message was sentvalidUnsent- valid addresses to which message was not sentinvalid- the invalid addressesmsg- the message- Since:
- JavaMail 1.4.2
-
finalize
-
helo
Issue theHELOcommand.- Parameters:
domain- our domain- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
ehlo
Issue theEHLOcommand. Collect the returned list of service extensions.- Parameters:
domain- our domain- Returns:
- true if command succeeds
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
mailFrom
Issue theMAIL FROM:command to start sending a message.Gets the sender's address in the following order:
- SMTPMessage.getEnvelopeFrom()
- mail.smtp.from property
- From: header in the message
- System username using the InternetAddress.getLocalAddress() method
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
rcptTo
Sends each address to the SMTP host using theRCPT TO:command and copies the address either into the validSentAddr or invalidAddr arrays. Sets thesendFailedflag to true if any addresses failed.- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
data
Send theDATAcommand to the SMTP host and return an OutputStream to which the data is to be written.- Returns:
- the stream to write to
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
finishData
Terminate the sent data.- Throws:
IOException- for I/O errorsMessagingException- for other failures- Since:
- JavaMail 1.4.1
-
bdat
Return a stream that will use the SMTP BDAT command to send data.- Returns:
- the stream to write to
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.6.0
-
finishBdat
Terminate the sent data.- Throws:
IOException- for I/O errorsMessagingException- for other failures- Since:
- JavaMail 1.6.0
-
startTLS
Issue theSTARTTLScommand and switch the socket to TLS mode if it succeeds.- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
issueCommand
Send the command to the server. If the expected response code is not received, throw a MessagingException.- Parameters:
cmd- the command to sendexpect- the expected response code (-1 means don't care)- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
simpleCommand
Send the command to the server and return the response code from the server.- Parameters:
cmd- the command- Returns:
- the response code
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
simpleCommand
Send the command to the server and return the response code from the server.- Parameters:
cmd- the command- Returns:
- the response code
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
sendCommand
Sends commandcmdto the server terminating it withCRLF.- Parameters:
cmd- the command- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
readServerResponse
Reads server reponse returning thereturnCodeas the number. Returns -1 on failure. SetslastServerResponseandlastReturnCode.- Returns:
- server response code
- Throws:
MessagingException- for failures- Since:
- JavaMail 1.4.1
-
checkConnected
protected void checkConnected()Check if we're in the connected state. Don't bother checking whether the server is still alive, that will be detected later.- Throws:
IllegalStateException- if not connected- Since:
- JavaMail 1.4.1
-
supportsExtension
Return true if the SMTP server supports the specified service extension. Extensions are reported as results of the EHLO command when connecting to the server. See RFC 1869 and other RFCs that define specific extensions.- Parameters:
ext- the service extension name- Returns:
- true if the extension is supported
- Since:
- JavaMail 1.3.2
-
getExtensionParameter
Return the parameter the server provided for the specified service extension, or null if the extension isn't supported.- Parameters:
ext- the service extension name- Returns:
- the extension parameter
- Since:
- JavaMail 1.3.2
-
supportsAuthentication
Does the server we're connected to support the specified authentication mechanism? Uses the extension information returned by the server from the EHLO command.- Parameters:
auth- the authentication mechanism- Returns:
- true if the authentication mechanism is supported
- Since:
- JavaMail 1.4.1
-
xtext
Convert a string to RFC 1891 xtext format.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- Parameters:
s- the string to convert- Returns:
- the xtext format string
- Since:
- JavaMail 1.4.1
-
xtext
Like xtext(s), but allow UTF-8 strings.- Parameters:
s- the string to convertutf8- convert string to UTF-8 first?- Returns:
- the xtext format string
- Since:
- JavaMail 1.6.0
-