📄 mimemessagehelper.java
字号:
/*
* Copyright 2002-2004 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.mail.javamail;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.FileTypeMap;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimePart;
import org.springframework.core.io.InputStreamSource;
import org.springframework.core.io.Resource;
import org.springframework.util.Assert;
/**
* Helper class for easy population of a <code>javax.mail.internet.MimeMessage</code>.
*
* <p>Mirrors the simple setters of SimpleMailMessage, directly applying the values
* to the underlying MimeMessage. Allows to define a character encoding for the
* entire message, automatically applied by all methods of this helper.
*
* <p>Also offers support for typical mail attachments, and for personal names
* that accompany mail addresses. Note that advanced settings can still be applied
* directly to the underlying MimeMessage object!
*
* <p>Typically used in MimeMessagePreparator implementations or JavaMailSender
* client code: simply instantiating it as a MimeMessage wrapper, invoking
* setters on the wrapper, using the underlying MimeMessage for mail sending.
* Also used internally by JavaMailSenderImpl.
*
* <p>Sample code for an HTML mail with an inline image and a PDF attachment:
*
* <pre>
* mailSender.send(new MimeMessagePreparator() {
* public void prepare(MimeMessage mimeMessage) throws MessagingException {
* MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true, "UTF-8");
* message.setFrom("me@mail.com");
* message.setTo("you@mail.com");
* message.setSubject("my subject");
* message.setText("my text <img src='cid:myLogo'>", true);
* message.addInline("myLogo", new ClassPathResource("img/mylogo.gif"));
* message.addAttachment("myDocument.pdf", new ClassPathResource("doc/myDocument.pdf"));
* }
* });</pre>
*
* Consider using MimeMailMessage (which implements the common MailMessage
* interface, just like SimpleMailMessage) on top of a MimeMessageHelper,
* to let message population code interact with a simple message or a MIME
* message through a common interface.
*
* @author Juergen Hoeller
* @since 19.01.2004
* @see #getMimeMessage
* @see MimeMessagePreparator
* @see JavaMailSender
* @see JavaMailSenderImpl
* @see javax.mail.internet.MimeMessage
* @see org.springframework.mail.SimpleMailMessage
* @see MimeMailMessage
*/
public class MimeMessageHelper {
private static final String MULTIPART_SUBTYPE_RELATED = "related";
private static final String MULTIPART_SUBTYPE_ALTERNATIVE = "alternative";
private static final String CONTENT_TYPE_HTML = "text/html";
private static final String CONTENT_TYPE_ALTERNATIVE = "text/alternative";
private static final String CONTENT_TYPE_CHARSET_SUFFIX = ";charset=";
private static final String HEADER_CONTENT_ID = "Content-ID";
private final MimeMessage mimeMessage;
private MimeMultipart mimeMultipart;
private String encoding;
private boolean validateAddresses = false;
/**
* Create a new MimeMessageHelper for the given MimeMessage,
* assuming a simple text message (no multipart content,
* i.e. no alternative texts and no inline elements or attachments).
* @param mimeMessage MimeMessage to work on
* @see #MimeMessageHelper(javax.mail.internet.MimeMessage, boolean)
*/
public MimeMessageHelper(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
}
/**
* Create a new MimeMessageHelper for the given MimeMessage,
* assuming a simple text message (no multipart content,
* i.e. no alternative texts and no inline elements or attachments).
* @param mimeMessage MimeMessage to work on
* @param encoding the character encoding to use for the message
* @see #MimeMessageHelper(javax.mail.internet.MimeMessage, boolean)
*/
public MimeMessageHelper(MimeMessage mimeMessage, String encoding) {
this(mimeMessage);
this.encoding = encoding;
}
/**
* Create a new MimeMessageHelper for the given MimeMessage,
* in multipart mode (supporting alternative texts, inline
* elements and attachments) if requested.
* @param mimeMessage MimeMessage to work on
* @param multipart whether to create a multipart message that
* supports alternative texts, inline elements and attachments
*/
public MimeMessageHelper(MimeMessage mimeMessage, boolean multipart) throws MessagingException {
this.mimeMessage = mimeMessage;
if (multipart) {
this.mimeMultipart = new MimeMultipart(MULTIPART_SUBTYPE_RELATED);
this.mimeMessage.setContent(this.mimeMultipart);
}
}
/**
* Create a new MimeMessageHelper for the given MimeMessage,
* in multipart mode (supporting alternative texts, inline
* elements and attachments) if requested.
* @param mimeMessage MimeMessage to work on
* @param multipart whether to create a multipart message that
* supports alternative texts, inline elements and attachments
* @param encoding the character encoding to use for the message
*/
public MimeMessageHelper(MimeMessage mimeMessage, boolean multipart, String encoding)
throws MessagingException {
this(mimeMessage, multipart);
this.encoding = encoding;
}
/**
* Return the underlying MimeMessage object.
*/
public final MimeMessage getMimeMessage() {
return mimeMessage;
}
/**
* Return whether this helper is in multipart mode,
* i.e. whether it holds a multipart message.
* @see #MimeMessageHelper(MimeMessage, boolean)
*/
public final boolean isMultipart() {
return (this.mimeMultipart != null);
}
/**
* Return the underlying MIME multipart object, if any.
* Cam be used to manually add body parts etc.
* @throws IllegalStateException if this helper is not in multipart mode
* @see #isMultipart
* @see javax.mail.internet.MimeMultipart#addBodyPart
*/
public final MimeMultipart getMimeMultipart() throws IllegalStateException {
if (this.mimeMultipart == null) {
throw new IllegalStateException("Not in multipart mode - " +
"create an appropriate MimeMessageHelper via a constructor that takes a 'multipart' flag " +
"if you need to set alternative texts or add inline elements or attachments.");
}
return this.mimeMultipart;
}
/**
* Return the character encoding used for this message.
*/
public String getEncoding() {
return encoding;
}
/**
* Set whether to validate all addresses which get passed to this helper.
* Default is false.
* <p>Note that this is by default just available for JavaMail >= 1.3.
* You can override the default validateAddress method for validation
* on older JavaMail versions or for custom validation.
* @see #validateAddress
*/
public void setValidateAddresses(boolean validateAddresses) {
this.validateAddresses = validateAddresses;
}
/**
* Return whether this helper will validate all addresses passed to it.
*/
public boolean isValidateAddresses() {
return validateAddresses;
}
/**
* Validate the given mail address.
* Called by all of MimeMessageHelper's address setters and adders.
* <p>Default implementation invokes <code>InternetAddress.validate()</code>,
* provided that address validation is activated for the helper instance.
* <p>Note that this method will just work on JavaMail >= 1.3. You can override
* it for validation on older JavaMail versions or for custom validation.
* @param address the address to validate
* @throws AddressException if validation failed
* @see #isValidateAddresses()
* @see javax.mail.internet.InternetAddress#validate()
*/
protected void validateAddress(InternetAddress address) throws AddressException {
if (isValidateAddresses()) {
address.validate();
}
}
/**
* Validate all given mail addresses.
* Default implementation simply delegates to validateAddress for each address.
* @param addresses the addresses to validate
* @throws AddressException if validation failed
* @see #validateAddress(InternetAddress)
*/
protected void validateAddresses(InternetAddress[] addresses) throws AddressException {
for (int i = 0; i < addresses.length; i++) {
validateAddress(addresses[i]);
}
}
public void setFrom(InternetAddress from) throws MessagingException {
Assert.notNull(from, "From address must not be null");
validateAddress(from);
this.mimeMessage.setFrom(from);
}
public void setFrom(String from) throws MessagingException {
Assert.notNull(from, "From address must not be null");
setFrom(new InternetAddress(from));
}
public void setFrom(String from, String personal) throws MessagingException, UnsupportedEncodingException {
Assert.notNull(from, "From address must not be null");
setFrom(getEncoding() != null ?
new InternetAddress(from, personal, getEncoding()) : new InternetAddress(from, personal));
}
public void setReplyTo(InternetAddress replyTo) throws MessagingException {
Assert.notNull(replyTo, "Reply-to address must not be null");
validateAddress(replyTo);
this.mimeMessage.setReplyTo(new InternetAddress[] {replyTo});
}
public void setReplyTo(String replyTo) throws MessagingException {
Assert.notNull(replyTo, "Reply-to address must not be null");
setReplyTo(new InternetAddress(replyTo));
}
public void setReplyTo(String replyTo, String personal) throws MessagingException, UnsupportedEncodingException {
Assert.notNull(replyTo, "Reply-to address must not be null");
InternetAddress replyToAddress = (getEncoding() != null) ?
new InternetAddress(replyTo, personal, getEncoding()) : new InternetAddress(replyTo, personal);
setReplyTo(replyToAddress);
}
public void setTo(InternetAddress to) throws MessagingException {
Assert.notNull(to, "To address must not be null");
validateAddress(to);
this.mimeMessage.setRecipient(Message.RecipientType.TO, to);
}
public void setTo(InternetAddress[] to) throws MessagingException {
Assert.notNull(to, "To address array must not be null");
validateAddresses(to);
this.mimeMessage.setRecipients(Message.RecipientType.TO, to);
}
public void setTo(String to) throws MessagingException {
Assert.notNull(to, "To address must not be null");
setTo(new InternetAddress(to));
}
public void setTo(String[] to) throws MessagingException {
Assert.notNull(to, "To address array must not be null");
InternetAddress[] addresses = new InternetAddress[to.length];
for (int i = 0; i < to.length; i++) {
addresses[i] = new InternetAddress(to[i]);
}
setTo(addresses);
}
public void addTo(InternetAddress to) throws MessagingException {
Assert.notNull(to, "To address must not be null");
validateAddress(to);
this.mimeMessage.addRecipient(Message.RecipientType.TO, to);
}
public void addTo(String to) throws MessagingException {
Assert.notNull(to, "To address must not be null");
addTo(new InternetAddress(to));
}
public void addTo(String to, String personal) throws MessagingException, UnsupportedEncodingException {
Assert.notNull(to, "To address must not be null");
addTo(getEncoding() != null ?
new InternetAddress(to, personal, getEncoding()) :
new InternetAddress(to, personal));
}
public void setCc(InternetAddress cc) throws MessagingException {
Assert.notNull(cc, "Cc address must not be null");
validateAddress(cc);
this.mimeMessage.setRecipient(Message.RecipientType.CC, cc);
}
public void setCc(InternetAddress[] cc) throws MessagingException {
Assert.notNull(cc, "Cc address array must not be null");
validateAddresses(cc);
this.mimeMessage.setRecipients(Message.RecipientType.CC, cc);
}
public void setCc(String cc) throws MessagingException {
Assert.notNull(cc, "Cc address must not be null");
setCc(new InternetAddress(cc));
}
public void setCc(String[] cc) throws MessagingException {
Assert.notNull(cc, "Cc address array must not be null");
InternetAddress[] addresses = new InternetAddress[cc.length];
for (int i = 0; i < cc.length; i++) {
addresses[i] = new InternetAddress(cc[i]);
}
setCc(addresses);
}
public void addCc(InternetAddress cc) throws MessagingException {
Assert.notNull(cc, "Cc address must not be null");
validateAddress(cc);
this.mimeMessage.addRecipient(Message.RecipientType.CC, cc);
}
public void addCc(String cc) throws MessagingException {
Assert.notNull(cc, "Cc address must not be null");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -