javax メール クラスを使用して、Gmail SMTP 経由で添付ファイル付きの複数のメールを送信しています。電子メールの送信は、doInBackground() 関数の AsyncTask 内で行われます。メールの配列リストがあり、1 つずつ送信しています。最初の電子メールは正常に送信されますが、次の電子メールから MessagingException: Could not connect to SMTP host が発生します。なぜこの問題が発生するのかよくわかりません。必要なリソースが解放されていない可能性はありますか? 誰もこの問題の解決策を知っていますか?
04-30 10:10:25.109: W/System.err(619): javax.mail.MessagingException: SMTP ホストに接続できませんでした: localhost、ポート: 25; 04-30 10:10:25.109: W/System.err(619): ネストされた例外は: 04-30 10:10:25.109: W/System.err(619): java.net.ConnectException: localhost/127.0. 0.1:25 - 接続が拒否されました 04-30 10:10:25.109: W/System.err(619): com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391) 04-30 10:10: 25.109: W/System.err(619): at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412) 04-30 10:10:25.109: W/System.err(619): at javax .mail.Service.connect(Service.java:288) 04-30 10:10:25.109: W/System.err(619): javax.mail.Service.connect(Service.java:169) 04-30 10 :10:25.109: W/System.err(619): javax.mail.Service.connect(Service.java:118) 04-30 10:10:25.109: W/System.err(619): javax.郵便物。
私のメール送信 asynctask クラス
class SendEmailAsyncTask extends AsyncTask <Void, Void, Boolean> {
Mail thisMail;
public SendEmailAsyncTask() {
if(V) Log.v(SendEmailAsyncTask.class.getName(), "SendEmailAsyncTask()");
this.thisMail = mailQueue.get(mailCounter);
sendMessageToClient("Sending " + thisMail.getRecipients());
}
@Override
protected Boolean doInBackground(Void... params) {
if(V) Log.v(SendEmailAsyncTask.class.getName(), "doInBackground()");
try {
thisMail.send();
return true;
} catch (AuthenticationFailedException e) {
Log.e(SendEmailAsyncTask.class.getName(), "Gmail account details are wrong");
createNotification("Gmail account details are incorrect. Please check them in the settings.");
setFlag(FLAG_BAD_ACCOUNT);
e.printStackTrace();
return false;
} catch (MessagingException e) {
Log.e(SendEmailAsyncTask.class.getName(), thisMail.getRecipients() + " sending failed");
e.printStackTrace();
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
if(result) { // email send success
//sent successfully
if(D) Log.d(SendEmailAsyncTask.class.getName(), "email sent successfully");
sendMessageToClient("Email sent");
} else {
//retry? or quit
if(D) Log.d(SendEmailAsyncTask.class.getName(), "email was not sent");
sendMessageToClient("Email not sent");
}
mailCounter++;
// if there are more mails in the queue start another send email task
if (mailCounter < mailQueue.size()) {
SendEmailAsyncTask sendTask = new SendEmailAsyncTask();
sendTask.execute();
// if there are no more in the mail queue, delete the data set
} else {
deleteTask = new DeleteFilesAsyncTask(currentDataSet.getDate(), currentDataSet.getMachine());
deleteTask.execute();
}
sendTask = null;
}
}
編集: メール ラッパー クラスを調べると、使用しているポートは 25 ではなく 465 です。
public class Mail extends javax.mail.Authenticator {
private String mailhost = "smtp.gmail.com";
private String user;
private String password;
private Session session;
private Multipart multipart;
private String subject;
private String body;
private String sender;
private String recipients;
static {
Security.addProvider(new JSSEProvider());
}
public Mail(String user, String password) {
this.user = user;
this.password = password;
multipart = new MimeMultipart();
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", mailhost);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
//session = Session.getDefaultInstance(props, this);
session = Session.getInstance(props, this);
}
}