我正在尝试从应用发送电子邮件,并使用以下代码:
private static final String username = "sth@gmail.com";
private static final String password = "pass";
private void sendMail(String email, String subject, String messageBody) {
Session session = createSessionObject();
try {
Message message = createMessage(email, subject, messageBody, session);
new SendMailTask().execute(message);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
private Message createMessage(String email, String subject, String messageBody, Session session) throws MessagingException, UnsupportedEncodingException {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("sth@gmail.com"));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(email, email));
message.setSubject(subject);
message.setText(messageBody);
return message;
}
private Session createSessionObject() {
Properties properties = new Properties();
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.port", "587");
return Session.getInstance(properties, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
private class SendMailTask extends AsyncTask<Message, Void, Void> {
private ProgressDialog progressDialog;
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = ProgressDialog.show(SendQuestion.this, "Please wait", "Sending mail", true, false);
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
progressDialog.dismiss();
}
@Override
protected Void doInBackground(Message... messages) {
try {
Transport.send(messages[0]);
} catch (MessagingException e) {
e.printStackTrace();
}
return null;
}
}
Eclipse抛出javax.mail.AuthenticationFailedException。当我第一次尝试发送邮件时,我的Gmail帐户收到了Google发送的有关安全性的邮件,并且他们阻止了邮件。然后我激活/ lesssecureapps,我想允许不太安全的应用程序。但这并没有解决它。我的代码有问题还是有gmail问题?
PS:我已经添加了所有必要的.jar并包含了对清单
的Internet访问权限答案 0 :(得分:0)
尝试这样做:
public static int Email(String fromemail, String toemail, String cc,
String bcc, String Subject, String Body, String Attachment) {
final String fromEmail = fromemail;// "user@gmail.com"; //requires
// valid gmail id
// final String password = Password; // correct password for gmail id
final String toEmail = toemail;// "user2@ymail.com"; // can be any
// email id
MailSSLSocketFactory sf = null;
try {
sf = new MailSSLSocketFactory();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
sf.setTrustAllHosts(true);
Properties props = new Properties();
props.put("mail.smtp.host", "smtp.gmail.com"); // SMTP Host
props.put("mail.smtp.socketFactory.port", "465"); // SSL Port
props.put("mail.smtp.socketFactory.class",
"javax.net.ssl.SSLSocketFactory"); // SSL Factory Class
props.put("mail.smtp.auth", "true"); // Enabling SMTP Authentication
props.put("mail.smtp.port", "465"); // SMTP Port
Authenticator auth = new Authenticator() {
// override the getPasswordAuthentication method
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fromEmail, Password);
}
};
Session session = Session.getDefaultInstance(props, auth);
int i;
i = sendEmail(session, toEmail, Subject, Body);
return i;
}
这是发送功能:
public static void sendEmail(Session session, String toEmail,
String subject, String body) {
try {
MimeMessage msg = new MimeMessage(session);
// set message headers
msg.addHeader("Content-type", "text/HTML; charset=UTF-8");
msg.addHeader("format", "flowed");
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(new InternetAddress("no_reply@journaldev.com",
"Operation Department Email"));
msg.setReplyTo(InternetAddress.parse("no_reply@journaldev.com",
false));
msg.setSubject(subject, "UTF-8");
msg.setText(body, "UTF-8");
msg.setSentDate(new Date());
msg.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(toEmail, false));
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();
}
}
答案 1 :(得分:0)
事实证明,这是谷歌服务器的一个问题。我与支持人员联系并修复了它。上面的代码工作正常。