blob: 7c700a6eebe4205e08d81b2822f4c4f41c50368c [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.camel.component.mail;
import java.text.DateFormat;
import java.util.Date;
import javax.mail.Address;
import javax.mail.Message;
import javax.mail.MessagingException;
import org.apache.camel.util.ObjectHelper;
/**
* Mail utility class.
* <p>
* Parts of the code copied from Apache ServiceMix.
*
* @version
*/
public final class MailUtils {
public static final int DEFAULT_PORT_SMTP = 25;
public static final int DEFAULT_PORT_SMTPS = 465;
public static final int DEFAULT_PORT_POP3 = 110;
public static final int DEFAULT_PORT_POP3S = 995;
public static final int DEFAULT_PORT_NNTP = 119;
public static final int DEFAULT_PORT_IMAP = 143;
public static final int DEFAULT_PORT_IMAPS = 993;
public static final String PROTOCOL_SMTP = "smtp";
public static final String PROTOCOL_SMTPS = "smtps";
public static final String PROTOCOL_POP3 = "pop3";
public static final String PROTOCOL_POP3S = "pop3s";
public static final String PROTOCOL_NNTP = "nntp";
public static final String PROTOCOL_IMAP = "imap";
public static final String PROTOCOL_IMAPS = "imaps";
private MailUtils() {
}
/**
* Returns the default port for a given protocol.
* <p>
* If a protocol could not successfully be determined the default port number for SMTP protocol is returned.
*
* @param protocol the protocol
* @return the default port
*/
public static int getDefaultPortForProtocol(final String protocol) {
int port = DEFAULT_PORT_SMTP;
if (protocol != null) {
if (protocol.equalsIgnoreCase(PROTOCOL_IMAP)) {
port = DEFAULT_PORT_IMAP;
} else if (protocol.equalsIgnoreCase(PROTOCOL_IMAPS)) {
port = DEFAULT_PORT_IMAPS;
} else if (protocol.equalsIgnoreCase(PROTOCOL_NNTP)) {
port = DEFAULT_PORT_NNTP;
} else if (protocol.equalsIgnoreCase(PROTOCOL_POP3)) {
port = DEFAULT_PORT_POP3;
} else if (protocol.equalsIgnoreCase(PROTOCOL_POP3S)) {
port = DEFAULT_PORT_POP3S;
} else if (protocol.equalsIgnoreCase(PROTOCOL_SMTP)) {
port = DEFAULT_PORT_SMTP;
} else if (protocol.equalsIgnoreCase(PROTOCOL_SMTPS)) {
port = DEFAULT_PORT_SMTPS;
} else {
port = DEFAULT_PORT_SMTP;
}
}
return port;
}
/**
* Gets a log dump of the given message that can be used for tracing etc.
*
* @param message the Mail message
* @return a log string with important fields dumped
*/
public static String dumpMessage(Message message) {
if (message == null) {
return "null";
}
try {
StringBuilder sb = new StringBuilder();
int number = message.getMessageNumber();
sb.append("messageNumber=[").append(number).append("]");
Address[] from = message.getFrom();
if (from != null) {
for (Address adr : from) {
sb.append(", from=[").append(adr).append("]");
}
}
Address[] to = message.getRecipients(Message.RecipientType.TO);
if (to != null) {
for (Address adr : to) {
sb.append(", to=[").append(adr).append("]");
}
}
String subject = message.getSubject();
if (subject != null) {
sb.append(", subject=[").append(subject).append("]");
}
Date sentDate = message.getSentDate();
if (sentDate != null) {
sb.append(", sentDate=[").append(DateFormat.getDateTimeInstance().format(sentDate)).append("]");
}
Date receivedDate = message.getReceivedDate();
if (receivedDate != null) {
sb.append(", receivedDate=[").append(DateFormat.getDateTimeInstance().format(receivedDate)).append("]");
}
return sb.toString();
} catch (MessagingException e) {
// ignore the error and just return tostring
return message.toString();
}
}
/**
* Pads the content-type so it has a space after semi colon that separate pairs.
* <p/>
* This is needed as some mail servers will choke otherwise
*
* @param contentType the content type
* @return the padded content type
*/
public static String padContentType(String contentType) {
StringBuilder sb = new StringBuilder();
String[] parts = contentType.split(";");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
if (ObjectHelper.isNotEmpty(part)) {
part = part.trim();
sb.append(part);
if (i < parts.length - 1) {
sb.append("; ");
}
}
}
return sb.toString();
}
/**
* Replaces the charset in the content-type
*
* @param contentType the content-type
* @param charset the charset to replace, can be <tt>null</tt> to remove charset
* @return the content-type with replaced charset
*/
public static String replaceCharSet(String contentType, String charset) {
boolean replaced = false;
StringBuilder sb = new StringBuilder();
String[] parts = contentType.split(";");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
part = part.trim();
if (!part.startsWith("charset")) {
part = part.trim();
if (sb.length() > 0) {
sb.append("; ");
}
sb.append(part);
} else if (charset != null) {
// replace with new charset
if (sb.length() > 0) {
sb.append("; ");
}
sb.append("charset=");
sb.append(charset);
replaced = true;
}
}
// if we did not replace any existing charset, then append new charset at the end
if (!replaced && charset != null) {
if (sb.length() > 0) {
sb.append("; ");
}
sb.append("charset=");
sb.append(charset);
}
return sb.toString();
}
/**
* Gets the charset from the content-type
*
* @param contentType the content-type
* @return the charset, or <tt>null</tt> if no charset existed
*/
public static String getCharSetFromContentType(String contentType) {
if (contentType == null) {
return null;
}
String[] parts = contentType.split(";");
for (int i = 0; i < parts.length; i++) {
String part = parts[i];
part = part.trim();
if (part.startsWith("charset")) {
return ObjectHelper.after(part, "charset=");
}
}
return null;
}
}