java 傳送郵件的幾種方式
阿新 • • 發佈:2022-05-12
一、java mail傳送郵件:
1.pom.xml
<dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency>
2.程式碼
2.1email實體類
@Data public class EmailDto { private String serverName;private String port; private String userName; private String password; private String senderName; private String emailAddress; private String subject; private String to; private String cC; private String content; @Override public String toString() { returnJSONObject.toJSONString(this); } }
2.2郵件傳送
public class MailUtils { /** * 傳送郵件 * @param emailDto email配置資訊 * @param filePath 本地附件地址 */ public static void sendMail(EmailDto emailDto, JSONArray filePath) { Transport transport = null; try { Properties prop= new Properties(); prop.setProperty("mail.host", emailDto.getServerName()); //郵箱傳送 prop.setProperty("mail.transport.protocol", "smtp"); // 郵件傳送協議 prop.setProperty("mail.smtp.auth", "true"); // 需要驗證使用者名稱密碼 //1、建立定義整個應用程式所需的環境資訊的 Session 物件 Session session = Session.getDefaultInstance(prop, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //傳入發件人的姓名和授權碼 return new PasswordAuthentication(emailDto.getUserName(), emailDto.getPassword()); } }); //2、通過session獲取transport物件 transport = session.getTransport(); //3、通過transport物件郵箱使用者名稱和授權碼連線郵箱伺服器 transport.connect(emailDto.getServerName(), emailDto.getUserName(), emailDto.getPassword()); //4、建立郵件,傳入session物件 MimeMessage mimeMessage = getMimeMessage(session, emailDto, filePath); //5、傳送郵件 transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); } catch (Exception e) { e.printStackTrace(); } finally { if (transport != null) { try { transport.close(); } catch (MessagingException e) { e.printStackTrace(); } } } } /** * 組裝傳送資訊 * @param session session * @param emailDto 郵件配置資訊 * @param filesPath 本地地址 * @return MimeMessage * @throws Exception Exception */ private static MimeMessage getMimeMessage(Session session, EmailDto emailDto, JSONArray filesPath) throws Exception { //訊息的固定資訊 MimeMessage mimeMessage = new MimeMessage(session); //發件人 mimeMessage.setFrom(new InternetAddress(emailDto.getEmailAddress())); //收件人 if (StringUtils.isNotBlank(emailDto.getTo())) { String[] tos = emailDto.getTo().split(","); for (String to : tos) { mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); } } //抄送人 if (StringUtils.isNotBlank(emailDto.getCC())) { String[] ccs = emailDto.getTo().split(","); for (String cc : ccs) { mimeMessage.setRecipient(Message.RecipientType.CC, new InternetAddress(cc)); } } //郵件標題 mimeMessage.setSubject(emailDto.getSubject()); MimeMultipart multipart = new MimeMultipart(); //附件 for (Object pathObj : filesPath) { MimeBodyPart attachPart = new MimeBodyPart(); File file = new File((String) pathObj); attachPart.setDataHandler(new DataHandler(new FileDataSource(file))); //避免中文亂碼的處理 attachPart.setFileName(MimeUtility.encodeWord(file.getName())); multipart.addBodyPart(attachPart);//附件 } //正文 MimeBodyPart contentPart = new MimeBodyPart(); contentPart.setContent(emailDto.getContent(), "text/html;charset=utf-8"); multipart.addBodyPart(contentPart); multipart.setSubType("mixed"); //正文和附件都存在郵件中,所有型別設定為mixed //放到Message訊息中 mimeMessage.setContent(multipart); mimeMessage.saveChanges();//儲存修改 return mimeMessage; } }
二、spring自帶的郵件傳送器傳送郵件
1.pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
2.程式碼
/** * 建立郵件傳送器 * * @param emailDto 郵件配置資訊 * @return 傳送器 */ private static JavaMailSenderImpl createMailSender(EmailDto emailDto) { JavaMailSenderImpl sender = new JavaMailSenderImpl(); sender.setHost(emailDto.getServerName()); sender.setPort(Integer.parseInt(emailDto.getPort())); sender.setUsername(emailDto.getUserName()); sender.setPassword(emailDto.getPassword()); sender.setDefaultEncoding("Utf-8"); Properties p = new Properties(); p.setProperty("mail.smtp.timeout", "25000"); p.setProperty("mail.smtp.auth", "false"); sender.setJavaMailProperties(p); return sender; } /** * 傳送郵件 * * @param emailDto emailDto * @param files files(由於附件是服務接收的,故我這裡用MultipartFile) * @throws MessagingException * @throws UnsupportedEncodingException 自定義異常,可忽略 */ public void sendMail(EmailDto emailDto, MultipartFile... files) throws MessagingException, UnsupportedEncodingException { long startTime = System.currentTimeMillis(); JavaMailSenderImpl mailSender = createMailSender(emailDto); MimeMessage mimeMessage = mailSender.createMimeMessage(); // 設定utf-8或GBK編碼,否則郵件會有亂碼 MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8"); messageHelper.setFrom(emailDto.getEmailAddress(), emailDto.getSenderName()); messageHelper.setTo(emailDto.getTo().split(",")); messageHelper.setSubject(emailDto.getSubject()); messageHelper.setText(emailDto.getContent(), true); if (StringUtils.isNotBlank(emailDto.getCC())) { messageHelper.setCc(emailDto.getCC().split(",")); } for (MultipartFile file : files) { if (!file.isEmpty() && file.getOriginalFilename() != null) { messageHelper.addAttachment(file.getOriginalFilename(), file); } } mailSender.send(mimeMessage); log.info("郵件傳送耗時:" + (System.currentTimeMillis() - startTime) / 1000.0); }
三、使用Apache commons-email傳送html郵件
1.pom.xml
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.5</version> </dependency>
2.程式碼
import org.apache.commons.mail.EmailException; import org.apache.commons.mail.HtmlEmail; import java.util.List; /** * @className: MailUtil.java * @description: 郵件工具類 */ public class MailUtil { /** * 構建器 */ public static class EmailInfo { /** * SMTP 伺服器 埠 */ private String mailServer; private Integer mailPort; /** * 發件人 賬號 */ private String mailNick; /** * 發件人 賬號 */ private String mailUsername; /** * 發件人 密碼 */ private String mailPassword; /** * 郵件標題 */ private String title; /** * 郵件內容 */ private String content; /** * 收件人 */ private List<String> receivers; boolean ssl; public EmailInfo(String mailServer,Integer mailPort,String mailNick,String mailUsername, String mailPassword,String title,String content,List<String> receivers,boolean ssl) { this.mailServer = mailServer; this.mailPort = mailPort; this.mailNick = mailNick; this.mailUsername = mailUsername; this.mailPassword = mailPassword; this.title = title; this.content = content; this.receivers = receivers; this.ssl = ssl; } public MailUtil send() throws Exception { return new MailUtil(this); } } private MailUtil(EmailInfo emailInfo) throws Exception { HtmlEmail email = new HtmlEmail(); // 通過Server 傳送郵件 email.setHostName(emailInfo.mailServer); email.setSmtpPort(emailInfo.mailPort); //設定smtp伺服器的認證資料資訊 email.setAuthentication(emailInfo.mailUsername, emailInfo.mailPassword); email.setStartTLSEnabled(false); email.setSSLOnConnect(emailInfo.ssl); try { // 設定發件人 email.setFrom(emailInfo.mailUsername,emailInfo.mailNick); // 設定收件人 (多人) int size = emailInfo.receivers.size(); email.addTo(emailInfo.receivers.toArray(new String[size])); // 設定內容的語言集 email.setCharset("UTF-8"); email.setDebug(false); // 設定主題 email.setSubject(emailInfo.title); // 設定郵件內容 email.setHtmlMsg(emailInfo.content); // 傳送郵件 email.send(); System.out.println("郵件傳送成功!"); } catch (EmailException e) { System.out.println("郵件傳送失敗!"); throw new Exception(e); } } }