Fail to send mail using JavaMail API(使用 JavaMail API 发送邮件失败)
问题描述
我有以下代码试图在后台发送电子邮件.我已经使用 textview 来查看异常.但是,虽然 textview 中没有显示任何内容,但我也无法收到邮件.所以我不确定邮件是否已成功发送.谁能帮帮我?
I have the following code which is attempting to send an email in background. I have made use of a textview to see the exception. However, although nothing is being shown in the textview, I also cannot receive the mail. So I am not sure whether the mail has been delivered successfully or not. Can anyone give help to me?
根据建议,我将程序修改如下:
Based on the suggestions, I have modified my program as following:
新的 Sender.java
new Sender.java
public class Sender extends Activity {
Button Send;
TextView text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sender);
Send = (Button) findViewById(R.id.mail);
text = (TextView) findViewById(R.id.textView1);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
Send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new SendMail().execute();
}
});
}
private class SendMail extends AsyncTask<String, Void, String>
{
ProgressDialog pd = null;
String error = null;
Integer result;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(Sender.this);
pd.setTitle("Uploading");
pd.setMessage("Uploading logs. Please wait");
pd.setCancelable(false);
pd.show();
}
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
MailSender sender = new MailSender("me@gmail.com", "password");
String[] toAddress = {"me@gmail.com"};
sender.setTo(toAddress);
sender.setFrom("me@gmail.com");
sender.setSubject("Test mail");
sender.setBody("This is the mail body");
try {
if(sender.send()) {
System.out.println("Message sent");
result = 1;
} else {
result = 2;
}
} catch (Exception e) {
error = e.getMessage();
Log.e("SendMail", e.getMessage(), e);
}
result = 3;
return null;
}
protected void onPostExecute() {
pd.dismiss();
if(error!=null) {
text.setText(error);
}
if(result==1) {
Toast.makeText(Sender.this,
"Email was sent successfully.", Toast.LENGTH_LONG)
.show();
} else if(result==2) {
Toast.makeText(Sender.this,
"Email was not sent.", Toast.LENGTH_LONG).show();
} else if(result==3) {
Toast.makeText(Sender.this,
"There was a problem sending the email.",
Toast.LENGTH_LONG).show();
}
}
}
}
新的 MailSender.java
new MailSender.java
public class MailSender extends Authenticator {
private String user;
private String password;
private String [] to;
private String from;
private String port;
private String sport;
private String host;
private String subject;
private String body;
private boolean auth;
private boolean debuggable;
private Multipart multi;
public MailSender(){
host = "smtp.gmail.com";
port = "465";
sport = "465";
user = "";
password = "";
from = "";
subject = "";
body = "";
debuggable = false;
auth = true;
multi = new MimeMultipart();
// There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
}
public MailSender(String user, String password){
this();
user = user;
password = password;
}
public boolean send() throws Exception {
Properties props = setProperties();
try{
Session session = Session.getInstance(props, this);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
InternetAddress[] addressTo = new InternetAddress[to.length];
for(int i=0; i<to.length; i++){
addressTo[i] = new InternetAddress(to[i]);
}
msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
msg.setSubject(subject);
msg.setSentDate(new Date());
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(body);
multi.addBodyPart(messageBodyPart);
msg.setContent(multi);
Transport transport = session.getTransport("smtps");
transport.connect(host, 465, user, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
return true;
} catch (Exception e) {
return false;
}
}
public void addAttachment(String filename) throws Exception {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multi.addBodyPart(messageBodyPart);
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
private Properties setProperties() {
Properties props = new Properties();
props.put("mail.smtp.host", host);
if(debuggable) {
props.put("mail.debug", "true");
}
if(auth) {
props.put("mail.smtp.auth", "true");
}
props.put("mail.smtp.port", port);
props.put("mail.smtp.socketFactory.port", sport);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
return props;
}
public void setTo(String[] toAddress) {
this.to = toAddress;
}
public void setFrom(String fromAddress) {
this.from = fromAddress;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setBody(String body) {
this.body = body;
}
}
更改程序后,当我单击按钮时,它会停止在执行前状态,显示正在上传日志.请稍候".邮件无法发出.
After I changed the programm, when I click the button, it stops at pre-execution state, displaying "Uploading logs. Please wait". Mail cannot be sent out.
在错误日志中:
08-14 16:26:29.872: I/System.out(22439): DEBUG: setDebug: JavaMail version 1.4.1
08-14 16:26:29.888: I/System.out(22439): DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc.,1.4.1]
08-14 16:26:29.896: I/System.out(22439): DEBUG SMTP: useEhlo true, useAuth false
08-14 16:26:29.896: I/System.out(22439): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
08-14 16:26:30.568: I/System.out(22439): 220 mx.google.com ESMTP nq6sm593334pbc.56
08-14 16:26:30.568: I/System.out(22439): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
08-14 16:26:30.568: I/System.out(22439): EHLO localhost
08-14 16:26:30.716: I/System.out(22439): 250-mx.google.com at your service, [202.155.209.250]
08-14 16:26:30.716: I/System.out(22439): 250-SIZE 35882577
08-14 16:26:30.716: I/System.out(22439): 250-8BITMIME
08-14 16:26:30.716: I/System.out(22439): 250-AUTH LOGIN PLAIN XOAUTH
08-14 16:26:30.716: I/System.out(22439): 250 ENHANCEDSTATUSCODES
08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "SIZE", arg "35882577"
08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "8BITMIME", arg ""
08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
08-14 16:26:30.716: I/System.out(22439): DEBUG SMTP: Attempt to authenticate
08-14 16:26:30.724: I/System.out(22439): AUTH LOGIN
08-14 16:26:30.872: I/System.out(22439): 334 VXNlcm5hbWU6
08-14 16:26:30.872: I/System.out(22439):
08-14 16:26:31.021: I/System.out(22439): 334 UGFzc3dvcmQ6
08-14 16:26:31.021: I/System.out(22439):
08-14 16:26:31.169: I/System.out(22439): 334 UGFzc3dvcmQ6
08-14 16:26:31.177: I/System.out(22439): DEBUG SMTP: useEhlo true, useAuth false
08-14 16:26:31.177: I/System.out(22439): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
08-14 16:26:31.552: D/dalvikvm(22439): GC_CONCURRENT freed 341K, 4% free 11097K/11527K, paused 13ms+3ms, total 37ms
08-14 16:26:31.794: I/System.out(22439): 220 mx.google.com ESMTP st6sm593199pbc.58
08-14 16:26:31.794: I/System.out(22439): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
08-14 16:26:31.794: I/System.out(22439): EHLO localhost
08-14 16:26:31.943: I/System.out(22439): 250-mx.google.com at your service, [202.155.209.250]
08-14 16:26:31.943: I/System.out(22439): 250-SIZE 35882577
08-14 16:26:31.943: I/System.out(22439): 250-8BITMIME
08-14 16:26:31.943: I/System.out(22439): 250-AUTH LOGIN PLAIN XOAUTH
08-14 16:26:31.943: I/System.out(22439): 250 ENHANCEDSTATUSCODES
08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "SIZE", arg "35882577"
08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "8BITMIME", arg ""
08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
08-14 16:26:31.950: I/System.out(22439): DEBUG SMTP: Attempt to authenticate
08-14 16:26:31.950: I/System.out(22439): AUTH LOGIN
08-14 16:26:32.099: I/System.out(22439): 334 VXNlcm5hbWU6
08-14 16:26:32.099: I/System.out(22439):
08-14 16:26:32.247: I/System.out(22439): 334 UGFzc3dvcmQ6
08-14 16:26:32.247: I/System.out(22439):
08-14 16:26:32.403: I/System.out(22439): 334 UGFzc3dvcmQ6
08-14 16:27:00.200: I/Choreographer(22439): Skipped 35 frames! The application may be doing too much work on its main thread.
由于它不起作用,所以我尝试隐藏onpreexecute功能,但没有任何变化,无法发送邮件,以下是错误日志中的消息:
As it does not work, so I try to hide the function onpreexecute, but nothing changes, mail cannot be sent, here are the messages in error log:
08-14 16:31:18.958: I/System.out(22759): DEBUG: setDebug: JavaMail version 1.4.1
08-14 16:31:18.974: I/System.out(22759): DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc.,1.4.1]
08-14 16:31:18.974: I/System.out(22759): DEBUG SMTP: useEhlo true, useAuth false
08-14 16:31:18.974: I/System.out(22759): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
08-14 16:31:19.739: I/System.out(22759): 220 mx.google.com ESMTP og7sm597805pbb.62
08-14 16:31:19.739: I/System.out(22759): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
08-14 16:31:19.739: I/System.out(22759): EHLO localhost
08-14 16:31:19.888: I/System.out(22759): 250-mx.google.com at your service, [202.155.209.250]
08-14 16:31:19.888: I/System.out(22759): 250-SIZE 35882577
08-14 16:31:19.888: I/System.out(22759): 250-8BITMIME
08-14 16:31:19.888: I/System.out(22759): 250-AUTH LOGIN PLAIN XOAUTH
08-14 16:31:19.888: I/System.out(22759): 250 ENHANCEDSTATUSCODES
08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "SIZE", arg "35882577"
08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "8BITMIME", arg ""
08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
08-14 16:31:19.888: I/System.out(22759): DEBUG SMTP: Attempt to authenticate
08-14 16:31:19.896: I/System.out(22759): AUTH LOGIN
08-14 16:31:20.044: I/System.out(22759): 334 VXNlcm5hbWU6
08-14 16:31:20.044: I/System.out(22759):
08-14 16:31:20.185: I/System.out(22759): 334 UGFzc3dvcmQ6
08-14 16:31:20.185: I/System.out(22759):
08-14 16:31:20.341: I/System.out(22759): 334 UGFzc3dvcmQ6
08-14 16:31:20.341: I/System.out(22759): DEBUG SMTP: useEhlo true, useAuth false
08-14 16:31:20.341: I/System.out(22759): DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
08-14 16:31:20.786: I/System.out(22759): 220 mx.google.com ESMTP og7sm597845pbb.62
08-14 16:31:20.786: I/System.out(22759): DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
08-14 16:31:20.786: I/System.out(22759): EHLO localhost
08-14 16:31:20.935: I/System.out(22759): 250-mx.google.com at your service, [202.155.209.250]
08-14 16:31:20.935: I/System.out(22759): 250-SIZE 35882577
08-14 16:31:20.935: I/System.out(22759): 250-8BITMIME
08-14 16:31:20.935: I/System.out(22759): 250-AUTH LOGIN PLAIN XOAUTH
08-14 16:31:20.935: I/System.out(22759): 250 ENHANCEDSTATUSCODES
08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "SIZE", arg "35882577"
08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "8BITMIME", arg ""
08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
08-14 16:31:20.943: I/System.out(22759): DEBUG SMTP: Attempt to authenticate
08-14 16:31:20.943: I/System.out(22759): AUTH LOGIN
08-14 16:31:21.091: I/System.out(22759): 334 VXNlcm5hbWU6
08-14 16:31:21.091: I/System.out(22759):
08-14 16:31:21.239: I/System.out(22759): 334 UGFzc3dvcmQ6
08-14 16:31:21.239: I/System.out(22759):
08-14 16:31:21.380: I/System.out(22759): 334 UGFzc3dvcmQ6
08-14 16:31:49.357: W/IInputConnectionWrapper(22759): clearMetaKeyStates on inactive InputConnection
我已经在AsyncTask中进行了发送操作,请问为什么还是不行?
I have already carry out the send operation in AsyncTask, may I ask why it still does not work?
推荐答案
如日志所示,您正在从主 UI 线程调用网络相关任务.您必须使用 AsyncTask
进行这些通信.并通过执行删除 StrictMode
as the log shows, you are calling network related tasks from main UI thread. You have to use AsyncTask
for these communications. and remove the StrictMode
by doing
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
另请参阅我在这篇文章中关于 使用 JavaMail API 的回答.
Also see my answer in this post regarding the usage of JavaMail API.
在此处添加了内联代码包 com.max.mactest;
Added the code inline here package com.max.mactest;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class Sender extends Activity {
Button Send;
TextView text;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_login);
Send = (Button) findViewById(R.id.cmdDoLogin);
text = (TextView) findViewById(R.id.textView2);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
.permitAll().build();
StrictMode.setThreadPolicy(policy);
Send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
new SendMail().execute();
}
});
}
private class SendMail extends AsyncTask<String, Void, Integer>
{
ProgressDialog pd = null;
String error = null;
Integer result;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
pd = new ProgressDialog(Sender.this);
pd.setTitle("Sending Mail");
pd.setMessage("Please wait...");
pd.setCancelable(false);
pd.show();
}
@Override
protected Integer doInBackground(String... params) {
// TODO Auto-generated method stub
MailSender sender = new MailSender("yourmail@gmail.com", "yourpassword");
sender.setTo(new String[]{"tomail@gmail.com"});
sender.setFrom("yourmail@gmail.com");
sender.setSubject("Test mail");
sender.setBody("This is the mail body");
try {
if(sender.send()) {
System.out.println("Message sent");
return 1;
} else {
return 2;
}
} catch (Exception e) {
error = e.getMessage();
Log.e("SendMail", e.getMessage(), e);
}
return 3;
}
protected void onPostExecute(Integer result) {
pd.dismiss();
if(error!=null) {
text.setText(error);
}
if(result==1) {
Toast.makeText(Sender.this,
"Email was sent successfully.", Toast.LENGTH_LONG)
.show();
} else if(result==2) {
Toast.makeText(Sender.this,
"Email was not sent.", Toast.LENGTH_LONG).show();
} else if(result==3) {
Toast.makeText(Sender.this,
"There was a problem sending the email.",
Toast.LENGTH_LONG).show();
}
}
}
}
更新MailSender
import java.util.Date;
import java.util.Properties;
import javax.activation.CommandMap;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.activation.MailcapCommandMap;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
public class MailSender extends Authenticator {
private String user;
private String password;
private String [] to;
private String from;
private String port;
private String sport;
private String host;
private String subject;
private String body;
private boolean auth;
private boolean debuggable;
private Multipart multi;
public MailSender(){
host = "smtp.gmail.com";
port = "465";
sport = "465";
user = "";
password = "";
from = "";
subject = "";
body = "";
debuggable = false;
auth = true;
multi = new MimeMultipart();
// There is something wrong with MailCap, javamail can not find a handler for the multipart/mixed part, so this bit needs to be added.
MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);
}
public MailSender(String user, String password){
this();
this.user = user;
this.password = password;
}
public boolean send() throws Exception {
Properties props = setProperties();
try{
Session session = Session.getInstance(props, this);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(from));
InternetAddress[] addressTo = new InternetAddress[to.length];
for(int i=0; i<to.length; i++){
addressTo[i] = new InternetAddress(to[i]);
}
msg.setRecipients(MimeMessage.RecipientType.TO, addressTo);
msg.setSubject(subject);
msg.setSentDate(new Date());
BodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText(body);
multi.addBodyPart(messageBodyPart);
msg.setContent(multi);
Transport transport = session.getTransport("smtps");
transport.connect(host, 465, user, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
public void addAttachment(String filename) throws Exception {
BodyPart messageBodyPart = new MimeBodyPart();
DataSource source = new FileDataSource(filename);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(filename);
multi.addBodyPart(messageBodyPart);
}
@Override
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password);
}
private Properties setProperties() {
Properties props = new Properties();
props.put("mail.smtp.host", host);
if(debuggable) {
props.put("mail.debug", "true");
}
if(auth) {
props.put("mail.smtp.auth", "true");
}
props.put("mail.smtp.port", port);
props.put("mail.smtp.socketFactory.port", sport);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
return props;
}
public void setTo(String[] toAddress) {
this.to = toAddress;
}
public void setFrom(String fromAddress) {
this.from = fromAddress;
}
public void setSubject(String subject) {
this.subject = subject;
}
public void setBody(String body) {
this.body = body;
}
}
这篇关于使用 JavaMail API 发送邮件失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 JavaMail API 发送邮件失败
基础教程推荐
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01