Можно ли отправлять электронные письма через API GMail, используя только имя пользователя и пароль? - PullRequest
8 голосов
/ 29 апреля 2019

Коллега сказал мне, что с помощью библиотеки Gmail API вы можете отправлять электронные письма из корпоративной учетной записи Gmail с именем пользователя и паролем.

До сих пор я не мог выяснить, как именно я могу создать экземпляр Gmail с именем пользователя и паролем (без маркера доступа, без секрета).

Можно ли вообще использовать GMail API для отправки электронных писем, используя только имя пользователя и пароль? Если да, где я могу найти пример?

Обновление 1: Когда я использую следующий код

@Test
fun sendMail() {
    val credentials = Properties()
    credentials.load(FileInputStream("src/test/resources/credentials.properties"))

    val username = credentials.getProperty("username")
    val password = credentials.getProperty("password")

    val prop = Properties()
    prop.put("mail.smtp.host", "smtp.gmail.com")
    prop.put("mail.smtp.port", "587")
    prop.put("mail.smtp.auth", "true")
    prop.put("mail.smtp.starttls.enable", "true") //TLS

    val session = Session.getInstance(prop,
            object : javax.mail.Authenticator() {
                override fun getPasswordAuthentication(): PasswordAuthentication {
                    return PasswordAuthentication(username, password)
                }
            })

    try {

        val message = MimeMessage(session)
        message.setFrom(InternetAddress("..."))
        message.setRecipients(
                Message.RecipientType.TO,
                InternetAddress.parse("...")
        )
        message.setSubject("Testing Gmail")
        message.setText("Hello!!")

        Transport.send(message)

        println("Done")

    } catch (e: MessagingException) {
        e.printStackTrace()
    }
}

Я получаю это исключение:

javax.mail.AuthenticationFailedException: 535-5.7.8 Имя пользователя и пароль не принимаются. Узнайте больше на 535 5,7,8 https://support.google.com/mail/?p=BadCredentials n6sm4681584wmn.48 - gsmtp

Ответы [ 2 ]

7 голосов
/ 02 мая 2019

На самом деле, это не происходит с Gmail API.Это базовая конфигурация почтового сервера для JMS.Вот что я сделал весной:

Файл конфигурации:

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=[GMAIL_USERNAME]
spring.mail.password=[GMAIL_PASSWORD]
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.protocol=smtp

Зависимость Maven:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

Java-код с использованием JavaMailSender:

@Component
public class EmailService
{
    @Autowired
    protected JavaMailSender emailSender;

    public void sendRegistrationMail(RegistrationForm form) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(form.getUserMail());
        message.setSubject("-- COOL SUBJECT --");
        message.setText("- COOL TEXT -");
        emailSender.send(message);
    }

}

Источник: https://www.baeldung.com/spring-email

Примечание : убедитесь, что если вы планируете, просто попробуйте это приложение, учетная запись электронной почты позволяет менее безопасным приложениям ( Меньше безопасного доступа к приложению ).Вот ссылка, которую вы можете изменить: https://myaccount.google.com/lesssecureapps

Редактировать: Я добавляю публичную версию базового проекта mailsender - https://github.com/ercinakcay/mailsender-public

6 голосов
/ 03 мая 2019

Не возможно без OAuth. Я попытался войти в систему с помощью объекта Google Api Gmail ClientLogin таким образом:

HttpTransport transport = new NetHttpTransport();

ClientLogin authenticator = new ClientLogin();
authenticator.transport = transport;
authenticator.authTokenType = "mail";
authenticator.username = "user";
authenticator.password = "password";
final ClientLogin.Response response = authenticator.authenticate();

и ответ возвращает этот URL: https://developers.google.com/identity/protocols/AuthForInstalledApps

Важно: ClientLogin официально объявлен устаревшим с 20 апреля 2012 года и больше не доступен. Запросы к ClientLogin завершатся с ошибкой HTTP 404. Мы рекомендуем вам перейти на OAuth 2.0 как можно скорее.


Затем, если вы хотите отправить письмо с java basic с gmail в качестве провайдера, вы можете поставить этот код:

Первая для всех библиотека:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

А потом вы ставите пример класса:

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class TestMail {

    public static void main(String[] args) {

        final String username = "username@gmail.com";
        final String password = "password";

        Properties prop = new Properties();
        prop.put("mail.smtp.host", "smtp.gmail.com");
        prop.put("mail.smtp.port", "587");
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.starttls.enable", "true"); //TLS

        Session session = Session.getInstance(prop,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {

            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("from@gmail.com"));
            message.setRecipients(
                    Message.RecipientType.TO,
                    InternetAddress.parse("contact1@gmail.com, contact2@yahoo.com")
            );
            message.setSubject("Testing Gmail");
            message.setText("Hello!!");

            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }

}

Если программа выдает:

Caused by: javax.mail.AuthenticationFailedException: 534-5.7.9 Application-specific password required. Learn more at
534 5.7.9  https://support.google.com/mail/?p=InvalidSecondFactor - gsmtp

    at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
    at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
    at javax.mail.Service.connect(Service.java:388)
    at javax.mail.Service.connect(Service.java:246)
    at javax.mail.Service.connect(Service.java:195)
    at javax.mail.Transport.send0(Transport.java:254)
    at javax.mail.Transport.send(Transport.java:124)
    at com.mkyong.calculator.SendEmail.main(SendEmail.java:41)

Это означает, что вам нужно создать пароль приложения: https://support.google.com/accounts/answer/185833?p=InvalidSecondFactor

enter image description here

И затем, сгенерированный приложением пароль, вы вводите этот пароль вместо другого пароля в коде:

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

public class TestMail {

    public static void main(String[] args) {

        final String username = "username@gmail.com";
        final String password = "puts your app password here"; // update here

        // same code...
    }

}

РЕДАКТИРОВАТЬ:

Проблема «Имя пользователя и пароль не приняты» , вы можете исправить это следующим образом:

https://support.google.com/mail/answer/7126229?visit_id=636925989304024248-4140438018&rd=1&hl=en#cantsignin

enter image description here

...