/*
 *  Copyright (c) 2011-2015 The original author or authors
 *
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *       The Eclipse Public License is available at
 *       http://www.eclipse.org/legal/epl-v10.html
 *
 *       The Apache License v2.0 is available at
 *       http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */

package io.vertx.ext.mail.mailencoder;

import io.vertx.core.MultiMap;
import io.vertx.core.http.CaseInsensitiveHeaders;
import io.vertx.ext.mail.MailAttachment;
import io.vertx.ext.mail.MailMessage;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

create MIME mail messages from a MailMessage object

example usage is:


MailMessage = new MailMessage();
(set elements and attachments ...)
String message = new MailEncoder(mailmessage).encode();
 

usually you are not using this class directly, rather it will be used by sendMail() in MailClientImpl

Author:Alexander Lehmann
/** * create MIME mail messages from a MailMessage object * <p> * example usage is: * <p> * * <pre> * {@code * MailMessage = new MailMessage(); * (set elements and attachments ...) * String message = new MailEncoder(mailmessage).encode(); * } * </pre> * <p> * usually you are not using this class directly, rather it will be used by {@code sendMail()} in MailClientImpl * * @author <a href="http://oss.lehmann.cx/">Alexander Lehmann</a> */
public class MailEncoder { private final MailMessage message; private final String hostname; private String messageID;
create a MailEncoder for the message

The class will probably get a few setters for optional features of the SMTP protocol later e.g. 8BIT or SMTPUTF (this is not yet supported)

Params:
  • message – the message to encode later
  • hostname – the hostname to be used in message-id or null to get hostname from OS network config
/** * create a MailEncoder for the message * <p> * The class will probably get a few setters for optional features of the SMTP protocol later e.g. 8BIT or SMTPUTF * (this is not yet supported) * * @param message the message to encode later * @param hostname the hostname to be used in message-id or null to get hostname from OS network config */
public MailEncoder(MailMessage message, String hostname) { this.message = message; this.hostname = hostname; }
encode the MailMessage to a String
Returns:the encoded message
/** * encode the MailMessage to a String * * @return the encoded message */
public String encode() { EncodedPart completeMessage; EncodedPart mainPart; String text = message.getText(); String html = message.getHtml(); if (text != null && html != null) { mainPart = new MultiPart(Arrays.asList(new TextPart(text, "plain"), htmlPart()), "alternative"); } else if (text != null) { mainPart = new TextPart(text, "plain"); } else if (html != null) { mainPart = htmlPart(); } else { // message with only attachments mainPart = null; } List<MailAttachment> attachments = message.getAttachment(); if (attachments != null) { List<EncodedPart> parts = new ArrayList<>(); if (mainPart != null) { parts.add(mainPart); } for (MailAttachment a : attachments) { parts.add(new AttachmentPart(a)); } completeMessage = new MultiPart(parts, "mixed"); } else { completeMessage = mainPart; } if (completeMessage == null) { // if we have neither a text part nor attachments, create // an empty message with the default headers completeMessage = new TextPart("", "plain"); } completeMessage.headers = createHeaders(completeMessage.headers); return completeMessage.asString(); }
Returns:
/** * @return */
private EncodedPart htmlPart() { EncodedPart mainPart; if (message.getInlineAttachment() != null) { List<EncodedPart> parts = new ArrayList<>(); parts.add(new TextPart(message.getHtml(), "html")); for (MailAttachment a : message.getInlineAttachment()) { parts.add(new AttachmentPart(a)); } mainPart = new MultiPart(parts, "related"); } else { mainPart = new TextPart(message.getHtml(), "html"); } return mainPart; }
create the headers of the MIME message by combining the headers the user has supplied with the ones necessary for the message
Returns:MultiMap of final headers
/** * create the headers of the MIME message by combining the headers the user has supplied with the ones necessary for * the message * * @return MultiMap of final headers */
private MultiMap createHeaders(MultiMap additionalHeaders) { MultiMap headers = new CaseInsensitiveHeaders(); if (!message.isFixedHeaders()) { headers.set("MIME-Version", "1.0"); headers.set("Message-ID", Utils.generateMessageID(hostname)); headers.set("Date", Utils.generateDate()); if (message.getSubject() != null) { headers.set("Subject", Utils.encodeHeader(message.getSubject(), 9)); } if (message.getFrom() != null) { headers.set("From", Utils.encodeHeaderEmail(message.getFrom(), 6)); } if (message.getTo() != null) { headers.set("To", Utils.encodeEmailList(message.getTo(), 4)); } if (message.getCc() != null) { headers.set("Cc", Utils.encodeEmailList(message.getCc(), 4)); } headers.addAll(additionalHeaders); } // add the user-supplied headers as last step, this way it is possible // to supply a custom Message-ID for example. MultiMap headersToSet = message.getHeaders(); if (headersToSet != null) { for (String key : headersToSet.names()) { headers.remove(key); } headers.addAll(headersToSet); } messageID = headers.get("Message-ID"); return headers; }
Returns:the messageId
/** * @return the messageId */
public String getMessageID() { return messageID; } }