java实现extended smtp_java实现发送邮件(SMTP)
1.pom引入包
javax.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@qq.com"
*/
private List toList;
/**
* (可不填)抄送人列表 元素如"10*****787@qq.com"
*/
private List ccList;
/**
* (可不填)密送人列表 元素如"10*****787@qq.com"
*/
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(Message.RecipientType.CC, 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;
}
}
總結
以上是生活随笔為你收集整理的java实现extended smtp_java实现发送邮件(SMTP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初中生学计算机视频,推荐一下适合中学生的
- 下一篇: linux怎样写java代码,linux