It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

How to send email from stash plugin?

Jacob Schoen Apr 23, 2013

I attempted to add the javax.mail jar to my plugin to send emails after a post, but I get an exception

com.sun.mail.handlers.text_plain cannot be cast to javax.activation.DataContentHandler
 java.lang.ClassCastException: com.sun.mail.handlers.text_plain cannot be cast to javax.activation.DataContentHandler
   at javax.activation.MailcapCommandMap.getDataContentHandler(MailcapCommandMap.java:596)
   at javax.activation.MailcapCommandMap.createDataContentHandler(MailcapCommandMap.java:550)
   at javax.activation.DataHandler.getDataContentHandler(DataHandler.java:611)
   at javax.activation.DataHandler.writeTo(DataHandler.java:315)
   at javax.mail.internet.MimeUtility.getEncoding(MimeUtility.java:248)
   at javax.mail.internet.MimeBodyPart.updateHeaders(MimeBodyPart.java:1268)
   at javax.mail.internet.MimeMessage.updateHeaders(MimeMessage.java:2012)
   at javax.mail.internet.MimeMessage.saveChanges(MimeMessage.java:1980)
   at javax.mail.Transport.send(Transport.java:97)
   at com.gray.stash.hook.StashPostHookEmailSender.sendEmail(StashPostHookEmailSender.java:153)
   at com.gray.stash.hook.StashPostHookEmailSender.postReceive(StashPostHookEmailSender.java:96)
   at com.atlassian.stash.internal.hook.repository.AsyncPostReceiveRepositoryHookAdapter$1.visit(AsyncPostReceiveRepositoryHookAdapter.java:64)
   at com.atlassian.stash.internal.hook.repository.AsyncPostReceiveRepositoryHookAdapter$1.visit(AsyncPostReceiveRepositoryHookAdapter.java:59)
   at com.atlassian.stash.internal.hook.repository.DefaultRepositoryHookService$8.doInTransaction(DefaultRepositoryHookService.java:398)
   at com.atlassian.stash.internal.hook.repository.DefaultRepositoryHookService$8.doInTransaction(DefaultRepositoryHookService.java:392)
   at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
   at com.atlassian.stash.internal.hook.repository.DefaultRepositoryHookService.visitEnabledHooks(DefaultRepositoryHookService.java:392)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:601)
   at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
   at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:80)
   at com.atlassian.stash.internal.aop.ProfilingAspect.profileMethod(ProfilingAspect.java:43)
   at sun.reflect.GeneratedMethodAccessor173.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:601)
   at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621)
   at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610)
   at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:65)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
   at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:61)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:161)
   at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
   at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
   at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
   at $Proxy182.visitEnabledHooks(Unknown Source)
   at com.atlassian.stash.internal.hook.repository.AsyncPostReceiveRepositoryHookAdapter.postReceive(AsyncPostReceiveRepositoryHookAdapter.java:59)
   at com.atlassian.stash.internal.hook.repository.AsyncPostReceiveRepositoryHookAdapter.onRepositoryPushEvent(AsyncPostReceiveRepositoryHookAdapter.java:55)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:601)
   at com.atlassian.event.internal.SingleParameterMethodListenerInvoker.invoke(SingleParameterMethodListenerInvoker.java:36)
   at com.atlassian.event.internal.AsynchronousAbleEventDispatcher$2.run(AsynchronousAbleEventDispatcher.java:66)
   at com.atlassian.sal.core.executor.ThreadLocalDelegateRunnable.run(ThreadLocalDelegateRunnable.java:34)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
   at java.lang.Thread.run(Thread.java:722)

This seems to be a classpath issue that comes up from time to time. So in my search for a solution, I found How to send email from plugin? that seems to cover Jira and Confluence, but I could not find any information on how to accomplish this with stash. Is there something Similar for Stash Plugins that I can access.

I also found atlassian-mail, which seems to be what the answers in the question I found where using. Is this relevant for Stash plugins? If so what do I need to add to pom to include it in my plugin?

5 answers

1 accepted

2 votes
Answer accepted
Colin Goudie Apr 23, 2013

As the Atlassian's mentioned, just use MailService. You create a MailMessage

MailMessage message = new MailMessage(toEmails, fromEmailAddress,
                ccEmails, Sets.<String>newHashSet(), Sets.<MailAttachment>newHashSet(),
                text, subject,
                emailHeaders
        );

Then send it

if (mailService.isHostConfigured()) {
            MailMessage mailMessage = buildMessage(...);
            mailService.submit(mailMessage);
        }

Jacob Schoen Apr 23, 2013

@Colin Thanks for the help. The code sample made it the best answer.

Sebastian Stein Aug 06, 2014

MailService in Stash API is only an interface, but there seems to be no implementation. How do I create an implementation? I've seen the examples from Confluence where you have to use a TaskManager, but there seems to be no TaskManager in Stash API. Can you please post a more complete example?

Charles O'Farrell Aug 07, 2014

Hi Sebastian,

You'll notice all of Stash services are interfaces. That's because the implmentation is internal and you need to import /inject the service before you can use it.

class MyClass {
  final MailService mailService;
  public MyClass(MailService mailService) {
    this.mailService = mailService;
  }
}

atlassian-plugin.xml:

<component-import key="mail-service" interface="com.atlassian.stash.mail.MailService" />
<component key="myclass" class="com.example.MyClass" />

https://developer.atlassian.com/display/DOCS/Component+Import+Plugin+Module

I hope that helps.

Charles

1 vote
Jason Hinch Atlassian Team Apr 23, 2013

Take a look at the MailService provided as part of Stash's public API.

Jacob Schoen Apr 23, 2013

Thanks for the point in the right direction.

1 vote
Michael Heemskerk Atlassian Team Apr 23, 2013

Hi Jacob,

The simplest option is to use Stash's MailService.

Cheers,

Michael

Jacob Schoen Apr 23, 2013

Thanks for the point in the right direction.

0 votes
Suman Rai Apr 28, 2013
Hi, I am using Stash's 'MailService' to send mails. But for some Outlooks Distribution lists, which contains '&' in it (for example R&Dteam@example.com) is not receiving mails. Also I am not finding any error message any where. Can I get any help on this Forum. Thanks Suman
Seb Ruiz Atlassian Team Apr 28, 2013
0 votes
Suman Rai Apr 28, 2013

Thanks for the quick response Seb, but it did not give me any clue. I am already running my Stash in debug mode and configure it into Ecplise. Strange thing is it is happening only for the mail ids having '&' in it.

Please help, I tried all possible options (like replacing & with %26 and amp; etc..). Also tried sending as 'R&Dteam@example.com' in to address.

Thanks

Suman

Charles O'Farrell Apr 29, 2013

Hi Suman,

We are just using Spring Mail to send the mail. Personally I would try and write a small Java class that sends a message to your mail server and see if that works first. I suspect the problem may lie there and not in Stash directly.

Cheers,

Charles

Suman Rai Apr 29, 2013

Thanks Charles and Seb. Yes you were correct, problem was at xchange server. I contacted to IT team regarding this and now users in 'R&Dteam' DLs are able to receive the mails. Sorry if I was not clear at begining of my question, I am new user in this world!!

Thanks a lot for promt help and analysis. Hope same will there for any other future issues.

Suggest an answer

Log in or Sign up to answer
This widget could not be displayed.
This widget could not be displayed.
Community showcase
Posted in Statuspage

⭐️Would you recommend Statuspage? Leave a (honest!) review. ⭐️

Hi Community friends, We're working on sourcing more reviews on Capterra – a popular software review site –  to help teams like yours make more informed decisions when choosing an inc...

82 views 3 5
Join discussion

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you