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

时间:2018-11-01 11:06:03

标签: android authentication gmail javamail

我正在尝试通过应用发送电子邮件。

问题是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.AuthenticationFailedException:534-5.7.14请通过Web浏览器534-5.7.14登录,然后重试。 534-5.7.14进一步了解534 5.7.14 https://support.google.com/mail/answer/78754 l9-v6sm11531942wrf.4-gsmtp

我尝试了所有找到的解决方案,但无济于事。

“允许安全性较低的应用程序”和“解锁显示功能”的解决方案-没有帮助

我也尝试打开2FA并使用由Google生成的AppPassword进行身份验证-没有帮助。

有任何线索吗?

3 个答案:

答案 0 :(得分:0)

在代码中使用Intent代替使用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");

我一年前就在使用此代码

答案 1 :(得分:0)

为此您必须使用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;

                    }

                });

    }

}  

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

答案 2 :(得分:0)

对于任何感兴趣的人,没有解决方案。由于额外的安全性(不选择禁用此功能),Gmail只是拒绝允许其他位置登录。 我搬到使用其他电子邮件提供商。相同的代码不再有问题。