cannot send email using gmail account from android

2019-07-19 10:22发布

问题:

Error sending email:

returns 451 4.5.0 SMTP protocol violation, see RFC 2821 g5sm13340466pfg.0 - gsmtp.

After getting the oauth token, type and oauth expire from gmail.

here the following code used to test send email using oauth2.

private String GenerateOAuth2String(boolean base64_encode){
        String OAuthString = "";
        Log.e("SendTestActivity", "AuthToken: " + authToken);
        OAuthString = String.format("user=%s\1auth=Bearer %s\1\1", userName, authToken);
        Log.e("SendTestActivity", "non base 64: " + OAuthString);
        if (base64_encode)
            OAuthString = Base64.encodeToString(OAuthString.getBytes(), Base64.DEFAULT);
        Log.e("SendTestActivity", "base 64: " + OAuthString);
        return OAuthString;
    }

    private synchronized void sendMail(String subject, String body, String user, String recipients) {
        try {           
            Properties props = new Properties();
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.starttls.required", "true");
            props.put("mail.smtp.sasl.enable", "false");

            session = Session.getInstance(props);
            session.setDebug(true);

            final URLName unusedUrlName = null;
            SMTPTransport transport = new SMTPTransport(session, unusedUrlName);
            // If the password is non-null, SMTP tries to do AUTH LOGIN.
            final String emptyPassword = null;
            transport.connect("smtp.gmail.com", 587, user, emptyPassword);

            transport.issueCommand("AUTH XOAUTH2 " + GenerateOAuth2String(true),
                    235);

            MimeMessage message = new MimeMessage(session);

            // Set From: header field of the header.
             message.setFrom(new InternetAddress(user));

             // Set To: header field of the header.
             message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipients));

             // Set Subject: header field
             message.setSubject(subject);

             // Now set the actual message
             message.setText(body);

            if (recipients.indexOf(',') > 0)   
                message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));   
            else  
                message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));   

            Transport.send(message);

            Log.e("SendTestActivity", "email sent");

        } catch (Exception e) {
            Log.e("SendTestActivity", e.getMessage());
        }

    }

is there something wrong with the setup?

also does the \1 in user=%s\1auth=Bearer %s\1\1 a "string" or a "start of heading" character

回答1:

You're doing it the hard way. Let JavaMail do it for you.



回答2:

you have not mentioned the requirement of sending a mail if it is a form to be sent by mail then

Click here

or if you want to send directly using php then

 <?php
 $to = $_POST['to'];
 $from = $_POST['from'];
 $subject = $_POST['subject'];
 $message = "From: ".$name."\r\n";\
 $headers = "From:" . $from;
 mail($to,$subject,$message,$headers);
 ?> 


回答3:

Did you tried giving permission here:

https://www.google.com/settings/security/lesssecureapps

Some of the errors like that are because you don't have the complete properties, complements with this:

props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
props.put("mail.smtp.port", "587");