基于SMTP发送一个简单的邮件

首先,需要一个认证器:

package No001_基于SMTP的文本邮件;

import javax.mail.Authenticator;

import javax.mail.PasswordAuthentication;

public class SimpleAuthenticator extends Authenticator {

private String username;

private String password;

public SimpleAuthenticator(String username, String password) {

super();

this.username = username;

this.password = password;

}

protected PasswordAuthentication getPasswordAuthentication() {

return new PasswordAuthentication(username, password);

}

}

然后,书写简单的发送邮件程序:

package No001_基于SMTP的文本邮件;

import java.util.Properties;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

public class SMTPSimpleMail {

public static void main(String[] args) throws AddressException, MessagingException {

/* 必需的信息 */

String SMTP_MAIL_HOST = "smtp.163.com"; // 此邮件服务器地址,自行去所属邮件查询

String EMAIL_USERNAME = "example_email@163.com";

String EMAIL_PASSWORD = "mypassword";

String TO_EMAIL_ADDRESS = "example_email_too@qq.com";

/* 服务器信息 */

Properties props = new Properties();

props.put("mail.smtp.host", SMTP_MAIL_HOST);

props.put("mail.smtp.auth", "true");

/* 创建Session */

Session session = Session.getDefaultInstance(props, new SimpleAuthenticator(EMAIL_USERNAME, EMAIL_PASSWORD));

/* 邮件信息 */

MimeMessage message = new MimeMessage(session);

message.setFrom(new InternetAddress(EMAIL_USERNAME));

message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_EMAIL_ADDRESS));

message.setSubject("how to use java mail to send email.(Title)(001)");

message.setText("how to use java mail to send email.(Content)");

// 发送

Transport.send(message);

System.out.println("不是特别倒霉,你可以去查收邮件了。");

}

}

各种收件人、抄送人、秘密抄送人,怎么办

认证器沿用,略。

其实就是设置、追加多个收件人、抄送人、秘密抄送人:

package No002_各种发件人收件人抄送人怎么办;

import java.io.UnsupportedEncodingException;

import java.util.Properties;

import javax.mail.Address;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeMessage;

public class SendMailWithMultiPeople {

public static void main(String[] args) throws AddressException, MessagingException, UnsupportedEncodingException {

/* 必需的信息 */

String SMTP_MAIL_HOST = "smtp.163.com"; // 此邮件服务器地址,自行去所属邮件查询

String EMAIL_USERNAME = "example@163.com";

String EMAIL_PASSWORD = "mypassword";

String TO_EMAIL_ADDRESS_1 = "example@163.com";

String CC_EMAIL_ADDRESS_1 = "example@163.com";

String BCC_EMAIL_ADDRESS_1 = "example@163.com";

/* 服务器信息 */

Properties props = new Properties();

props.put("mail.smtp.host", SMTP_MAIL_HOST);

props.put("mail.smtp.auth", "true");

/* 创建Session */

Session session = Session.getDefaultInstance(props, new SimpleAuthenticator(EMAIL_USERNAME, EMAIL_PASSWORD));

/* 发件人 */

Address[] senderArray = new Address[1];

senderArray[0] = new InternetAddress("example@163.com", "Nick Huang");

/* 邮件信息 */

MimeMessage message = new MimeMessage(session);

message.addFrom(senderArray);

message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_EMAIL_ADDRESS_1));

message.addRecipient(Message.RecipientType.TO, new InternetAddress(CC_EMAIL_ADDRESS_1));

message.addRecipient(Message.RecipientType.CC, new InternetAddress(CC_EMAIL_ADDRESS_1));

message.addRecipient(Message.RecipientType.CC, new InternetAddress(TO_EMAIL_ADDRESS_1));

message.addRecipient(Message.RecipientType.BCC, new InternetAddress(BCC_EMAIL_ADDRESS_1));

message.setSubject("我是一封学习Java Mail的邮件");

message.setText("我是一封学习Java Mail的邮件的内容,请邮件过滤器高抬贵手。");

// 发送

Transport.send(message);

System.out.println("不是特别倒霉,你可以去查收邮件了。");

}

}

发送附件怎么办

认证器沿用,略。

发送附件demo:

package No003_发送附件怎么办;

import java.io.File;

import java.io.UnsupportedEncodingException;

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

public class SendMailWithAttachment {

public static void main(String[] args) throws AddressException, MessagingException, UnsupportedEncodingException {

/* 必需的信息 */

String SMTP_MAIL_HOST = "smtp.163.com"; // 此邮件服务器地址,自行去所属邮件查询

String EMAIL_USERNAME = "example@163.com";

String EMAIL_PASSWORD = "password";

String TO_EMAIL_ADDRESS_1 = "example@163.com";

/* 服务器信息 */

Properties props = new Properties();

props.put("mail.smtp.host", SMTP_MAIL_HOST);

props.put("mail.smtp.auth", "true");

/* 创建Session */

Session session = Session.getDefaultInstance(props, new SimpleAuthenticator(EMAIL_USERNAME, EMAIL_PASSWORD));

/* 发件人 */

Address[] senderArray = new Address[1];

senderArray[0] = new InternetAddress(EMAIL_USERNAME);

/* 邮件信息 */

MimeMessage message = new MimeMessage(session);

message.addFrom(senderArray);

message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_EMAIL_ADDRESS_1));

message.setSubject("我是一封学习Java Mail的邮件");

BodyPart bodyPart = new MimeBodyPart();

bodyPart.setText("这是一封学习Java Mail的邮件的内容,请邮件过滤器高抬贵手。");

/* 附件 */

BodyPart attachmentPart1 = new MimeBodyPart();

DataSource source = new FileDataSource(new File("D:/文件壹.txt"));

attachmentPart1.setDataHandler(new DataHandler(source));

attachmentPart1.setFileName("=?GBK?B?" + new sun.misc.BASE64Encoder().encode("文件壹.txt".getBytes()) + "?=");

BodyPart attachmentPart2 = new MimeBodyPart();

source = new FileDataSource(new File("D:/文件贰.txt"));

attachmentPart2.setDataHandler(new DataHandler(source));

attachmentPart2.setFileName("=?GBK?B?" + new sun.misc.BASE64Encoder().encode("文件贰.txt".getBytes()) + "?=");

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(bodyPart);

multipart.addBodyPart(attachmentPart1);

multipart.addBodyPart(attachmentPart2);

message.setContent(multipart);

// 发送

Transport.send(message);

System.out.println("不是特别倒霉,你可以去查收邮件了。");

}

}

还有,发送HTML邮件

认证器沿用,略。

其实就是告诉收件客户端用HTML解析渲染:

package No004_发送HTML邮件;

import java.io.UnsupportedEncodingException;

import java.util.Properties;

import javax.mail.Address;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

import javax.mail.Session;

import javax.mail.Transport;

import javax.mail.internet.AddressException;

import javax.mail.internet.InternetAddress;

import javax.mail.internet.MimeBodyPart;

import javax.mail.internet.MimeMessage;

import javax.mail.internet.MimeMultipart;

public class HowToSendHTMLMail {

public static void main(String[] args) throws AddressException, MessagingException, UnsupportedEncodingException {

/* 必需的信息 */

String SMTP_MAIL_HOST = "smtp.163.com"; // 此邮件服务器地址,自行去所属邮件查询

String EMAIL_USERNAME = "example@163.com";

String EMAIL_PASSWORD = "password";

String TO_EMAIL_ADDRESS_1 = "example@163.com";

/* 服务器信息 */

Properties props = new Properties();

props.put("mail.smtp.host", SMTP_MAIL_HOST);

props.put("mail.smtp.auth", "true");

/* 创建Session */

Session session = Session.getDefaultInstance(props, new SimpleAuthenticator(EMAIL_USERNAME, EMAIL_PASSWORD));

/* 发件人 */

Address[] senderArray = new Address[1];

senderArray[0] = new InternetAddress(EMAIL_USERNAME);

/* 邮件信息 */

MimeMessage message = new MimeMessage(session);

message.addFrom(senderArray);

message.addRecipient(Message.RecipientType.TO, new InternetAddress(TO_EMAIL_ADDRESS_1));

message.setSubject("如何发送HTML的邮件");

/* 正文 */

MimeBodyPart bodyPart = new MimeBodyPart();

bodyPart.setContent("

loving you...", "text/html;charset=gb2312");

/* 封装邮件各部分信息 */

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(bodyPart);

message.setContent(multipart);

// 发送

Transport.send(message);

System.out.println("不是特别倒霉,你可以去查收邮件了。");

}

}

要不,来个工具类?

认证器是一定的,沿用,略。

由于需要设置的属性多且繁杂,用个自己人简单易用的属性命名,所以来一个配置类

package No005_来一个工具类;

import java.io.File;

import java.util.ArrayList;

import java.util.List;

public class MailSenderConfig {

private String SMTPMailHost; // 支持SMTP协议的邮件服务器地址

/* 用于登录邮件服务器 */

private String username;

private String password;

private String subject; // 标题

private String content; // 内容

private String fromMail; // 显示从此邮箱发出邮件

private List toMails; // 收件人

private List ccMails; // 抄送人

private List bccMails; // 秘密抄送人

private List attachments; // 附件

public MailSenderConfig(String sMTPMailHost, String subject,

String content, String fromMail) {

super();

SMTPMailHost = sMTPMailHost;

this.subject = subject;

this.content = content;

this.fromMail = fromMail;

}

public String getSMTPMailHost() {

return SMTPMailHost;

}

public void setSMTPMailHost(String sMTPMailHost) {

SMTPMailHost = sMTPMailHost;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getFromMail() {

return fromMail;

}

public void setFromMail(String fromMail) {

this.fromMail = fromMail;

}

public List getToMails() {

return toMails;

}

public void setToMails(List toMails) {

this.toMails = toMails;

}

public List getCcMails() {

return ccMails;

}

public void setCcMails(List ccMails) {

this.ccMails = ccMails;

}

public List getBccMails() {

return bccMails;

}

public void setBccMails(List bccMails) {

this.bccMails = bccMails;

}

public List getAttachments() {

return attachments;

}

public void setAttachments(List attachments) {

this.attachments = attachments;

}

public String getSubject() {

return subject;

}

public void setSubject(String subject) {

this.subject = subject;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public void addToMail (String mail) {

if (this.toMails == null) {

this.toMails = new ArrayList();

}

this.toMails.add(mail);

}

public void addCcMail (String mail) {

if (this.ccMails == null) {

this.ccMails = new ArrayList();

}

this.ccMails.add(mail);

}

public void addBccMail (String mail) {

if (this.bccMails == null) {

this.bccMails = new ArrayList();

}

this.bccMails.add(mail);

}

public void addAttachment (File f) {

if (this.attachments == null) {

this.attachments = new ArrayList();

}

this.attachments.add(f);

}

}

最后,就是工具类的部分,主要负责几个事情:按照Java Mail规则作些初始化动作、将自定义的属性配置类翻译并以Java Mail规则设置、发送邮件。

还有,需要提下的是,因为工具类所提供的代替设置的属性有限,更多的情况可能不满足需要,所以暴露出MimeMessage,在不满足需求的情况开发者可自行加工配置,而其他部分仍可沿用工具类。

package No005_来一个工具类;

import java.io.File;

import java.util.Properties;

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

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 No002_各种发件人收件人抄送人怎么办.SimpleAuthenticator;

public class MailSender {

private MailSenderConfig c;

private MimeMessage message;

public MailSender(MailSenderConfig config) throws Exception {

super();

this.c = config;

this.setConfig();

}

/**

* 初始化

* @return

*/

private Session initSession() {

Properties props = new Properties();

if (c.getSMTPMailHost() != null && c.getSMTPMailHost().length() > 0) {

props.put("mail.smtp.host", c.getSMTPMailHost());

}

if (c.getUsername() != null && c.getUsername().length() > 0 &&

c.getPassword() != null && c.getPassword().length() > 0) {

props.put("mail.smtp.auth", "true");

return Session.getDefaultInstance(props, new SimpleAuthenticator(c.getUsername(), c.getPassword()));

} else {

props.put("mail.smtp.auth", "false");

return Session.getDefaultInstance(props);

}

}

/**

* 设置Java Mail属性

* @throws Exception

*/

private void setConfig() throws Exception {

this.configValid();

Session s = this.initSession();

message = new MimeMessage(s);

/* 发件人 */

Address[] fromMailArray = new Address[1];

fromMailArray[0] = new InternetAddress(c.getFromMail());

message.addFrom(fromMailArray);

if (c.getToMails() != null && c.getToMails().size() > 0) {

for (String mail : c.getToMails()) {

message.addRecipient(Message.RecipientType.TO, new InternetAddress(mail));

}

}

if (c.getCcMails() != null && c.getCcMails().size() > 0) {

for (String mail : c.getCcMails()) {

message.addRecipient(Message.RecipientType.CC, new InternetAddress(mail));

}

}

if (c.getToMails() != null && c.getToMails().size() > 0) {

for (String mail : c.getToMails()) {

message.addRecipient(Message.RecipientType.BCC, new InternetAddress(mail));

}

}

// 邮件标题

message.setSubject(c.getSubject());

/* 正文 */

MimeBodyPart bodyPart = new MimeBodyPart();

bodyPart.setContent(c.getContent(), "text/html;charset=gb2312");

/* 封装邮件各部分信息 */

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(bodyPart);

message.setContent(multipart);

BodyPart attachmentPart = null;

DataSource ds = null;

if (c.getAttachments() != null && c.getAttachments().size() > 0) {

for (File f : c.getAttachments()) {

attachmentPart = new MimeBodyPart();

ds = new FileDataSource(f);

attachmentPart.setDataHandler(new DataHandler(ds));

attachmentPart.setFileName("=?GBK?B?" + new sun.misc.BASE64Encoder().encode(f.getName().getBytes()) + "?=");

multipart.addBodyPart(attachmentPart);

}

}

message.setContent(multipart);

}

/**

* 配置校验

* @throws Exception

*/

private void configValid() throws Exception {

if (c == null) {

throw new Exception("配置对象为空");

}

if (c.getSMTPMailHost() == null || c.getSMTPMailHost().length() == 0) {

throw new Exception("SMTP服务器为空");

}

if (c.getFromMail() == null && c.getFromMail().length() == 0) {

throw new Exception("发件人邮件为空");

}

if (c.getToMails() == null || c.getToMails().size() < 1) {

throw new Exception("收件人邮件为空");

}

if (c.getSubject() == null || c.getSubject().length() == 0) {

throw new Exception("邮件标题为空");

}

if (c.getContent() == null || c.getContent().length() == 0) {

throw new Exception("邮件内容为空");

}

}

/**

* 发送邮件

* @throws MessagingException

*/

public void send() throws MessagingException {

Transport.send(message);

}

/**

* 设置MimeMessage,暴露此对象以便于开发者自行设置个性化的属性

* @return

*/

public MimeMessage getMessage() {

return message;

}

/**

* 设置MimeMessage,暴露此对象以便于开发者自行设置个性化的属性

* @return

*/

public void setMessage(MimeMessage message) {

this.message = message;

}

}

提供一个简单的测试类

package No005_来一个工具类;

import java.io.File;

import javax.mail.internet.MimeMessage;

public class TestCall {

public static void main(String[] args) throws Exception {

/* 必需的信息 */

String SMTP_MAIL_HOST = "smtp.163.com"; // 此邮件服务器地址,自行去所属邮件查询

String EMAIL_USERNAME = "example@163.com";

String EMAIL_PASSWORD = "password";

String TO_EMAIL_ADDRESS_1 = "example@163.com";

String TO_EMAIL_ADDRESS_2 = "example@163.com";

/* 使用情况一,正常使用 */

/*

MailSenderConfig c = new MailSenderConfig(SMTP_MAIL_HOST,

"this is test mail for test java mail framework 3.", "this is content 3.", EMAIL_USERNAME);

c.setUsername(EMAIL_USERNAME);

c.setPassword(EMAIL_PASSWORD);

c.addToMail(TO_EMAIL_ADDRESS_1);

c.addToMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_1);

c.addAttachment(new File("d:/1.txt"));

MailSender ms = new MailSender(c);

ms.send();

System.out.println("sent...");

*/

/* 使用情况二,在更多情况下,工具类所作的设置并不满足需求,故将MimeMessage暴露并 */

MailSenderConfig c = new MailSenderConfig(SMTP_MAIL_HOST,

"this is test mail for test java mail framework 4.", "this is content 4.", EMAIL_USERNAME);

c.setUsername(EMAIL_USERNAME);

c.setPassword(EMAIL_PASSWORD);

c.addToMail(TO_EMAIL_ADDRESS_1);

c.addToMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_1);

c.addAttachment(new File("d:/1.txt"));

MailSender ms = new MailSender(c);

MimeMessage message = ms.getMessage();

message.setContent("this is the replaced content by MimeMessage 4.", "text/html;charset=utf-8");

ms.setMessage(message);

ms.send();

System.out.println("sent...");

}

}

升级下工具类

在实际使用中,发现在批量发送邮件情况下,工具类的支持不好,比如发送100封邮件,按照上述工具类的逻辑,每发送一封邮件就建立一个连接,那么,100封不就100次了吗?这样严重浪费啊。

于是,针对此点作些升级:

认证器是一定的,沿用,略。

配置类

import java.util.ArrayList;

import java.util.List;

public class MailSenderConfig {

private String SMTPMailHost; // 支持SMTP协议的邮件服务器地址

/* 用于登录邮件服务器 */

private String username;

private String password;

private String subject; // 标题

private String content; // 内容

private String fromMail; // 显示从此邮箱发出邮件

private List toMails; // 收件人

private List ccMails; // 抄送人

private List bccMails; // 秘密抄送人

private List attachments; // 附件

private String contentType = "text/html;charset=utf-8";

/**

* 构造器

* @param sMTPMailHost SMTP服务器

* @param subject 标题

* @param content 内容(默认以“text/html;charset=utf-8”形式发送)

* @param fromMail 发送人地址

*/

public MailSenderConfig(String sMTPMailHost, String subject,

String content, String fromMail) {

super();

SMTPMailHost = sMTPMailHost;

this.subject = subject;

this.content = content;

this.fromMail = fromMail;

}

/**

* 构造器

* @param sMTPMailHost SMTP服务器

* @param username 邮件服务器用户名

* @param password 邮件服务器密码

* @param subject 标题

* @param content 内容(默认以“text/html;charset=utf-8”形式发送)

* @param fromMail 发送人地址

*/

public MailSenderConfig(String sMTPMailHost, String username,

String password, String subject, String content, String fromMail) {

super();

SMTPMailHost = sMTPMailHost;

this.username = username;

this.password = password;

this.subject = subject;

this.content = content;

this.fromMail = fromMail;

}

public void addToMail (String mail) {

if (this.toMails == null) {

this.toMails = new ArrayList();

}

this.toMails.add(mail);

}

public void addCcMail (String mail) {

if (this.ccMails == null) {

this.ccMails = new ArrayList();

}

this.ccMails.add(mail);

}

public void addBccMail (String mail) {

if (this.bccMails == null) {

this.bccMails = new ArrayList();

}

this.bccMails.add(mail);

}

public void addAttachment (Attachment a) {

if (this.attachments == null) {

this.attachments = new ArrayList();

}

this.attachments.add(a);

}

/*

* Getter and Setter

*/

public String getSMTPMailHost() {

return SMTPMailHost;

}

public void setSMTPMailHost(String sMTPMailHost) {

SMTPMailHost = sMTPMailHost;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String getFromMail() {

return fromMail;

}

public void setFromMail(String fromMail) {

this.fromMail = fromMail;

}

public List getToMails() {

return toMails;

}

public void setToMails(List toMails) {

this.toMails = toMails;

}

public List getCcMails() {

return ccMails;

}

public void setCcMails(List ccMails) {

this.ccMails = ccMails;

}

public List getBccMails() {

return bccMails;

}

public void setBccMails(List bccMails) {

this.bccMails = bccMails;

}

public List getAttachments() {

return attachments;

}

public void setAttachments(List attachments) {

this.attachments = attachments;

}

public String getSubject() {

return subject;

}

public void setSubject(String subject) {

this.subject = subject;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public String getContentType() {

return contentType;

}

public void setContentType(String contentType) {

this.contentType = contentType;

}

}

附件实体类

import java.io.File;

/**

* 邮件附件实体类

*/

public class Attachment {

private File file;

private String filename;

public File getFile() {

return file;

}

public void setFile(File file) {

this.file = file;

}

public String getFilename() {

if (filename == null || filename.trim().length() == 0) {

return file.getName();

}

return filename;

}

public void setFilename(String filename) {

this.filename = filename;

}

public Attachment(File file, String filename) {

super();

this.file = file;

this.filename = filename;

}

public Attachment(File file) {

super();

this.file = file;

}

}

抽象发送类

import java.util.Properties;

import javax.mail.Session;

public abstract class AbstractSessionMailSender {

protected Session session;

/**

* 初始化Session

* @return

*/

public static Session initSession(MailSenderConfig c) {

Properties props = new Properties();

if (c.getSMTPMailHost() != null && c.getSMTPMailHost().length() > 0) {

props.put("mail.smtp.host", c.getSMTPMailHost());

}

if (c.getUsername() != null && c.getUsername().length() > 0 &&

c.getPassword() != null && c.getPassword().length() > 0) {

props.put("mail.smtp.auth", "true");

return Session.getDefaultInstance(props, new SimpleAuthenticator(c.getUsername(), c.getPassword()));

} else {

props.put("mail.smtp.auth", "false");

return Session.getDefaultInstance(props);

}

}

/**

* 暴露Getter、Setter提供Session的可设置性,以支持批量发送邮件/发送多次邮件时,可缓存Session

* @return

*/

public Session getSession() {

return session;

}

public void setSession(Session session) {

this.session = session;

}

}

发送类

import javax.activation.DataHandler;

import javax.activation.DataSource;

import javax.activation.FileDataSource;

import javax.mail.Address;

import javax.mail.BodyPart;

import javax.mail.Message;

import javax.mail.MessagingException;

import javax.mail.Multipart;

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 javax.mail.internet.MimeUtility;

public class MailSender extends AbstractSessionMailSender {

private MailSenderConfig c;

private MimeMessage message;

public MailSender(MailSenderConfig config) throws Exception {

super();

this.c = config;

this.setConfig();

}

public MailSender(MailSenderConfig config, Session session) throws Exception {

super();

this.c = config;

this.setConfig();

super.setSession(session);

}

/**

* 发送邮件

* @throws MessagingException

*/

public void send() throws MessagingException {

Transport.send(message);

}

/**

* 获取MimeMessage,暴露此对象以便于开发者自行设置个性化的属性(此工具类不支持的方法可由开发人员自行设置,设置完毕设置回来)

* @return

*/

public MimeMessage getMessage() {

return message;

}

/**

* 设置MimeMessage,暴露此对象以便于开发者自行设置个性化的属性(此工具类不支持的方法可由开发人员自行设置,设置完毕设置回来)

* @return

*/

public void setMessage(MimeMessage message) {

this.message = message;

}

/**

* 设置Java Mail属性

* @throws Exception

*/

private void setConfig() throws Exception {

this.configValid();

if (session == null) {

session = initSession(c);

}

message = new MimeMessage(session);

/* 发件人 */

Address[] fromMailArray = new Address[1];

fromMailArray[0] = new InternetAddress(c.getFromMail());

message.addFrom(fromMailArray);

if (c.getToMails() != null && c.getToMails().size() > 0) {

for (String mail : c.getToMails()) {

message.addRecipient(Message.RecipientType.TO, new InternetAddress(mail));

}

}

if (c.getCcMails() != null && c.getCcMails().size() > 0) {

for (String mail : c.getCcMails()) {

message.addRecipient(Message.RecipientType.CC, new InternetAddress(mail));

}

}

if (c.getToMails() != null && c.getToMails().size() > 0) {

for (String mail : c.getToMails()) {

message.addRecipient(Message.RecipientType.BCC, new InternetAddress(mail));

}

}

// 邮件标题

message.setSubject(c.getSubject());

/* 正文 */

MimeBodyPart bodyPart = new MimeBodyPart();

bodyPart.setContent(c.getContent(), c.getContentType());

/* 封装邮件各部分信息 */

Multipart multipart = new MimeMultipart();

multipart.addBodyPart(bodyPart);

message.setContent(multipart);

/* 附件 */

BodyPart attachmentPart = null;

DataSource ds = null;

if (c.getAttachments() != null && c.getAttachments().size() > 0) {

for (Attachment a : c.getAttachments()) {

attachmentPart = new MimeBodyPart();

ds = new FileDataSource(a.getFile());

attachmentPart.setDataHandler(new DataHandler(ds));

attachmentPart.setFileName(MimeUtility.encodeText(a.getFilename()));

multipart.addBodyPart(attachmentPart);

}

}

message.setContent(multipart);

}

/**

* 配置校验

* @throws Exception

*/

private void configValid() throws Exception {

if (c == null) {

throw new Exception("配置对象为空");

}

if (c.getSMTPMailHost() == null || c.getSMTPMailHost().length() == 0) {

throw new Exception("SMTP服务器为空");

}

if (c.getFromMail() == null && c.getFromMail().length() == 0) {

throw new Exception("发件人邮件为空");

}

if (c.getToMails() == null || c.getToMails().size() < 1) {

throw new Exception("收件人邮件为空");

}

if (c.getSubject() == null || c.getSubject().length() == 0) {

throw new Exception("邮件标题为空");

}

if (c.getContent() == null || c.getContent().length() == 0) {

throw new Exception("邮件内容为空");

}

}

}

一个Junit的测试类

import java.io.File;

import javax.mail.Session;

import javax.mail.internet.MimeMessage;

import org.junit.Test;

public class ReadMe {

/* 必需的信息 */

String SMTP_MAIL_HOST = "smtp.163.com"; // 此邮件服务器地址,自行去所属邮件服务器描述页查询

String EMAIL_USERNAME = "example@163.com";

String EMAIL_PASSWORD = "password";

String TO_EMAIL_ADDRESS_1 = "example@163.com";

/* 选填的信息 */

String TO_EMAIL_ADDRESS_2 = "example@163.com";

@Test

public void case1() throws Exception {

/* 使用情况一,正常使用 */

MailSenderConfig c = new MailSenderConfig(SMTP_MAIL_HOST,

"this is a mail for test java mail framework in case1.", "this is content.", EMAIL_USERNAME);

c.setUsername(EMAIL_USERNAME);

c.setPassword(EMAIL_PASSWORD);

c.addToMail(TO_EMAIL_ADDRESS_1);

c.addToMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_1);

c.addAttachment(new Attachment(new File("d:/1.txt")));

MailSender ms = new MailSender(c);

ms.send();

System.out.println("sent...");

}

@Test

public void case2() throws Exception {

/* 使用情况二,在更多情况下,工具类所作的设置并不满足需求,故将MimeMessage暴露以便于开发者自行设置个性化的属性 */

MailSenderConfig c = new MailSenderConfig(SMTP_MAIL_HOST,

"this is a mail for test java mail framework in case2.", "this is content.", EMAIL_USERNAME);

c.setUsername(EMAIL_USERNAME);

c.setPassword(EMAIL_PASSWORD);

c.addToMail(TO_EMAIL_ADDRESS_1);

c.addToMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_1);

c.addAttachment(new Attachment(new File("d:/1.txt")));

MailSender ms = new MailSender(c);

MimeMessage message = ms.getMessage();

message.setContent("this is the replaced content by MimeMessage in case2.", "text/html;charset=utf-8");

ms.setMessage(message);

ms.send();

System.out.println("sent...");

}

@Test

public void case3() throws Exception {

/* 使用情况三,多次发送邮件,可缓存Session,使多次发送邮件均共享此Session,以减少重复创建Session

* 同时需注意缓存的Session的时效性

*/

MailSenderConfig c = new MailSenderConfig(SMTP_MAIL_HOST,

"this is the first mail for test java mail framework to share session in case3.", "this is content.", EMAIL_USERNAME);

c.setUsername(EMAIL_USERNAME);

c.setPassword(EMAIL_PASSWORD);

c.addToMail(TO_EMAIL_ADDRESS_1);

c.addToMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_2);

c.addCcMail(TO_EMAIL_ADDRESS_1);

c.addAttachment(new Attachment(new File("d:/1.txt")));

Session session = MailSender.initSession(c);

MailSender ms = new MailSender(c, session);

ms.send();

c.setSubject("this is the second mail for test java mail framework to share session in case3.");

c.setContent("this is content 2.");

ms = new MailSender(c, session);

ms.send();

System.out.println("sent...");

}

}

总结

目前,我遇到的需求就是这么多,如日后遇见其他常见的需求并有时间,会进一步添加。

以上所述是小编给大家介绍的Java发送邮件遇到的常见需求汇总的全部叙述,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

java邮件抄送_Java发送邮件遇到的常见需求汇总相关推荐

  1. java 邮件发送_Java 基于JavaMail的邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://blog.csdn.net/xietansheng/article/d ...

  2. java 邮件 客户端_JAVA编写ESMTP客户端发送邮件代码

    由SOHU向网易发邮件 1.效果 2.代码 import java.io.*; import java.net.*; public class Smtptest { public static voi ...

  3. java 邮件 定时_Java定时发送邮件

    背景 甲方爸爸:新接入业务在国庆以及军运会期间需要每天巡检业务并发送邮件告知具体情况! 我司:没问题. 甲方爸爸:假期也要发噢. 我司:没问题(...). 刚开始计划指定几个同事轮流发送,业务只要不被 ...

  4. java邮件教程_Java发送Email/邮件

    使用Java应用程序发送邮件是很简单的,需要安装JavaMail API 和Java Activation Framework (JAF) 在机器上. 可以从Java的标准网站上下载JavaMail( ...

  5. java 邮件 附件_java中javamail发送带附件的邮件实现方法

    本文实例讲述了java中javamail发送带附件的邮件实现方法.分享给大家供大家参考.具体分析如下: JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理em ...

  6. java邮件实例_java邮件小实例

    新建一个包,名为mail 第一个类:MailSenderInfo.java ########################################### package com.util.m ...

  7. java发送图片_Java发送邮件(图片、附件、HTML)

    一.简介 要在网络上实现邮件功能,必须要有专门的邮件服务器.这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中. SMTP服务器地址: 一般是 ...

  8. java邮件接收_Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  9. java发送邮箱_Java发送邮件

    //文件名SendEmail.javaimportjava.util.*;importjavax.mail.*;importjavax.mail.internet.*;importjavax.acti ...

最新文章

  1. 优秀简历要遵循哪些规则
  2. python三酷猫_洛克王国三代酷猫登场 冰水酷猫解析
  3. 高德地图调用和添加标注
  4. javascript 动态修改css样式方法汇总(四种方法)
  5. Windows应急响应操作手册
  6. SMP、NUMA、MPP(Teradata)体系结构介绍
  7. python处理LINUX的PWD文档
  8. mysql中cost对比测试
  9. 【图像分割】基于matlab贝叶斯算法阙值图像分割【含Matlab源码 1475期】
  10. PTA程序设计第六周
  11. zz 教你如何用proxyhunter找大学代理
  12. linux 串口驱动解析之2440
  13. java gson解析json_Gson解析json数据(转)
  14. 主机安全扫描入门-用Java封装Nmap
  15. 图片base64编码解码
  16. 什么是OA系统?OA系统是什么?OA是什么意思?
  17. vue tab页面缓存处理
  18. 【亲测有效】解决 Ubuntu 虚拟机无法共享文件夹的问题
  19. 什么样的企业/单位需要圣天诺LDK?
  20. 嵌入式开发和c/c++编程经验总结

热门文章

  1. 异地工程师如何借助PC端实现西门子PLC远程编程配置
  2. IPSec over HTTPS
  3. k-touch w619: Dump boot.img和system.img,然后做成recovery可用的刷机zip包
  4. spyder代码折叠
  5. 抖音广告IOS/Android接入笔记:
  6. 投影仪免费的影视软件有哪些?看《追光者》我却感动得想哭
  7. 论文中有关DEAP数据库介绍,自己写论文时可调用!
  8. [机器学习]机器学习之Python之NumPy数学库的介绍
  9. 2019年遥感图像稀疏表征_图片为:2019年网络最佳图像格式
  10. OpenCV笔记14——图像处理基础知识