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

无法解决使用Gmail Api和服务帐户发送电子邮件的错误请求

慕容雅珺
2023-03-14

在这个论坛上,我对bad request 400进行了多次回复,在通过服务帐户和Gmail API发送电子邮件时,我已经没有办法解决这个问题了

步骤:

>

  • 遵循Gmail api指南获取代码

    设置GCP和谷歌管理员(随后启动medium.com/lyfepedia/sending-emails-with-gmail-api-and-python-49474e32c81f)

    明确地在谷歌云控制台中为该项目设置服务帐户,

    授权进行全域访问,

    添加到项目的JSON凭据文件中。

    在管理控制台中使用服务帐户ID的授权API客户端,提供当前“电子邮件”中可能的各种范围组合(读/写/发送)https://mail.google.com/, https://www.googleapis.com/auth/gmail.send"

    GCP API仪表板显示正在发出请求,但错误率为100%。

    应用程序中返回的错误:

    com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad 
    Request
    {
      "code" : 400,
      "errors" : [ {
        "domain" : "global",
        "message" : "Bad Request",
        "reason" : "failedPrecondition"
      } ],
      "message" : "Bad Request"
    }
    

    还有我的密码

    import android.content.Context;
    import android.os.AsyncTask;
    import android.widget.Toast;
    
    import com.google.api.client.extensions.android.http.AndroidHttp;
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
    import com.google.api.client.http.HttpTransport;
    import com.google.api.client.json.JsonFactory;
    import com.google.api.client.json.jackson2.JacksonFactory;
    import com.google.api.client.util.Base64;
    import com.google.api.services.gmail.Gmail;
    import com.google.api.services.gmail.GmailScopes;
    import com.google.api.services.gmail.model.Message;
    
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Properties;
    
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    public class mod_gmail_send_2 extends AsyncTask<Void, Void, String> {
    
        private Gmail mGmailService = null;
        private GoogleCredential mCredential;
        private Context mContext;
    
        private String userID = "me";
        private String emailFrom = "xxxx@gmail.com"; //non specific  account?!?
        private String emailTo = "xxxxx@gmail.com";
        private String emailSubject = "This is the subject";
        private String emailBody = "This is the body text";
        private List<String> scopes = Arrays.asList(GmailScopes.GMAIL_SEND);
    
        public mod_gmail_send_2(Context myContext) {
            mContext = myContext;
        }
    
        @Override
        protected String doInBackground(Void... params) {
    
            try {
                mCredential = GoogleCredential
                        .fromStream(mContext.getResources().openRawResource(R.raw.myjsoncredentials))
                        .createScoped(scopes);
                HttpTransport transport = AndroidHttp.newCompatibleTransport();
                JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
                mGmailService = new Gmail.Builder(transport, jsonFactory, mCredential).build();
                MimeMessage mMimeMessage = createEmail(emailTo, emailFrom, emailSubject, emailBody);
                sendMessage(mGmailService, userID, mMimeMessage);
    
            }catch(Throwable e){
                return e.getLocalizedMessage();
            }
            return "Success";
        }
    
        public static Message sendMessage(Gmail service,String userId,MimeMessage emailContent) throws MessagingException, IOException {
            Message message = createMessageWithEmail(emailContent);
            message = service.users().messages().send(userId, message).execute();
            System.out.println("Message id: " + message.getId());
            System.out.println(message.toPrettyString());
            return message;
        }
    
        public static MimeMessage createEmail(String to,String from,String subject,String bodyText) throws MessagingException {
            Properties props = new Properties();
            Session session = Session.getDefaultInstance(props, null);
            MimeMessage email = new MimeMessage(session);
            email.setFrom(new InternetAddress(from));
            email.addRecipient(javax.mail.Message.RecipientType.TO,new InternetAddress(to));
            email.setSubject(subject);
            email.setText(bodyText);
            return email;
        }
    
        public static Message createMessageWithEmail(MimeMessage emailContent) throws MessagingException, IOException {
            ByteArrayOutputStream buffer = new ByteArrayOutputStream();
            emailContent.writeTo(buffer);
            byte[] bytes = buffer.toByteArray();
            String encodedEmail = Base64.encodeBase64URLSafeString(bytes);
            Message message = new Message();
            message.setRaw(encodedEmail);
            return message;
        }
    
        @Override
        protected void onPostExecute(String output) {
            Toast.makeText(mContext, output, Toast.LENGTH_LONG).show();
        }
    }
    

    任何想法都将不胜感激!!

  • 共有1个答案

    宦博超
    2023-03-14

    看来(我将被更正,或者我应该说希望被更正)您无法从服务帐户发送电子邮件。相反,您必须模拟在gsuite域中注册的帐户,并在使用创建google凭据时将其包括在内。createDelegate()。

     GoogleCredential
        .fromStream(service_account_json_credentials)
        .createDelegate(your_impersonated_account@your_domain)
        .createScoped(scopes)
    

    看见https://stackoverflow.com/a/54108538/9175763

    虽然您可以使用drive API将驱动器文件夹/文件共享到您的服务帐户以供访问,但您不能将私人Gmail委派给您的服务帐户。“错误:您指定的谷歌帐户地址无效。”

    然而,您可以使用g-Suite电子邮件别名作为现有g-Suite电子邮件的委托。只需在管理控制台中将别名添加到用户,然后像往常一样打开您的g-Suite电子邮件帐户,转到设置、帐户、以发送邮件的形式发送邮件并添加您的别名。然后您可以将委托设置为您的别名。

     类似资料:
    • 我知道这里已经有很多关于向hotmail发送电子邮件的问题了。我已经通读了它们,以及过去几周的许多在线帖子,但仍然无法解决这个问题。 我遇到的问题是,我无法向拥有hotmail电子邮件地址的客户发送电子邮件。我可以向雅虎发送电子邮件,也可以向gmail发送电子邮件(尽管这些邮件似乎进入了垃圾文件夹),但是当我向hotmail电子邮件地址发送电子邮件时,它们似乎永远不会到达。 我在PHP Symfo

    • 我正在尝试使用CodeIgniter的电子邮件库发送电子邮件。这是我写的代码。 错误:这是我得到的错误。 遇到以下SMTP错误:0php_network_getaddresses:getaddrinfo失败:名称或服务未知无法发送数据:AUTH LOGIN发送AUTH LOGIN命令失败。错误:无法发送数据:邮件从:从:遇到以下SMTP错误:无法发送数据:RCPT TO:到:遇到以下SMTP错误:

    • 我正在使用发送电子邮件,但得到的错误是 我正在做的是,我有一个类作为。 上面的类有一个静态方法,-它将SMTP服务器设置和消息详细信息作为参数。 我把SMTP服务器设置放在我的web.xml文件中,但不知道出了什么问题 我的类 } 这是我的网站。xml文件 这是我的servlet类 我在做正确的事情,但不知道问题是什么 如果我在gmail中启用较少的安全应用程序设置,那么它的工作正常,我不认为这是

    • responseerror:禁止在d:\node-projects\ecom\node_modules@sendgrid\client\src\类\client.js:146:29在processTicksAndRejections(internal/process/task_queues.js:93:5){ 代码:403,response:{headers:{server:'nginx',dat

    • 问题内容: 我尝试使用 Spring javamail 从 Heroku 发送电子邮件,但出现错误。 __ 我的代码: 豆子: 和控制器: 在localhost:8080和localhost:5000上,测试成功完成,但是在heroku服务器上,我有例外: 验证失败;嵌套的异常是javax.mail.AuthenticationFailedException:534-5.7.14请通过Web浏览器

    • 我试图使用Spring javamail从Heroku发送电子邮件,但出现了错误。 我的代码: 豆: 和控制器: 在localhost:8080和localhost:5000上,测试成功完成,但在heroku服务器上,我有一个异常: 身份验证失败;嵌套的异常是javax。邮政身份验证失败异常:534-5.7.14请通过web浏览器和534-5.7.14登录,然后重试。534-5.7.14在534