我正在尝试使用Gmail API通过我的Google帐户发送电子邮件。
我在这里查看了主要指南:Api Android Quickstart
并在此处使用了方法:Sending Email example
在授权Api并在我的活动中使用它时,一切似乎都很好。我可以成功从我的帐户中获取信息。
不幸的是,我在发送电子邮件时遇到错误。我需要帮助解决这个问题。
以下是我正在处理的代码:
public class SEND_EMAIL extends AsyncTask<MimeMessage, MimeMessage, MimeMessage>
{
@Override
protected MimeMessage doInBackground(MimeMessage... mime_messages) {
try {
mService.users().messages().send(PREF_ACCOUNT_NAME, createMessageWithEmail(createEmail(PREF_ACCOUNT_NAME, PREF_ACCOUNT_NAME, "Subject", "Hello Gmail.")));
} catch (IOException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
Log.i("AATS", "Trying to send email.");
return null;
}
}
示例中使用的方法:
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);
InternetAddress tAddress = new InternetAddress(to);
InternetAddress fAddress = new InternetAddress(from);
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 email)
throws MessagingException, IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
email.writeTo(baos);
String encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray());
Message message = new Message();
message.setRaw(encodedEmail);
return message;
}
库:
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;
import com.google.api.client.extensions.android.http.AndroidHttp;
import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.Base64;
import com.google.api.client.util.ExponentialBackOff;
import com.google.api.services.gmail.Gmail;
import com.google.api.services.gmail.GmailScopes;
import com.google.api.services.gmail.model.ListMessagesResponse;
import com.google.api.services.gmail.model.Message;
import android.accounts.AccountManager;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.TextUtils;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
函数调用:
private void refreshResults() {
if (credential.getSelectedAccountName() == null) {
chooseAccount();
} else {
if (isDeviceOnline()) {
new ApiAsyncTask(this).execute();
} else {
mStatusText.setText("No network connection available.");
}
}
SEND_ASNYCTASK_EMAIL();
}
public void SEND_ASNYCTASK_EMAIL ()
{
Log.i("AATS", "Sending email.");
new SEND_EMAIL().execute();
}
@Override
protected void onResume() {
super.onResume();
if (isGooglePlayServicesAvailable()) {
refreshResults();
} else {
mStatusText.setText("Google Play Services required: " +
"after installing, close and relaunch this app.");
}
}
--- [编辑1] ---
根据ND003的建议应用 gmail.compose 范围后,我收到了新的警告。
更新了跟踪:
07-02 15:28:36.252 20997-21201/com.adak.aats.send_email W/﹕ Unable to open '/system/framework/WfdCommon.jar': No such file or directory
07-02 15:28:36.252 20997-21201/com.adak.aats.send_email W/art﹕ Failed to open zip archive '/system/framework/WfdCommon.jar': I/O Error
--- [编辑2] --- 的 [工作]
我仍然收到相同的警告,但API按预期工作,并且可以使用我的Google帐户发送邮件。
Okey所以,我唯一要做的就是添加一行:
compile files('libs/mail.jar', 'libs/activation.jar', 'libs/additional.jar')
在Android Studio中的build.gradle(Module:app)文件中。这对我来说绝对不可理解,因为我也有:
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
}
默认情况下在我的build.gradle文件中。所以它应该已经编译了app / libs文件夹中的所有.jar文件。使用javax库时我没有收到任何错误。对我来说似乎有点奇怪,但仍然张贴,所以也许有人可以澄清发生了什么。
感谢。
-----------------------注-------------------- -----
Gmail API使用 javax.mail 和 javax.activation 库,在上引用发送电子邮件示例(无法共享)由于声誉低而链接。
这就是你需要在项目app / libs文件夹中导入这三个文件的原因: mail.jar , activation.jar , additional.jar < /强>
推荐回答: this