2016-01-14 2 views
1

Конфигурация почтового сервиса в standalone-full-ha.xml.javax.mail.AuthenticationFailedException: 535-5.7.8 Имя пользователя и пароль не принимается

<subsystem xmlns="urn:jboss:domain:mail:2.0"> 
    <mail-session name="default" jndi-name="java:jboss/mail/Default" from="[email protected]"> 
     <smtp-server outbound-socket-binding-ref="mail-smtp" ssl="true" username="User" password="password"/> 
    </mail-session> 
</subsystem> 

Почта Session в свою очередь, ссылается на хост SMTP, связанный на локальном хосте в порту 465.

<outbound-socket-binding name="mail-smtp"> 
    <remote-destination host="smtp.gmail.com" port="465"/> 
</outbound-socket-binding> 

Фактический пароль, используемый в конфигурации является пароль приложения генерируется во время «2-Step проверки» at https://security.google.com/settings/security/apppasswords

После того, как эта конфигурация была выполнена, попытка отправить электронное письмо с использованием следующего кода вызывает исключение.

@Resource(mappedName = "java:jboss/mail/Default") 
private Session mailSession; 

public void init() throws AddressException, MessagingException { 
    MimeMessage m = new MimeMessage(mailSession); 
    Address from = new InternetAddress("[email protected]"); 
    Address[] to = new InternetAddress[]{new InternetAddress("[email protected]")}; 

    m.setFrom(from); 
    m.setRecipients(Message.RecipientType.TO, to); 
    m.setSubject("Message Subject"); 
    m.setSentDate(new Date()); 
    m.setContent("Mail sent from app", "text/html"); 
    Transport.send(m); 
} 

Следующее исключение выбрано.

07:48:36,906 WARNING [javax.enterprise.resource.webcontainer.jsf.lifecycle] (default task-9) #{countryManagedBean.init}: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at 
535 5.7.8 https://support.google.com/mail/answer/14257 t70sm5413631pfi.8 - gsmtp 
: javax.faces.FacesException: #{countryManagedBean.init}: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at 
535 5.7.8 https://support.google.com/mail/answer/14257 t70sm5413631pfi.8 - gsmtp 

    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118) 
    at javax.faces.component.UIViewAction.broadcast(UIViewAction.java:562) 
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658) 
    at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) 
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:78) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:151) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at org.omnifaces.facesviews.FacesViewsForwardingFilter.filterExtensionLess(FacesViewsForwardingFilter.java:128) 
    at org.omnifaces.facesviews.FacesViewsForwardingFilter.doFilter(FacesViewsForwardingFilter.java:89) 
    at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at filter.NoCacheFilter.doFilter(NoCacheFilter.java:33) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at org.omnifaces.filter.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:122) 
    at org.omnifaces.filter.HttpFilter.doFilter(HttpFilter.java:108) 
    at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) 
    at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) 
    at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) 
    at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) 
    at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
    at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) 
    at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) 
    at io.undertow.server.handlers.DisableCacheHandler.handleRequest(DisableCacheHandler.java:33) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:51) 
    at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) 
    at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) 
    at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:56) 
    at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) 
    at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:72) 
    at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50) 
    at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) 
    at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:282) 
    at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:261) 
    at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:80) 
    at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:172) 
    at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199) 
    at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:774) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: javax.faces.el.EvaluationException: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at 
535 5.7.8 https://support.google.com/mail/answer/14257 t70sm5413631pfi.8 - gsmtp 

    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:101) 
    at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
    ... 57 more 
Caused by: javax.mail.AuthenticationFailedException: 535-5.7.8 Username and Password not accepted. Learn more at 
535 5.7.8 https://support.google.com/mail/answer/14257 t70sm5413631pfi.8 - gsmtp 

    at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:892) 
    at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:814) 
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:728) 
    at javax.mail.Service.connect(Service.java:386) 
    at javax.mail.Service.connect(Service.java:245) 
    at javax.mail.Service.connect(Service.java:194) 
    at javax.mail.Transport.send0(Transport.java:253) 
    at javax.mail.Transport.send(Transport.java:124) 
    at admin.bean.CountryManagedBean.init(CountryManagedBean.java:81) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.sun.el.parser.AstValue.invoke(AstValue.java:292) 
    at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304) 
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) 
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) 
    at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40) 
    at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50) 
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
    at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) 
    ... 58 more 

Использование WildFly 9.0.2 окончательный (приложение с помощью самоподписанного сертификата SSL не должно быть проблемой здесь).

+1

Gmail не верит вы снабжали правильное имя пользователя или пароль. Вы перешли по ссылке в сообщении об ошибке? Вы пробовали все, что предлагает Google? Что случилось? –

+0

Я выполнил следующие шаги, начиная с 'https: // accounts.google.com/SmsAuthConfig' всех шагов для генерации пароля. Он показывает, что «двухэтапная аутентификация: ON» на странице «https: // accounts.google.com/b/0/SmsAuthSettings # devices». Скопируйте и вставьте сгенерированный пароль в конфигурационный файл сервера 'standalone-full-ha.xml'. Там чего-то не хватает? – Tiny

+0

Итак, вы ** не ** следили за ссылкой в ​​сообщении об ошибке? –

ответ

1

Ошибка конфигурации, сделанная с неправильным допущением. Атрибут XML username ожидает фактический адрес электронной почты, в котором было указано имя экрана соответствующей учетной записи отправителя, исключение. Он отлично работает после того, как он был исправлен следующим образом.

<mail-session name="default" jndi-name="java:jboss/mail/Default" from="[email protected]"> 
    <smtp-server outbound-socket-binding-ref="mail-smtp" ssl="true" username="[email protected]" password="password"/> 
</mail-session> 

Фактический пароль, которые будут использоваться в конфигурации пароль приложения генерируется во время «2-Step проверки» в https://security.google.com/settings/security/apppasswords, как уже говорилось в документе вопроса.

Почта сессии javax.mail.Session затем можно вводить в любой Java EE артефакта, как сервлеты, Servlet фильтры, управляемые компоненты, EJBs, Message Driven Beans (MDB) и т.д., используя javax.annotation.Resource аннотацию.

Одна вещь, которая не происходит по неизвестным причинам, - это имя (метка) отправителя, указанное в атрибуте XML from. Он всегда отправляет адрес отправителя в качестве имени отправителя, что является неожиданным. Даже делая,

Address from = new InternetAddress("[email protected]"); 
mimeMessage.setFrom(from); 

не помогает. Я следил за некоторыми шаблонами, как было предложено в this answer, но это тоже не помогло. Однако он работает в среде Java SE. Это, тем не менее, другое дело, чем текущий вопрос. Возможно, позже я задам отдельный вопрос.


Дополнительно:

Я предпочитаю JMS очереди, чтобы отправить почту асинхронно в качестве фонового процесса, так как отправка почты может быть значительно отложено по многим причинам. Фактическое сообщение вместе с адресом электронной почты получателя отправляется через очередь JMS, и фактическая почта доставляется на целевой почтовый сервер из принимающего терминала соответствующей очереди, как показано ниже.

@MessageDriven(activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), 
    @ActivationConfigProperty(propertyName = "useJNDI", propertyValue = "true"), 
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:jboss/exported/jms/emailQueue"), 
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge")}) 
@RunAs("ROLE_ADMIN") 
public class MailBean implements MessageListener { 

    @Resource(lookup = "java:jboss/mail/Default") 
    private Session mailSession; // javax.jms.Session 

    @Override 
    @PermitAll 
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) 
    public void onMessage(Message message) { 

     try { 
      if (message instanceof ObjectMessage) { 
       ObjectMessage objectMessage = (ObjectMessage) message; 

       EmailUtil emailUtil = (EmailUtil) objectMessage.getObject(); 
       String receiver = emailUtil.getReceiver(); 
       String textMessage = emailUtil.getMessage(); 

       if (StringUtils.isNotBlank(receiver) && StringUtils.isNotBlank(textMessage)) { 
        MimeMessage mimeMessage = new MimeMessage(mailSession); 
        Address[] to = new InternetAddress[]{new InternetAddress(receiver)}; 

        mimeMessage.setRecipients(javax.mail.Message.RecipientType.TO, to); 
        mimeMessage.setSubject(emailUtil.getSubject(), "UTF-8"); 
        mimeMessage.setSentDate(new Date()); 
        mimeMessage.setText(textMessage, "UTF-8", "html"); 
        Transport.send(mimeMessage); 
       } else { 
        System.out.println("No message found."); 
       } 
      } else { 
       System.out.println("Message is of wrong type : " + message.getClass().getName()); 
      } 
     } catch (JMSException | MessagingException e) { 
      Logger.getLogger(MailBean.class.getName()).log(Level.SEVERE, null, e); 
     } 
    } 
} 

EmailUtil это утилита Java-класс, проведение необходимых свойств и реализацию интерфейса java.io.Serializable (который является обязательным для отправки сериализуемых объектов Java).

public final class EmailUtil implements Serializable { 

    private String message; 
    private String subject; 
    private String receiver; 
    private static final long serialVersionUID = 1L; 

    // Constructor(s) + getters + setters + hashCode() + equals() + toString(). 
} 

Для того, чтобы впрыснуть Queue, я использую это приложение область действия КДИ управляемый компонент для лучшего повторного на лицевой стороне.

@ApplicationScoped 
public class EmailQueueBean { 

    @Resource(lookup = "java:jboss/exported/jms/emailQueue") 
    private Queue queue; 
    @Resource(lookup = "java:jboss/exported/jms/emailFactory") 
    private ConnectionFactory connectionFactory; 

    public EmailQueueBean() {} 

    public void send(EmailUtil emailUtil) throws JMSException { 
     try (Connection connection = connectionFactory.createConnection("[email protected]", "admin_password"); 
       javax.jms.Session session = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE); 
       MessageProducer producer = session.createProducer(queue)) { 
      ObjectMessage objectMessage = session.createObjectMessage(emailUtil); 
      producer.send(objectMessage); 
     } 
    } 
} 

Вводит этот компонент в любом месте в любом Java EE артефакте, создание экземпляра EmailUtil вручную с помощью new и вызвать метод send() от имени нагнетаемой прокси экземпляра управляемого компонента, проходящего через экземпляр EmailUtil сконструирован.

аутентификации с использованием username/password, как указано с помощью метода createConnection() не требуется (ни @RunAs("ROLE_ADMIN") перед МДБ), в случае, если безопасность отключена/не используется в сервере hornetq в конфигурации.

Смотрите также:

Смежные вопросы