복붙노트

[SPRING] Gmail 용 Spring JavaMailSenderImpl을 구성하는 방법

SPRING

Gmail 용 Spring JavaMailSenderImpl을 구성하는 방법

JavaMailSenderImpl 클래스를 사용하여 Gmail SMTP 서버에 연결하는 데 사용할 올바른 속성을 찾으려고합니다.

먼저 여기에있는 접근 방식을 시도했다고 말해 보겠습니다. 이것은 잘 동작했다. 그러나 정확한 인증 정보를 사용하여 해당 게시물 아래의 구성을 시도했을 때 javax.mail.AuthenticationFailedException이 수신되었습니다.

내 현재 구성은 다음과 같습니다.

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="XXX@gmail.com" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.port">587</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>

내 자격 증명이 정확한지 확인하는 경우에도 여전히이 javax.mail.AuthenticationFailedException이 발생합니다.

다음은 아래 답변을 기반으로 업데이트 된 코드입니다. 나는 여전히 같은 예외를 받고있다.

<bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
    <property name="username" value="XXX@gmail.com" />
    <property name="password" value="XXX" />
    <property name="javaMailProperties">
    <props>
        <prop key="mail.smtp.from">XXX@gmail.com</prop>
        <prop key="mail.smtp.user">XXX@gmail.com</prop>
        <prop key="mail.smtp.password">XXX</prop>
        <prop key="mail.smtp.host">smtp.gmail.com</prop>
        <prop key="mail.smtp.port">587</prop>
        <prop key="mail.smtp.auth">true</prop>
        <prop key="mail.smtp.starttls.enable">true</prop>
    </props>
    </property>
</bean>

해결법

  1. ==============================

    1.이것은 나를 위해 일했다 :

    이것은 나를 위해 일했다 :

            <property name="host"><value>smtp.gmail.com</value></property>
            <property name="port"><value>587</value></property>
            <property name="protocol"><value>smtp</value></property>
            <property name="username"><value>${mail.username}</value></property>
            <property name="password"><value>${mail.password}</value></property>
            <property name="javaMailProperties">
                <props>
                    <prop key="mail.smtp.auth">true</prop>
                    <prop key="mail.smtp.starttls.enable">true</prop>
                    <prop key="mail.smtp.quitwait">false</prop>
                </props>
            </property>
    

    나를위한 진정한 속임수는 "프로토콜"값이 "smtp"가 아니라는 "smtp"여야한다는 것이 밝혀졌습니다.

  2. ==============================

    2.나는 한 시간 동안 javamailsender를 사용하여 Gmail에서 이메일을 보낼 수있는 올바른 설정을 찾기 위해 고생하고 마침내 해냈습니다. javamailsender와 함께 Gmail을 통해 전송할 수있는 포괄적 인 예제를 찾을 수 없기 때문에이 게시물을 올리므로 같은 일을하고 싶은 사람에게 도움이 될 것입니다.

    나는 한 시간 동안 javamailsender를 사용하여 Gmail에서 이메일을 보낼 수있는 올바른 설정을 찾기 위해 고생하고 마침내 해냈습니다. javamailsender와 함께 Gmail을 통해 전송할 수있는 포괄적 인 예제를 찾을 수 없기 때문에이 게시물을 올리므로 같은 일을하고 싶은 사람에게 도움이 될 것입니다.

    1 단계:

    mail.properties에 다음 설정을 추가하십시오.

    mail.protocol=smtp
    mail.host=smtp.gmail.com
    mail.port=465
    mail.smtp.socketFactory.port=465
    mail.smtp.auth=true
    mail.smtp.starttls.enable=true
    mail.smtp.debug=true
    mail.smtp.starttls.required=true
    mail.smtp.socketFactory.fallback=false
    mail.from=XXX@gmail.com
    mail.username=XXX@gmail.com
    mail.password=my_password
    

    그런 다음 mailConfiguration 클래스에서 @Value를 다음과 같이 설정합니다.

    @Configuration
    @PropertySource("classpath:mail.properties")
    public class MailConfiguration {
    
        @Value("${mail.protocol}")
        private String protocol;
        @Value("${mail.host}")
        private String host;
        @Value("${mail.port}")
        private int port;
        @Value("${mail.smtp.socketFactory.port}")
        private int socketPort;
        @Value("${mail.smtp.auth}")
        private boolean auth;
        @Value("${mail.smtp.starttls.enable}")
        private boolean starttls;
        @Value("${mail.smtp.starttls.required}")
        private boolean startlls_required;
        @Value("${mail.smtp.debug}")
        private boolean debug;
        @Value("${mail.smtp.socketFactory.fallback}")
        private boolean fallback;
        @Value("${mail.from}")
        private String from;
        @Value("${mail.username}")
        private String username;
        @Value("${mail.password}")
        private String password;
    
        @Bean
        public JavaMailSender javaMailSender() {
            JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    
            Properties mailProperties = new Properties();
            mailProperties.put("mail.smtp.auth", auth);
            mailProperties.put("mail.smtp.starttls.enable", starttls);
            mailProperties.put("mail.smtp.starttls.required", startlls_required);
            mailProperties.put("mail.smtp.socketFactory.port", socketPort);
            mailProperties.put("mail.smtp.debug", debug);
            mailProperties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            mailProperties.put("mail.smtp.socketFactory.fallback", fallback);
    
            mailSender.setJavaMailProperties(mailProperties);
            mailSender.setHost(host);
            mailSender.setPort(port);
            mailSender.setProtocol(protocol);
            mailSender.setUsername(username);
            mailSender.setPassword(password);
            return mailSender;
        }
    }
    

    내 Spring 서버는 SSL을 지원하므로 포트 465를 사용하고 있습니다. SSL의 경우 포트 465를 사용하십시오. 487을 사용하는 경우 TLS를 사용해야합니다.

    2 단계:

    이 링크를 따라 덜 안전한 앱에 대한 액세스를 사용하도록 선택합니다.

    https://www.google.com/settings/security/lesssecureapps

    3 단계 :

    AVAST를 PC에 가지고 있다면 AVAST를 끄십시오. AVAST Mail Shield는 전자 메일을 보내는 것과 충돌합니다. 이 기능을 끄지 않으면 다음 오류가 발생합니다.

  3. ==============================

    3.TLS 또는 SSL에서 Gmail을 사용하려면 다음 단계를 따르세요.

    TLS 또는 SSL에서 Gmail을 사용하려면 다음 단계를 따르세요.

    둘 다 mandatory paramater가 javax.net.ssl.SSLSocketFactory, mail.smtp.socketFactory.fallback이며 mail.smtp.starttls.enable을 false로 만듭니다.

    <beans>
        <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
            <property name="host"><value>smtp.gmail.com</value></property>
            <property name="port"><value>465</value></property>
            <property name="protocol"><value>smtp</value></property>
            <property name="username"><value>XXXXX@gmail.com</value></property>
            <property name="password"><value>XXXX</value></property>
            <property name="javaMailProperties">
                <props>
                    <prop key="mail.smtp.auth">true</prop>
                    <prop key="mail.smtp.starttls.enable">false</prop>
                    <prop key="mail.smtp.quitwait">false</prop>
                    <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
                    <prop key="mail.smtp.socketFactory.fallback">false</prop>
                    <prop key="mail.debug">true</prop>
                </props>
            </property>
        </bean>
        <bean id="mailMail" class="com.embitel.service.email.EmailService">
            <property name="mailSender" ref="mailSender" />
            <property name="simpleMailMessage" ref="customeMailMessage" />
        </bean>
        <bean id="customeMailMessage" class="org.springframework.mail.SimpleMailMessage">
            <property name="from" value="XXXX@gmail.com" />
            <property name="to" value="yyyyy@gmail.com" />
            <property name="subject" value="Testing Subject Line for email senind.." />
            <property name="text">
                <value>
            <![CDATA[
                Dear %s,
                Mail Content : %s
            ]]>
                </value>
            </property>
        </bean>
    </beans>
    

    매력처럼 일했다! !!

  4. ==============================

    4.언젠가 / 처음으로 Google은 타사 응용 프로그램이나 코드를 사용하여 계정에 로그인하지 못하게합니다. 브라우저에서 계정에 로그인하면 메시지가 나타납니다. "Google에서 의심스러운 계정 로그인 시도 방지"아래 스크린 샷을 참조하십시오.

    언젠가 / 처음으로 Google은 타사 응용 프로그램이나 코드를 사용하여 계정에 로그인하지 못하게합니다. 브라우저에서 계정에 로그인하면 메시지가 나타납니다. "Google에서 의심스러운 계정 로그인 시도 방지"아래 스크린 샷을 참조하십시오.

    "그랬습니까?"를 클릭하고 로그인을 허용하십시오.

  5. ==============================

    5.GMail에 필요한 유일한 속성은 다음과 같습니다.

    GMail에 필요한 유일한 속성은 다음과 같습니다.

    <prop key="mail.smtp.starttls.enable">true</prop>
    
  6. ==============================

    6.아래의 설정 (yaml 형식)은

    아래의 설정 (yaml 형식)은

    spring.mail:
      host: smtp.gmail.com
      port: 465
      protocol: smtp
      username: xyz@gmail.com
      password: abc
      test-connection: true
      properties:
        "mail.smtp.auth": true
        "mail.smtp.starttls.enable": true
        "mail.smtp.starttls.required": true
        "mail.smtp.socketFactory.class": javax.net.ssl.SSLSocketFactory
        "mail.debug": true
    
  7. ==============================

    7.나를 위해 일한 javaConfig는 다음과 같습니다.

    나를 위해 일한 javaConfig는 다음과 같습니다.

        public JavaMailSender getJavaMailSender()
        {
            JavaMailSenderImpl sender = new JavaMailSenderImpl();
            sender.setProtocol("smtp");
            sender.setHost("smtp.gmail.com");
            sender.setPort(587);
            sender.setUsername("username");
            sender.setPassword("password");
    
            Properties mailProps = new Properties();
            mailProps.put("mail.smtps.auth", "true");
            mailProps.put("mail.smtp.starttls.enable", "true");
            mailProps.put("mail.smtp.debug", "true");
    
            sender.setJavaMailProperties(mailProps);
    
            return sender;
        }
    

    TLS에 포트 587을 사용해야한다고 생각합니다.

  8. ==============================

    8.이것은 나를 위해 일했다 :

    이것은 나를 위해 일했다 :

    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="465" />
        <property name="protocol" value="smtps" />
        <property name="username" value="my_email@domain.tld" />
        <property name="password" value="my_password" />
        <property name="javaMailProperties">
        <props>
            <prop key="mail.smtps.auth">true</prop>
        </props>
        </property>
    </bean>
    

    자세한 내용은 Google 지원팀을 참조하십시오. http://support.google.com/mail/bin/answer.py?hl=ko&answer=78799

  9. ==============================

    9.이것은 크게 다른 것 같지는 않지만 아마도 시도해보십시오.

    이것은 크게 다른 것 같지는 않지만 아마도 시도해보십시오.

    <bean id="mailSender" class ="org.springframework.mail.javamail.JavaMailSenderImpl" >
        <property name="username" value="XXX@gmail.com" />
        <property name="password" value="XXX" />
        <property name="javaMailProperties">
        <props>
            <prop key="mail.smtp.user" value="XXX@gmail.com" />
            <prop key="mail.smtp.password" value="XXX" />
            <prop key="mail.smtp.host">smtp.gmail.com</prop>
            <prop key="mail.smtp.port">587</prop>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
        </props>
        </property>
    </bean>
    
  10. ==============================

    10."출발지"주소는 XXX@gmail.com 으로 지정하거나 메시지를 작성할 때 지정해야합니다.

    "출발지"주소는 XXX@gmail.com 으로 지정하거나 메시지를 작성할 때 지정해야합니다.

  11. ==============================

    11.나는 당신의 질문을 해결했습니다.

    나는 당신의 질문을 해결했습니다.

    봄철 비동기 이메일 서비스 구현 방법

    참고로, 이것은 스프링 3에서 작동하므로 스프링 2에서는 확실하지 않습니다.

  12. ==============================

    12.나는 또한이 인증 예외에 직면했다. 이것은 gmail 보안 때문이다. 다음 URL을여십시오.

    나는 또한이 인증 예외에 직면했다. 이것은 gmail 보안 때문이다. 다음 URL을여십시오.

    https://www.google.com/settings/security/lesssecureapps

    적은 보안 기능을 가능하게합니다.

  13. from https://stackoverflow.com/questions/2016190/how-to-configure-spring-javamailsenderimpl-for-gmail by cc-by-sa and MIT license