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

如何使用Gmail帐户从我的应用程序发送电子邮件?

楚嘉玉
2023-03-14

我正在尝试从应用程序发送电子邮件。

问题是Gmail不允许我进行身份验证,因为位置不寻常——当然,每个应用程序都安装在其他位置。

我的代码(使用Javax):

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.host", SMTP_SERVER);
    props.put("mail.smtp.port", PORT);

    Session session = Session.getInstance(props,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(USERNAME, new StringBuilder(PASSWORD).toString());
                }
            });

该代码在我的测试设备上运行良好,但在其他使用我的应用程序的设备上崩溃。

我得到的错误:javax.mail.身份验证失败异常:534-5.7.14请通过534-5.7.14您的网络浏览器登录,然后重试。534-5.7.14在534 5.7.14了解更多信息https://support.google.com/mail/answer/78754l9-v6sm11531942wf4-gsmtp

我尝试了所有找到的解决方案,但都没有成功。

“允许不太安全的应用程序”和“解锁显示catcha”的解决方案没有帮助

此外,我尝试打开2FA,并使用谷歌生成的AppPassword进行身份验证,但没有帮助。

有线索吗?

共有3个答案

西门伟
2023-03-14

对于任何感兴趣的人来说,没有解决方案有效。Gmail只是拒绝允许不同的位置登录,因为有额外的安全性(没有选项禁用)。我转而使用其他电子邮件提供商。相同的代码不再有问题。

萧鸿轩
2023-03-14

为此,您必须使用GMailSender

将此添加到您要发送邮件的活动中

我正在使用订阅,所以我把它放在AlertDialog

    @OnClick({R.id.btn_newsLetter_ok, R.id.btn_newsLetter_cancel})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btn_newsLetter_ok:

                email = etNewsLetterEmail.getText().toString().trim();
                if (email.isEmpty()|| !android.util.Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
                    Toast.makeText(context, "please enter a valid email address!!", Toast.LENGTH_SHORT).show();

                }
                else if(NetworkManager.isNetworkAvailable(context)){
                    try {
                        mailBody = mailBody.replace("@email",email);


                        sender = new GMailSender("yourEmail@gmail.com", "yourPassword");

                        StrictMode.setThreadPolicy(policy);
                        new MyAsyncClass().execute();



                    } catch (Exception ex) {

                        Toast.makeText(context, ex.toString(), Toast.LENGTH_SHORT).show();

                    }
                    dismiss();
                }
                break;
            case R.id.btn_newsLetter_cancel:
                dismiss();
                break;
        }
    }

    public class MyAsyncClass extends AsyncTask<Void, Void, Void> {



        ProgressDialog pDialog;



        @Override

        protected void onPreExecute() {

            super.onPreExecute();



            pDialog = new ProgressDialog(context);

            pDialog.setMessage("Please wait...");

            pDialog.show();



        }



        @Override

        protected Void doInBackground(Void... mApi) {

            try {

                // Add subject, Body, your mail Id, and receiver mail Id.


                sender.sendMail("hi kevin",  mailBody, "from@gmail.com", "to@gmail.com");

            }



            catch (Exception ex) {



            }

            return null;

        }



        @Override

        protected void onPostExecute(Void result) {

            super.onPostExecute(result);

            pDialog.cancel();

            Toast.makeText(context, "Email send", Toast.LENGTH_SHORT).show();
        }

    }

创建一个名为GMailSender的java文件并粘贴此文件

public class GMailSender extends javax.mail.Authenticator {

private String mailhost = "smtp.gmail.com";

private String user;

private String password;

private Session session;



static {

    Security.addProvider(new JSSEProvider());

}



    public GMailSender(final String user, final String password) {

        this.user = user;

        this.password = password;



        Properties props = new Properties();

        props.setProperty("mail.transport.protocol", "smtp");

        props.setProperty("mail.host", mailhost);

        props.put("mail.smtp.auth", "true");

        props.put("mail.smtp.port", "465");

        props.put("mail.smtp.socketFactory.port", "465");

        props.put("mail.smtp.socketFactory.class",

                "javax.net.ssl.SSLSocketFactory");

        props.put("mail.smtp.socketFactory.fallback", "false");

        props.put("mail.smtp.starttls.enable", "true");



        props.setProperty("mail.smtp.quitwait", "false");

        session = Session.getInstance(props, new javax.mail.Authenticator() {

            protected PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication(user, password);

            }

        });

        session = Session.getDefaultInstance(props, this);

    }



    protected PasswordAuthentication getPasswordAuthentication() {

        return new PasswordAuthentication(user, password);

    }



    public synchronized void sendMail(String subject, String body,

                                      String sender, String recipients) throws Exception {

        MimeMessage message = new MimeMessage(session);

        DataHandler handler = new DataHandler(new ByteArrayDataSource(

                body.getBytes(), "text/plain"));

        message.setSender(new InternetAddress(sender));

        message.setSubject(subject);

        message.setDataHandler(handler);



        if (recipients.indexOf(',') > 0)

            message.setRecipients(Message.RecipientType.TO,

                    InternetAddress.parse(recipients));

        else

            message.setRecipient(Message.RecipientType.TO, new InternetAddress(

                    recipients));

        Transport.send(message);

    }



    public class ByteArrayDataSource implements DataSource {

        private byte[] data;

        private String type;



        public ByteArrayDataSource(byte[] data, String type) {

            super();

            this.data = data;

            this.type = type;

        }



        public ByteArrayDataSource(byte[] data) {

            super();

            this.data = data;

        }



        public void setType(String type) {

            this.type = type;

        }



        public String getContentType() {

            if (type == null)

                return "application/octet-stream";

            else

                return type;

        }



        public InputStream getInputStream() throws IOException {

            return new ByteArrayInputStream(data);

        }



        public String getName() {

            return "ByteArrayDataSource";

        }



        public OutputStream getOutputStream() throws IOException {

            throw new IOException("Not Supported");

        }

    }

}  

创建另一个名为JESSEProvider的类并粘贴此

    public class JSSEProvider extends Provider {

    public JSSEProvider() {

        super("HarmonyJSSE", 1.0, "Harmony JSSE Provider");

        AccessController

                .doPrivileged(new java.security.PrivilegedAction<Void>() {

                    public Void run() {

                        put("SSLContext.TLS","org.apache.harmony.xnet.provider.jsse.SSLContextImpl");

                        put("Alg.Alias.SSLContext.TLSv1", "TLS");

                        put("KeyManagerFactory.X509","org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl");

                        put("TrustManagerFactory.X509","org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl");

                        return null;

                    }

                });

    }

}  

如果我忘记了什么,告诉我。

鲁涵映
2023-03-14

在代码中使用Intents而不是使用Properties

  Intent emailIntent = new Intent(Intent.ACTION_SEND);      
  emailIntent.setData(Uri.parse("mailto:"));
  emailIntent.setType("text/plain");
  emailIntent.putExtra(Intent.EXTRA_EMAIL, TO);
  emailIntent.putExtra(Intent.EXTRA_CC, CC);
  emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Your subject");
  emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message goes here");

一年前我用过这个代码

 类似资料:
  • 我有一个web应用程序,目前可以从gsuite域中的“无回复”式电子邮件地址发送自动密码重置电子邮件。目前,它只需通过SMTP(使用TLS)使用用户名和密码即可工作,然而,为了实现这一点,GSuite管理员(不是我)必须启用LSA。 我相信大多数人都知道,谷歌将在明年逐步淘汰它,所以展望未来,我将不得不使用OAuth2和Gmail应用编程接口(我想)。我对这一点还很陌生,所以原谅我的无知,但是虽然

  • 我研究了以下问题和答案:spring boot-无法连接到SMTP主机:SMTP.gmail.com,端口:25,响应:421 我想做同样的事情--用Gmail服务器从spring boot应用程序发送电子邮件。 我的配置是: 这是从另一个问题复制的,只有用户名和密码已经改变了我的需要。我的scienario唯一不同的是,电子邮件地址的域不是gmail.com。 我的电子邮件客户端类是: 我的例外

  • 我正在用Android开发一个应用程序。我不知道如何从应用程序发送电子邮件?

  • 我成功通过passportjs验证,但NodeEmailer只发送一封电子邮件,这是控制台中使用的一封电子邮件。云谷歌。 当我尝试其他gmail帐户时,我得到这个错误: 错误:无效登录:535-5.7.8不接受用户名和密码。在535 5.7.8了解更多信息https://support.google.com/mail/?p=BadCredentialsu6sm13346885wrp。0-SMTPC

  • 我正在开发一个WordPress插件,其中我使用PHP邮件功能发送电子邮件,但是邮件功能有一个问题。它向我的非Gmail帐户发送电子邮件,但它不会向我的Gmail帐户发送电子邮件。我正在使用以下代码: 是我的代码有问题,还是邮件功能有问题?如果有其他方法可以发送电子邮件,请给我链接。

  • 使用NodeEmailer,如何使用别名gmail帐户发送电子邮件?还是组google suite服务器帐户? 比如说: 我的真实帐户: 我将使用nodemailer通过我的别名帐户或组帐户发送消息。 我的别名帐户:< code > myaliascount @ domain . com 我的群帐户:< code > my group account @ domain . com 这可能吗?