code: final MimeMessage populateMimeMessage(@Nonnull final Email email, @Nonnull Session session)
  			throws MessagingException, UnsupportedEncodingException {
  		checkArgumentNotEmpty(email, "email is missing");
  		checkArgumentNotEmpty(session, "session is needed, it cannot be attached later");
  		
  		final MimeMessage message = new MimeMessage(session) {
  			@Override
  			protected void updateMessageID() throws MessagingException {
  				if (valueNullOrEmpty(email.getId())) {
  					super.updateMessageID();
  				} else {
  					setHeader("Message-ID", email.getId());
  				}
  			}
  			
  			@Override
  			public String toString() {
  				try {
  					return "MimeMessage<id:" + super.getMessageID() + ", subject:" + super.getSubject() + ">";
  				} catch (MessagingException e) {
  					throw new AssertionError("should not reach here");
  				}
  			}
  		};
  		
  		// set basic email properties
  		MimeMessageHelper.setSubject(email, message);
  		MimeMessageHelper.setFrom(email, message);
  		MimeMessageHelper.setReplyTo(email, message);
  		MimeMessageHelper.setRecipients(email, message);
  		
  		populateMimeMessageMultipartStructure(message, email);
  		
  		MimeMessageHelper.setHeaders(email, message);
  		message.setSentDate(new Date());
  
  		if (!valueNullOrEmpty(email.getDkimSigningDomain())) {
  			return signMessageWithDKIM(message, email);
  		}
  		
  		return message;
  	}
docs: Performs a standard population and then delegates multipart specifics to the subclass.