1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > java实现extended smtp_java实现发送邮件(SMTP)

java实现extended smtp_java实现发送邮件(SMTP)

时间:2023-02-17 08:21:59

相关推荐

java实现extended smtp_java实现发送邮件(SMTP)

1.pom引入包

javax.mail

mail

1.4.7

2.Email实体类

import lombok.Data;

import lombok.EqualsAndHashCode;

import lombok.experimental.Accessors;

import java.util.List;

import java.util.Map;

/**

* @ClassName: Email

* @author: mxy

* @Description: Email的实体类

*/

@Data

@EqualsAndHashCode

@Accessors(chain = true)

public class Email {

/**

* 接收人列表 元素如"10*****787@"

*/

private List toList;

/**

* (可不填)抄送人列表 元素如"10*****787@"

*/

private List ccList;

/**

* (可不填)密送人列表 元素如"10*****787@"

*/

private List bccList;

/**

* (可不填)发送者昵称

*/

private String fromName;

/**

* 发送人(邮箱账号)

*/

private String from;

/**

* 密码(腾讯邮箱为16位授权码)

*/

private String password;

/**

* 邮件主机地址

*/

private String host;

/**

* (可不填)发信端口 默认465

*/

private String port="465";

/**

* 正文

*/

private String text;

/**

* 主题

*/

private String subject;

/**

* (可不填)附件

*/

private List fileList;

/**

* (可不填)要插入的图片 正文需写成html语言,如

* String text = "

HTML+附件+内嵌图片的邮件测试!!!

"

* +"点击跳转"

* +"

LOGO图标

"

* +"";

* Map imagesMap = new HashMap<>();

* imagesMap.put("logo","D:\\asf_logo_wide.gif");

*/

private Map imagesMap;

3.SendEmailUtils类(SMTP)

将email中的所需属性值注入,调用sendSmtpEmail(email)即可,返回值为Boolean.

import com.bonc.industry.email.pojo.Email;

import com.sun.mail.util.MailSSLSocketFactory;

import lombok.extern.slf4j.Slf4j;

import javax.activation.DataHandler;

import javax.activation.FileDataSource;

import javax.mail.*;

import javax.mail.internet.*;

import java.security.GeneralSecurityException;

import java.util.Date;

import java.util.Map;

import java.util.Properties;

/**

* @ClassName:sendEmail

* @author:mxy

* @Description: 发送邮件的工具类

*/

@Slf4j

public class SendEmailUtils {

//发送的主要类:涉及到"登录邮箱"-"组装邮件"-"发送".

public static Boolean sendSmtpEmail(Email email){

try {

Properties properties = getProperties(email);

//发送人名称(为空则默认为发送账户)

Session session = getSession(properties, email);

session.setDebug(true);

//创建email

MimeMessage message = getMimeMessage(email, session);

Transport.send(message);

return true;

}catch (Exception e){

log.error("发送失败:"+e.toString());

return false;

}

}

private static MimeMessage getMimeMessage(Email email, Session session) throws Exception {

MimeMessage message = new MimeMessage(session);

// 设置邮件的属性

// 设置发件人

if (!email.getFromName().isEmpty()) {

// 自定义发件人昵称

message.setFrom(new InternetAddress(MimeUtility.encodeText(email.getFromName()) + " "));

} else {

message.setFrom(new InternetAddress(email.getFrom()));

}

// 一对多发送:

// 构建一个群发地址数组(1对多)

InternetAddress[] adr = new InternetAddress[email.getToList().size()];

for (int i = 0; i < adr.length; i++) {

adr[i] = new InternetAddress(email.getToList().get(i));

}

// Message的setRecipients方法支持群发。 收件人

message.setRecipients(Message.RecipientType.TO, adr);

// 设置密送人

if (null!=email.getBccList()&&email.getBccList().size()>0) {

InternetAddress[] internetAddressBCC = new InternetAddress[email.getBccList().size()];

for (int i = 0; i < internetAddressBCC.length; i++) {

internetAddressBCC[i] = new InternetAddress(email.getBccList().get(i));

}

message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);

}

// 设置抄送人

if (null!=email.getCcList()&&email.getCcList().size()>0) {

InternetAddress[] internetAddressCC = new InternetAddress[email.getCcList().size()];

for (int i = 0; i < internetAddressCC.length; i++) {

internetAddressCC[i] = new InternetAddress(email.getCcList().get(i));

}

message.setRecipients(, internetAddressCC);

}

/*

* JavaMail API不限制信息只为文本,任何形式的信息都可能作MimeMessage的一部分.

* 除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的. JavaMail

* API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法.

*/

// 设置发生日期

message.setSentDate(new Date());

// 设置邮件的主题

message.setSubject(email.getSubject());

//创建用于组合邮件正文和附件的MimeMultipart对象

MimeMultipart mimeMultipart = new MimeMultipart("mixed");

// 创建邮件的正文

message.setText(email.getText(), "text/html;charset=gb2312");

// 设置HTML内容

MimeBodyPart content = createContent(email.getText(), email.getImagesMap());

mimeMultipart.addBodyPart(content);

// 创建附件

if(null!=email.getFileList()&&email.getFileList().size()>0){

for (String filePath:email.getFileList()){

MimeBodyPart attachmentPart = createAttachment(filePath);

mimeMultipart.addBodyPart(attachmentPart);

}

}

message.setContent(mimeMultipart);

message.saveChanges(); // 保存修改

return message;

}

public static MimeBodyPart createContent(String body, Map imagesMap) throws Exception {

/* 创建代表组合MIME消息的MimeMultipart对象和该对象保存到的MimeBodyPart对象 */

MimeBodyPart content = new MimeBodyPart();

// 创建一个MimeMultipart对象

MimeMultipart multipart = new MimeMultipart();

if (!body.isEmpty()) {

// 创建一个表示HTML正文的MimeBodyPart对象,并将它加入到前面的创建的MimeMultipart对象中

MimeBodyPart htmlBodyPart = new MimeBodyPart();

htmlBodyPart.setContent(body, "text/html;charset=UTF-8");

multipart.addBodyPart(htmlBodyPart);

}

if (imagesMap != null && !imagesMap.isEmpty()) {

for (Map.Entry entry: imagesMap.entrySet()) {

/* 创建一个表示图片的MimeBodyPart对象,并将它加入到前面的创建的MimeMultipart对象中 */

MimeBodyPart pictureBodyPart = new MimeBodyPart();

// FileDataSource用于读取文件数据,并返回代表数据的输入输出流和数据的MIME类型

FileDataSource fileDataSource = new FileDataSource(entry.getValue());

// DataHandler类用于封装FileDataSource对象,并为应用程序提供访问数据的接口

pictureBodyPart.setDataHandler(new DataHandler(fileDataSource));

pictureBodyPart.setContentID(entry.getKey());

multipart.addBodyPart(pictureBodyPart);

}

}

// 将MimeMultipart对象保存到MimeBodyPart对象中

content.setContent(multipart);

return content;

}

/**

* 在 JavaMail 中,可以通过 extends Authenticator 抽象类,在子类中覆盖父类中的

* getPasswordAuthentication() 方法,就可以实现以不同的方式来进行登录邮箱时的用户身份认证。JavaMail

* 中的这种设计是使用了策略模式(Strategy

*/

public static Session getSession(Properties properties, Email email) {

return Session.getInstance(properties, new Authenticator() {

@Override

protected PasswordAuthentication getPasswordAuthentication() {

//设置发送帐号密码

return new PasswordAuthentication(

email.getFrom(), email.getPassword());

}

});

}

/**

* JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机.

* @param email

* @return

* @throws GeneralSecurityException

*/

public static Properties getProperties(Email email) throws GeneralSecurityException {

Properties properties = new Properties();

// 设置发送主机

properties.setProperty("mail.host", email.getHost());

// 设置smtp方式

properties.setProperty("mail.transport.protocol", "smtp");

//设置发送端口

properties.setProperty("mail.smtp.port", email.getPort());

// 使用smtp身份验证

properties.setProperty("mail.smtp.auth", "true");

//QQ存在一个特性设置SSL加密

MailSSLSocketFactory sf = new MailSSLSocketFactory();

sf.setTrustAllHosts(true);

properties.put("mail.smtp.ssl.enable", "true");

properties.put("mail.smtp.ssl.socketFactory", sf);

return properties;

}

/**

* 创建保存附件的MimeBodyPart对象,并且加入附件内容和相应的信息

* @param filepath

* @return

* @throws MessagingException

*/

public static MimeBodyPart createAttachment(String filepath) throws Exception{

MimeBodyPart attachmentPart = new MimeBodyPart();

FileDataSource fds = new FileDataSource(filepath);

attachmentPart.setDataHandler(new DataHandler(fds));

attachmentPart.setFileName(MimeUtility.encodeText(fds.getName()));

return attachmentPart;

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。