После многочисленных ответов на неправильный запрос 400 на этом форуме у меня закончились варианты решения проблемы при отправке писем через учетную запись службы и Gmail API & Oauth.Каждое решение, которое я пробовал, похоже, не изменяет ошибку, поэтому я предполагаю, что упустил что-то более высокое.
Шаги:
, следуя инструкциям API Gmail для кода
Настройте GCP и Google Admin (следуйте этому, чтобы запустить medium.com/lyfepedia/sending-emails-with-gmail-api-and-python-49474e32c81f )
специально .... настроить учетную запись службы в Google Cloud Console для проекта,
, авторизованный для широкого доступа к домену,
добавлено в файл учетных данных JSON для проекта.
авторизованные клиенты API с идентификатором служебной учетной записи в консоли администратора, при условии, что в настоящее время возможна любая комбинация областей "Электронная почта (чтение / запись / отправка) https://mail.google.com/, https://www.googleapis.com/auth/gmail.send"
Панель инструментов API GCP показывает, что запросы выполняются, но с ошибками 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();
}
}
Любые идеи будут оценены !!