如何通过 javax.mail 使用 SMTP 从 Android 发送电子邮件
How to send email from Android by javax.mail with SMTP
我正在制作一个具有通过 SMTP 协议从应用程序发送电子邮件的功能的应用程序。
我想让它在后台从应用程序发送电子邮件,而不是像使用其他邮件应用程序发送 Intent 一样。
我在 Google 上搜索了一些与 javax.mail
有关的建议。
我有 SMTP 服务器,其中包含以下信息:主机、端口、用户名、密码。
如何使用 javax.mail 通过 SMTP 发送电子邮件,其中包含 html 到 recipient/recipients,并且电子邮件也有附件。
谢谢
如果您想使用javax.mail
发送电子邮件。您可以使用以下助手 class 发送电子邮件。不管它是由后台服务发送的还是由 AsyncTask 发送的。看看下面class中的配置部分。
package com.company.mail.util;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Message;
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;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
public class Mail {
public static final String EMAIL_LIST_SEPARATOR = ",";
public boolean sendMail(String[] toEmails, String subject, String msg, boolean isHTML, String charSet, String filename, byte[] attachment) {
if (toEmails == null || (toEmails != null && toEmails.length == 0)) return false;
String name = "My Company Name";
String username = "no-reply@company.com";
String password = "<My Password>";
String host = "smtp.company.com";
Integer port = 465;
String from = "no-reply@company.com";
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.socketFactory.port", port.toString());
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port.toString());
final String fUsername = username;
final String fPassword = password;
Session mailSession = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fUsername, fPassword);
}
});
//mailSession.setDebug(true);
String recipients = ArrayUtils.toString(toEmails, "");
Message message = new MimeMessage(mailSession);
try {
message.setFrom(new InternetAddress(from, name));
message.setReplyTo(new InternetAddress[] { new InternetAddress(from, name) });
message.setSubject(subject);
message.setContent(msg, isHTML ? "text/html" : "text/plain");
if (toEmails != null) {
for (String recipient : toEmails) {
if (recipient != null && !"".equals(recipient)) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
}
}
if (attachment != null) {
MimeBodyPart messagePart = new MimeBodyPart();
if (isHTML)
messagePart.setContent(msg, "text/html");
else
messagePart.setText(msg);
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.setDataHandler(new DataHandler(attachment, "application/octet-stream"));
attachmentPart.setFileName(filename);
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messagePart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
}
Transport.send(message);
Log.i(" [Mail] Recipient " + name + " <" + username + "> sent e-mail with subject " + subject + " to recipient(s): " + recipients);
return true;
}
} catch (Exception e) {
Log.e(" [Mail] Error sending " + toEmails.length + " e-mail(s) with subject '" + subject + "' to recipient(s) (" + recipients + "): " + e.getMessage());
}
return false;
}
}
您可以调用方法mail.sendMail(...)
发送邮件,例如:
Mail mail = new Mail();
mail.sendMail(new String[] { "someone@somewhere.com", "john.doe@mycompany.com" }, "Subject of my e-mail", "This is a message in <b>HTML</b> with <i>italics</i>.", true, "UTF-8", null, null);
此 class 还支持向邮件发送附件,因此您可以将文件名和字节数组作为最后两个参数传递。
希望这篇Javaclass对您有所帮助。
我正在制作一个具有通过 SMTP 协议从应用程序发送电子邮件的功能的应用程序。
我想让它在后台从应用程序发送电子邮件,而不是像使用其他邮件应用程序发送 Intent 一样。
我在 Google 上搜索了一些与 javax.mail
有关的建议。
我有 SMTP 服务器,其中包含以下信息:主机、端口、用户名、密码。
如何使用 javax.mail 通过 SMTP 发送电子邮件,其中包含 html 到 recipient/recipients,并且电子邮件也有附件。
谢谢
如果您想使用javax.mail
发送电子邮件。您可以使用以下助手 class 发送电子邮件。不管它是由后台服务发送的还是由 AsyncTask 发送的。看看下面class中的配置部分。
package com.company.mail.util;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.mail.Message;
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;
import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.StringUtils;
public class Mail {
public static final String EMAIL_LIST_SEPARATOR = ",";
public boolean sendMail(String[] toEmails, String subject, String msg, boolean isHTML, String charSet, String filename, byte[] attachment) {
if (toEmails == null || (toEmails != null && toEmails.length == 0)) return false;
String name = "My Company Name";
String username = "no-reply@company.com";
String password = "<My Password>";
String host = "smtp.company.com";
Integer port = 465;
String from = "no-reply@company.com";
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.socketFactory.port", port.toString());
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", port.toString());
final String fUsername = username;
final String fPassword = password;
Session mailSession = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(fUsername, fPassword);
}
});
//mailSession.setDebug(true);
String recipients = ArrayUtils.toString(toEmails, "");
Message message = new MimeMessage(mailSession);
try {
message.setFrom(new InternetAddress(from, name));
message.setReplyTo(new InternetAddress[] { new InternetAddress(from, name) });
message.setSubject(subject);
message.setContent(msg, isHTML ? "text/html" : "text/plain");
if (toEmails != null) {
for (String recipient : toEmails) {
if (recipient != null && !"".equals(recipient)) {
message.addRecipient(Message.RecipientType.TO, new InternetAddress(recipient));
}
}
if (attachment != null) {
MimeBodyPart messagePart = new MimeBodyPart();
if (isHTML)
messagePart.setContent(msg, "text/html");
else
messagePart.setText(msg);
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.setDataHandler(new DataHandler(attachment, "application/octet-stream"));
attachmentPart.setFileName(filename);
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messagePart);
multipart.addBodyPart(attachmentPart);
message.setContent(multipart);
}
Transport.send(message);
Log.i(" [Mail] Recipient " + name + " <" + username + "> sent e-mail with subject " + subject + " to recipient(s): " + recipients);
return true;
}
} catch (Exception e) {
Log.e(" [Mail] Error sending " + toEmails.length + " e-mail(s) with subject '" + subject + "' to recipient(s) (" + recipients + "): " + e.getMessage());
}
return false;
}
}
您可以调用方法mail.sendMail(...)
发送邮件,例如:
Mail mail = new Mail();
mail.sendMail(new String[] { "someone@somewhere.com", "john.doe@mycompany.com" }, "Subject of my e-mail", "This is a message in <b>HTML</b> with <i>italics</i>.", true, "UTF-8", null, null);
此 class 还支持向邮件发送附件,因此您可以将文件名和字节数组作为最后两个参数传递。
希望这篇Javaclass对您有所帮助。