当前位置: 首页 > 知识库问答 >
问题:

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

丌官瀚
2023-03-14

一位同事告诉我,使用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。邮政AuthenticationFailedException:535-5.7.8不接受用户名和密码。在535 5.7.8了解更多信息https://support.google.com/mail/?p=BadCredentialsn6sm4681584wmn。48-gsmtp

共有2个答案

宋翔
2023-03-14

没有OAuth是不可能的。我尝试用google object 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();

响应返回以下url:https://developers.google.com/identity/protocols/AuthForInstalledApps

重要提示:自2012年4月20日以来,ClientLogin已被正式弃用,现在不再可用。对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

然后,使用应用程序生成的密码,在代码中输入此密码,而不是另一个密码:

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

慕弘伟
2023-03-14

实际上,它不适合gmail api。这是JMS的基本邮件服务器配置。这是我在Spring所做的;

配置文件

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>

使用JavaMailSenderJava代码:

@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

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

 类似资料:
  • 我正在尝试在Jenkins中配置电子邮件通知。但它显示了以下错误。。。在此处输入图像描述 我用管理员帐号试过了,然后用我自己的gmil帐号试过了 错误:: 发送电子邮件失败 javax.mail.身份验证失败异常: 535-5.7.8用户名和密码不接受。在535 5.7.8了解更多https://support.google.com/mail/?p=BadCredentialsx11sm87366

  • 下面是错误和超时异常。 输入代码: 调试SMTP:正在尝试连接到主机“SMTP.gmail.com”,端口587,isSSL true Exceptioninthread“main”java。lang.RuntimeException:com。太阳邮政util。MailConnectException:无法连接到主机,端口:smtp。gmail。com,587;超时-1。

  • 我已经在Flitter中构建了一个应用程序,并使用firebase电子邮件密码验证方法进行用户登录。我只是想知道我们是否可以在firebase中查看用户的密码。如果无法查看我们应用程序的用户密码,那么这可能是不公平的,因为我们是应用程序的所有者,我们自己也不知道我们应用程序用户的密码。例如,facebook应用程序所有者(扎克伯格)可能知道用户的密码,或者instagram应用程序所有者可能知道用

  • 我在ASP. Net Core中工作,并尝试从gmail使用smtp客户端发送电子邮件。有以下代码,但不起作用也看过以下帖子,但不起作用http://dotnetthoughts.net/how-to-send-emails-from-aspnet-core/ 它会跟踪错误 系统NotSupportedException:SMTP服务器不支持身份验证

  • 我在使用我的公司交换服务器通过Javamail发送电子邮件时遇到了一些问题。我们有一个应用程序通过gmail服务器发送电子邮件没有任何问题,但对于Google策略的一些更改,我们希望使用公司服务器来完成这项工作。我确信会话属性中的问题,但我无法找到使其工作的方法 这是显示日志的错误 javax.mail.MessagingException:无法连接到SMTP主机:mail.company.com

  • 当我尝试使用我的GMail帐户从我的PHP应用程序中使用SwiftMailer发送电子邮件时,出现以下错误。 这是我的SwiftMailer代码: 这是Apache错误日志和堆栈跟踪中的条目。 [Wed Aug18 22:06:10.284728 2015][: error][pid 9298][客户端10.0.0.1:64806]PHP致命错误:未捕获异常'Swift_TransportExce