{"record":{"id":"0700cecf81230308","repo":"flowable/flowable-engine","slug":"failed-to-create-mime-message","errorCode":null,"errorMessage":"Failed to create mime message","messagePattern":"Failed to create mime message","errorType":"exception","errorClass":"FlowableMailException","httpStatus":null,"severity":"error","filePath":"modules/flowable-mail/src/main/java/org/flowable/mail/common/impl/jakarta/mail/JakartaMailFlowableMailClient.java","lineNumber":102,"sourceCode":"    private static final Duration SOCKET_TIMEOUT = Duration.ofSeconds(60);\n    private static final Duration SOCKET_CONNECTION_TIMEOUT = Duration.ofSeconds(60);\n\n    protected final MailServerConfiguration serverConfiguration;\n    protected final MailDefaultsConfiguration defaultsConfiguration;\n\n    public JakartaMailFlowableMailClient(MailServerConfiguration serverConfiguration, MailDefaultsConfiguration defaultsConfiguration) {\n        this.serverConfiguration = serverConfiguration;\n        this.defaultsConfiguration = defaultsConfiguration;\n    }\n\n    @Override\n    public ExecutableSendMailRequest prepareRequest(SendMailRequest request) {\n        Session session = createSession();\n        try {\n            MimeMessage mimeMessage = createMimeMessage(request, session);\n            return new JakartaMailSendMailRequest(mimeMessage);\n        } catch (MessagingException e) {\n            throw new FlowableMailException(\"Failed to create mime message\", e);\n        }\n    }\n\n    protected MimeMessage createMimeMessage(SendMailRequest request, Session session) throws MessagingException {\n        MimeMessage mimeMessage = new MimeMessage(session);\n\n        MailMessage message = request.message();\n        Charset charset = getCharset(message);\n        setContent(mimeMessage, message, charset != null ? charset.name() : null);\n        setSubject(mimeMessage, message.getSubject(), charset);\n        addHeaders(mimeMessage, message.getHeaders(), charset);\n        addTo(mimeMessage, message.getTo());\n        addCc(mimeMessage, message.getCc());\n        addBcc(mimeMessage, message.getBcc());\n\n        setFrom(mimeMessage, message.getFrom());\n        setSentDate(mimeMessage);\n","sourceCodeStart":84,"sourceCodeEnd":120,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-mail/src/main/java/org/flowable/mail/common/impl/jakarta/mail/JakartaMailFlowableMailClient.java#L84-L120","documentation":"JakartaMailFlowableMailClient.prepareRequest builds a jakarta.mail MimeMessage from a SendMailRequest. Any MessagingException raised while assembling the message (invalid headers, bad addresses, malformed content) is wrapped in FlowableMailException with the message 'Failed to create mime message'.","triggerScenarios":"Calling the mail client's send/prepareRequest path where createMimeMessage throws MessagingException — e.g. illegal header values, invalid recipient addresses from addRecipient/setFrom, or unsupported charset/content settings.","commonSituations":"Emails with dynamically generated recipients or subject headers containing illegal characters or newlines; bad addresses in data coming from users or a database; charset configuration that jakarta.mail rejects.","solutions":["Inspect the wrapped MessagingException cause for the exact failure (e.g. address or header problem).","Validate all email addresses and header values in the SendMailRequest before sending.","Check the configured charset and any custom headers/subject for illegal characters (CR/LF, non-ASCII where unsupported).","Sanitize or drop offending fields and retry the request."],"exampleFix":"// before\nmailClient.sendMail(SendMailRequest.builder().to(rawUserInput).subject(subject).build());\n\n// after\nString to = sanitizeAndValidateEmail(rawUserInput); // trim, check pattern, no CR/LF\nif (to != null) {\n    mailClient.sendMail(SendMailRequest.builder().to(to).subject(subject).build());\n}","handlingStrategy":"try-catch","validationCode":"private static final Pattern EMAIL = Pattern.compile(\"^[^@\\\\s]+@[^@\\\\s]+\\\\.[^@\\\\s]+$\");\nboolean validEmail(String s) { return s != null && EMAIL.matcher(s.trim()).matches(); }","typeGuard":"boolean isSendable(SendMailRequest r) { return r != null && r.getTo() != null && r.getTo().stream().allMatch(this::validEmail); }","tryCatchPattern":"try { client.sendMail(request); } catch (FlowableMailException e) { log.error(\"mime message creation failed\", e.getCause()); throw new MailSendException(\"invalid mail request\", e); }","preventionTips":["Sanitize subject/header strings for CR/LF and control characters.","Validate all addresses before assembling the request.","Pin an explicit, supported charset for message content."],"tags":["mail","jakarta-mail","mime-message","email"],"backgroundTag":"api-request-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}