Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-1028

Don't require username on send mail routes (relays don't require login)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major
    • Resolution: Fixed
    • 1.4.0
    • 1.5.0
    • camel-mail
    • None

    Description

      Don't require a login in the send mail URI because internal relay mail servers don't require them. If you do include one, the mail server gets confused and thinks that you are looping and it will bounce the email so this is a bit inconvenient bug.

      Thread [Thread: 1 org.apache.camel.component.mail.MailComponent@663ec] (Suspended (exception NullPointerException))
      Properties(Hashtable<K,V>).put(K, V) line: 394
      MailConfiguration.createJavaMailProperties() line: 146
      MailConfiguration.createJavaMailSender() line: 107
      MailEndpoint.createProducer() line: 53
      ProducerCache<E>.getProducer(Endpoint<E>) line: 50
      ProducerCache<E>.send(Endpoint<E>, Processor) line: 84
      DefaultProducerTemplate<E>.send(Endpoint<E>, Processor) line: 84
      DefaultProducerTemplate<E>.sendBodyAndHeaders(Endpoint, Object, Map<String,Object>) line: 143
      DefaultProducerTemplate<E>.sendBodyAndHeaders(String, Object, Map<String,Object>) line: 139
      LogEmailThrowsAdvice.sendEmail(String) line: 64
      LogEmailThrowsAdvice.afterThrowing(Method, Object[], Object, Exception) line: 42
      NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
      NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
      DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
      Method.invoke(Object, Object...) line: 597
      ThrowsAdviceInterceptor.invokeHandlerMethod(MethodInvocation, Throwable, Method) line: 146
      ThrowsAdviceInterceptor.invoke(MethodInvocation) line: 131
      ReflectiveMethodInvocation.proceed() line: 171
      JdkDynamicAopProxy.invoke(Object, Method, Object[]) line: 204
      $Proxy24.process(Exchange) line: not available
      BeanProcessor.process(Exchange) line: 81
      BeanEndpoint(ProcessorEndpoint).onExchange(Exchange) line: 92
      ProcessorEndpoint$1.process(Exchange) line: 66
      AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(Exchange, AsyncCallback) line: 43
      SendProcessor.process(Exchange, AsyncCallback) line: 75
      InstrumentationProcessor.process(Exchange, AsyncCallback) line: 57
      DeadLetterChannel.process(Exchange, AsyncCallback, DeadLetterChannel$RedeliveryData) line: 155
      DeadLetterChannel.process(Exchange, AsyncCallback) line: 91
      InstrumentationProcessor.process(Exchange, AsyncCallback) line: 57
      UnitOfWorkProcessor.process(Exchange, AsyncCallback) line: 39
      AsyncProcessorHelper.process(AsyncProcessor, Exchange) line: 41
      UnitOfWorkProcessor(DelegateAsyncProcessor).process(Exchange) line: 66
      MailConsumer.processMessage(Message) line: 169
      MailConsumer.processMessages(Message[]) line: 151
      MailConsumer.poll() line: 105
      MailConsumer(ScheduledPollConsumer<E>).run() line: 65
      Executors$RunnableAdapter<T>.call() line: 441
      FutureTask$Sync.innerRunAndReset() line: 317
      ScheduledThreadPoolExecutor$ScheduledFutureTask<V>(FutureTask<V>).runAndReset() line: 150
      ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.access$101(ScheduledThreadPoolExecutor$ScheduledFutureTask) line: 98
      ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.runPeriodic() line: 181
      ScheduledThreadPoolExecutor$ScheduledFutureTask<V>.run() line: 205
      ThreadPoolExecutor$Worker.runTask(Runnable) line: 885
      ThreadPoolExecutor$Worker.run() line: 907
      Thread.run() line: 619

      Code:
      AOPExceptionHandler:
      private void sendEmail(String errors)

      { template = camelContext.createProducerTemplate(); StringBuffer body = new StringBuffer("Hello Techops.\n"); body.append("Got an exception please handle.\n\nRegards Reportdev.\n\n"); body.append(errors); template.sendBodyAndHeaders(emailServerUri, body, emailProperties); }

      applicationContext.xml
      <bean id="logThrowsAdvice" class="com.contextweb.advice.LogEmailThrowsAdvice">
      <property name="camelContext" ref="camel" />
      <property name="sendMail" value="true" />
      <!-- username=reportdev&to=DPeterson@apache.com -->
      <property name="emailServerUri"
      value="smtp://mail.apache.corp" />
      <property name="emailProperties">
      <map>
      <entry key="From">
      <value>"ReportDev@apache.com"</value>
      </entry>
      <entry key="Subject">
      <value>"Exception in 3rd Party Reporting Email
      Processing"</value>
      </entry>
      <entry key="To">
      <value>"DPeterson@apache.com"</value>
      </entry>
      </map>
      </property>
      <property name="logFactory" ref="LogFactoryBean" />
      </bean>

      Workaround is to use URI for "To" and put the username after the ? in the URI. This will fool the mail relay server into routing the email bypassing it's loop detection logic:
      <!-- Define the ThrowsAdvice bean -->
      <bean id="logThrowsAdvice" class="com.contextweb.advice.LogEmailThrowsAdvice">
      <property name="camelContext" ref="camel" />
      <property name="sendMail" value="true" />
      <property name="emailServerUri"
      value="smtp://mail.contextweb.corp?username=reportdev&to=DPeterson@apache.com" />
      <property name="emailProperties">
      <map>
      <entry key="From">
      <value>"ReportDev@apache.com"</value>
      </entry>
      <entry key="Subject">
      <value>"Exception in 3rd Party Reporting Email
      Processing"</value>
      </entry>
      </map>
      </property>
      <property name="logFactory" ref="LogFactoryBean" />
      </bean>

      Attachments

        Activity

          People

            Unassigned Unassigned
            hockeydave David Peterson
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: