Hi all,
I'm trying to send a mail with attach via MailQueue in my plugin but I get the following exception:
015-05-12 20:35:06,915 Sending mailitem To='test@testdomain.ru' Subject='asdfffff' From='jira-testcncuser@testdomain.ru' FromName='null' Cc='null' Bcc='null' ReplyTo='null' InReplyTo='null' MimeType='multipart/mixed' Encoding='UTF-8' Multipart='javax.mail.internet.MimeMultipart@3329db97' MessageId='null' ERROR admin 1235x5644x1 190d8dm 77.75.154.20 /secure/admin/MailQueueAdmin.jspa [atlassian.mail.queue.MailQueueImpl] Error occurred in sending e-mail: To='platonov@yamoney.ru' Subject='asdfffff' From='jira-testcncuser@yamoney.ru' FromName='null' Cc='null' Bcc='null' ReplyTo='null' InReplyTo='null' MimeType='multipart/mixed' Encoding='UTF-8' Multipart='javax.mail.internet.MimeMultipart@3329db97' MessageId='null' [INFO] [talledLocalContainer] com.atlassian.mail.MailException: javax.mail.MessagingException: IOException while sending message; [INFO] [talledLocalContainer] nested exception is: [INFO] [talledLocalContainer] javax.activation.UnsupportedDataTypeException: no object DCH for MIME type image/jpeg [INFO] [talledLocalContainer] at com.atlassian.mail.server.impl.SMTPMailServerImpl.sendWithMessageId(SMTPMailServerImpl.java:213) [INFO] [talledLocalContainer] at com.atlassian.mail.queue.SingleMailQueueItem.send(SingleMailQueueItem.java:44) [INFO] [talledLocalContainer] at com.atlassian.mail.queue.MailQueueImpl.sendBuffer(MailQueueImpl.java:66) [INFO] [talledLocalContainer] at com.atlassian.jira.mail.JiraMailQueue$1.apply(JiraMailQueue.java:57) [INFO] [talledLocalContainer] at com.atlassian.jira.mail.JiraMailQueue$1.apply(JiraMailQueue.java:53) [INFO] [talledLocalContainer] at com.atlassian.jira.util.velocity.DefaultVelocityRequestContextFactory.runWithStaticBaseUrl(DefaultVelocityRequestContextFactory.java:127) ... [INFO] [talledLocalContainer] Caused by: javax.mail.MessagingException: IOException while sending message; [INFO] [talledLocalContainer] nested exception is: [INFO] [talledLocalContainer] javax.activation.UnsupportedDataTypeException: no object DCH for MIME type image/jpeg [INFO] [talledLocalContainer] at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1177) [INFO] [talledLocalContainer] at com.atlassian.mail.server.impl.SMTPMailServerImpl.sendWithMessageId(SMTPMailServerImpl.java:175) [INFO] [talledLocalContainer] ... 196 more [INFO] [talledLocalContainer] Caused by: javax.activation.UnsupportedDataTypeException: no object DCH for MIME type image/jpeg [INFO] [talledLocalContainer] at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:896) [INFO] [talledLocalContainer] at javax.activation.DataHandler.writeTo(DataHandler.java:317) [INFO] [talledLocalContainer] at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) [INFO] [talledLocalContainer] at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:865) [INFO] [talledLocalContainer] at javax.mail.internet.MimeMultipart.writeTo(MimeMultipart.java:462) [INFO] [talledLocalContainer] at com.sun.mail.handlers.multipart_mixed.writeTo(multipart_mixed.java:103) [INFO] [talledLocalContainer] at javax.activation.ObjectDataContentHandler.writeTo(DataHandler.java:889) [INFO] [talledLocalContainer] at javax.activation.DataHandler.writeTo(DataHandler.java:317) [INFO] [talledLocalContainer] at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1485) [INFO] [talledLocalContainer] at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1773) [INFO] [talledLocalContainer] at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1121) [INFO] [talledLocalContainer] ... 197 more
Component is event listener component with code:
package ru.yamoney.jira.plugins.jatresss.logic.mail.outgoing; import com.atlassian.event.api.EventListener; import com.atlassian.event.api.EventPublisher; import com.atlassian.jira.component.ComponentAccessor; import com.atlassian.jira.config.util.AttachmentPathManager; import com.atlassian.jira.event.issue.IssueEvent; import com.atlassian.jira.event.type.EventType; import com.atlassian.jira.issue.attachment.Attachment; import com.atlassian.jira.mail.Email; import com.atlassian.jira.project.ProjectCategory; import com.atlassian.jira.util.PathUtils; import com.atlassian.mail.queue.MailQueue; import com.atlassian.mail.queue.SingleMailQueueItem; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import ru.yamoney.jira.plugins.jatresss.conf.Settings; import ru.yamoney.jira.plugins.jatresss.conf.mapping.issue.Ticket.Direction; import ru.yamoney.jira.plugins.jatresss.conf.mapping.issue.Ticket.TicketType; import ru.yamoney.jira.plugins.jatresss.localization.SystemMessages; import ru.yamoney.jira.plugins.jatresss.logic.issue.servcie.conversion.IssueConverter; import ru.yamoney.jira.plugins.jatresss.model.TicketIssue; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMultipart; import javax.ws.rs.core.MediaType; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.text.MessageFormat; import java.util.List; /** * EventNotifier * <p> * Sends a message on the offensive expected event * </p> * * @author Plat * @version 1.0 23.04.15 */ public class EventNotifier implements InitializingBean, DisposableBean { private final EventPublisher eventPublisher; private final Settings settings; private final IssueConverter issueConverter; private final MailQueue jiraMailQue; private static Logger LOGGER = LoggerFactory.getLogger(EventNotifier.class); /** * Constructor * * @param eventPublisher jira event publisher * @param settings plugin settings * @param issueConverter plugin issue converter * @param jiraMailQue jira mail que */ public EventNotifier( EventPublisher eventPublisher, Settings settings, IssueConverter issueConverter, MailQueue jiraMailQue) { this.eventPublisher = eventPublisher; this.settings = settings; this.issueConverter = issueConverter; this.jiraMailQue = jiraMailQue; } /** * {@inheritDoc} */ @Override public void destroy() throws Exception { eventPublisher.unregister(this); } /** * {@inheritDoc} */ @Override public void afterPropertiesSet() throws Exception { eventPublisher.register(this); } /** * Send email notification on special event * * @param issueEvent jira event */ @EventListener public void onIssueEvent(IssueEvent issueEvent) { if (!isObservableEvent(issueEvent)) { return; } final TicketIssue ticketIssue = issueConverter.convert(TicketIssue.class, issueEvent.getIssue()); if (!isNotifyTicket(ticketIssue)) { return; } sendNotify(ticketIssue); } /** * Shows that event should be notified * * @param issueEvent jira event * @return true if event should be notified */ private boolean isObservableEvent(IssueEvent issueEvent) { final ProjectCategory projectCategoryObject = issueEvent.getProject().getProjectCategoryObject(); return issueEvent.getEventTypeId().equals(EventType.ISSUE_CREATED_ID) && projectCategoryObject != null && projectCategoryObject.getName().equals(settings.getObservableProjectsCategory()); } /** * Shows that ticket should be notified * * @param ticketIssue ticket to check for notify * @return true if ticket should be notified */ private boolean isNotifyTicket(TicketIssue ticketIssue) { return ticketIssue.getType().equals(TicketType.MAIL) && Direction.OUTGOING.equals(ticketIssue.getDirection()); } /** * Send notify using jira mail que * * @param ticketIssue issue to notify */ private void sendNotify(TicketIssue ticketIssue) { final Email emailToSend = new Email(StringUtils.defaultIfBlank(ticketIssue.getReplyTo(), ticketIssue.getTo())); emailToSend.setCc(ticketIssue.getCc()); emailToSend.setFrom(ticketIssue.getFrom()); emailToSend.setSubject(ticketIssue.getTitle()); emailToSend.setMimeType("multipart/mixed"); final Multipart mailMultipart = new MimeMultipart(); final MimeBodyPart bodyPart = new MimeBodyPart(); try { bodyPart.setContent(ticketIssue.getBody(), MediaType.TEXT_HTML); mailMultipart.addBodyPart(bodyPart); } catch (MessagingException e) { LOGGER.error( MessageFormat.format( SystemMessages.NOTIFY_SENDING_FAILED.getLocalizedMessage(), ticketIssue.getKey()), e); return; } try { addAttachmentsToMessage(mailMultipart, ticketIssue.getAttachments(), ticketIssue); } catch (MessagingException e) { LOGGER.error( MessageFormat.format( SystemMessages.NOTIFY_SENDING_FAILED.getLocalizedMessage(), ticketIssue.getKey()), e); return; } emailToSend.setMultipart(mailMultipart); final SingleMailQueueItem queueItem = new SingleMailQueueItem(emailToSend); jiraMailQue.addItem(queueItem); } private void addAttachmentsToMessage( Multipart mailMultipart, List<Attachment> issueAttachments, TicketIssue ticketIssue) throws MessagingException { if (issueAttachments == null || issueAttachments.isEmpty()) { return; } for (Attachment issueAttachment : issueAttachments) { final MimeBodyPart attachBody = new MimeBodyPart(); final AttachmentPathManager attachmentPathManager = ComponentAccessor.getAttachmentPathManager(); final String attachmentFilePath = PathUtils.joinPaths( attachmentPathManager.getAttachmentPath(), ticketIssue.getProjectKey(), ticketIssue.getKey(), issueAttachment.getId().toString()); if (attachmentFilePath == null) { throw new MessagingException( MessageFormat.format("Path for attachment {0} is null", issueAttachment.getFilename())); } final File attachmentFile = new File(attachmentFilePath); try (FileInputStream fileInputStream = new FileInputStream(attachmentFile)) { attachBody.setFileName(attachmentFilePath); attachBody.setContent(fileInputStream, issueAttachment.getMimetype()); } catch (IOException e) { throw new MessagingException( MessageFormat.format("Can't add attachment: {0}", attachmentFilePath), e); } mailMultipart.addBodyPart(attachBody); } } }
Version:
JIRA 6.3.10 (6340) / Atlassian SDK 5.0.4 / FastDev 2.4 / Dev Toolbox 2.0.12
Mistake was to use class:
final MimeBodyPart attachBody = new MimeBodyPart();
If your want to attach files you should use BodyPart abstract class:
final BodyPart attachBody = new MimeBodyPart();
Correct variant for function addAttachmentsToMessage
/** * add attached files to the message * * @param mailMultipart multipart content * @param issueAttachments attachments of issue * @param ticketIssue ticket * @throws MessagingException if attachment */ private void addAttachmentsToMessage( Multipart mailMultipart, List<Attachment> issueAttachments, TicketIssue ticketIssue) throws MessagingException { if (issueAttachments == null || issueAttachments.isEmpty()) { return; } for (Attachment issueAttachment : issueAttachments) { final BodyPart attachBody = new MimeBodyPart(); final AttachmentPathManager attachmentPathManager = ComponentAccessor.getAttachmentPathManager(); final String attachmentFilePath = PathUtils.joinPaths( attachmentPathManager.getAttachmentPath(), ticketIssue.getProjectKey(), ticketIssue.getKey(), issueAttachment.getId().toString()); if (attachmentFilePath == null) { throw new MessagingException( MessageFormat.format( NOTIFY_NULL_ATTACHMENT_PATH.getLocalizedMessage(), issueAttachment.getFilename())); } final File attachmentFile = new File(attachmentFilePath); attachBody.setFileName(issueAttachment.getFilename()); FileDataSource attachSource = new FileDataSource(attachmentFile); attachBody.setDataHandler(new DataHandler(attachSource)); mailMultipart.addBodyPart(attachBody); } }
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.