String ctype = getContentType(mm);
String ctype = Mime.getContentType(mm);
        protected boolean visitMessage(MimeMessage mm, VisitPhase visitKind) throws MessagingException {            if (visitKind != VisitPhase.VISIT_BEGIN)                return false;            // only want to affect multipart/alternative messages            String ctype = getContentType(mm);            if (!ctype.equals(Mime.CT_MULTIPART_ALTERNATIVE))                return false;            BodyPart bp = null;            try {                Object content = Mime.getMultipartContent(mm, ctype);                if (content instanceof MimeMultipart)                    bp = getPrimaryPart((MimeMultipart) content);            } catch (IOException e) {                ZimbraLog.extensions.warn("exception while traversing message; skipping", e);            } catch (MessagingException e) {                ZimbraLog.extensions.warn("exception while traversing message; skipping", e);            }            if (bp == null)                return false;            // check to make sure that the caller's OK with altering the message            if (mCallback != null && !mCallback.onModification())                return false;            // and put the selected part where the multipart/alternative used to be            mm.setDataHandler(bp.getDataHandler());            return true;        }