是否可以仅使用用户名和密码通过GMail API发送电子邮件?

DP_*_*DP_ 8 java email gmail gmail-api

一位同事告诉我,使用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()
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到这个例外:

javax.mail.AuthenticationFailedException:535-5.7.8不接受用户名和密码。要了解更多信息,请访问535 5.7.8 https://support.google.com/mail/?p=BadCredentials n6sm4681584wmn.48-gsmtp

Erç*_*çay 7

实际上,它与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
Run Code Online (Sandbox Code Playgroud)

Maven的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

使用JavaMailSender的Java代码:

@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);
    }

}
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.baeldung.com/spring-email

注意:请确保如果您正在计划,请尝试使用此应用程序,该电子邮件帐户允许安全性较低的应用程序(安全性较低的应用程序访问权限)。这是您可以更改的链接:https : //myaccount.google.com/lesssecureapps

编辑:我正在添加基本mailsender项目的公共版本-https: //github.com/ercinakcay/mailsender-public


Fra*_*cio 6

没有OAuth,是不可能的。我试图以ClientLogin这种方式使用google对象api gmail登录:

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();
Run Code Online (Sandbox Code Playgroud)

并且响应返回以下网址:https : //developers.google.com/identity/protocols/AuthForInstalledApps

重要提示:自2012年4月20日起,ClientLogin已正式弃用,现在不再可用。对ClientLogin的请求将失败,并显示HTTP 404响应。我们建议您尽快迁移到OAuth 2.0。


然后,如果要发送带有gmail作为提供者的java basic的邮件,则可以输入以下代码:

首先是库:

<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

然后放一个示例类:

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();
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

如果程序抛出:

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)
Run Code Online (Sandbox Code Playgroud)

这意味着您需要创建一个应用程序密码:https : //support.google.com/accounts/answer/185833?p=InvalidSecondFactor

在此处输入图片说明

然后,使用应用程序生成的密码,将该密码而不是其他密码放入代码中:

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...
    }

}
Run Code Online (Sandbox Code Playgroud)

编辑:

问题“不接受用户名和密码”,您可以通过以下方法解决问题:

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

在此处输入图片说明