發送郵件的程序,使用QQ的服務器,經過測試,完全可行。可復現
一:准備工作
1.找到賬號的授權碼
這個是程序需要使用的。
在設置中查找。
2.新建項目的目錄
二:完整的程序代碼
1.pom.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 7 <groupId>com.jun</groupId> 8 <artifactId>message</artifactId> 9 <version>1.0-SNAPSHOT</version> 10 11 <dependencies> 12 <dependency> 13 <groupId>org.springframework</groupId> 14 <artifactId>spring-context-support</artifactId> 15 <version>5.1.7.RELEASE</version> 16 </dependency> 17 <dependency> 18 <groupId>org.springframework.boot</groupId> 19 <artifactId>spring-boot-starter-mail</artifactId> 20 <version>2.1.6.RELEASE</version> 21 </dependency> 22 <dependency> 23 <groupId>org.springframework.boot</groupId> 24 <artifactId>spring-boot-starter-test</artifactId> 25 <version>2.1.5.RELEASE</version> 26 <scope>test</scope> 27 </dependency> 28 </dependencies> 29 </project>
2.mail.properties
這個需要寫在測試類的配置文件中,因為在讀取的時候,使用的是測試類中的配置文件
1 #======================當前自己發送端的信息==================== 2 #郵件服務器主機名 3 mailserver.host=smtp.qq.com 4 #郵件服務器監聽的端口號 5 mailserver.port=465 6 #用戶名稱 7 mailserver.username=1354440850@qq.com 8 #開啟服務器后,生成的授權碼 9 mailserver.password=ohikrolx
3.MailConfig
1 package spittr.config; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.ComponentScan; 5 import org.springframework.context.annotation.Configuration; 6 import org.springframework.context.annotation.PropertySource; 7 import org.springframework.core.env.Environment; 8 import org.springframework.mail.javamail.JavaMailSenderImpl; 9 10 import java.util.Properties; 11 12 @Configuration 13 @ComponentScan("spittr") 14 @PropertySource("classpath:mail.properties") 15 public class MailConfig { 16 @Bean 17 public JavaMailSenderImpl mailSender(Environment env) { 18 //spring自帶了一個MailSender的實現接口 19 JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 20 //郵件服務器主機名 21 mailSender.setHost(env.getProperty("mailserver.host")); 22 //郵件服務器監聽的端口號 23 mailSender.setPort(Integer.parseInt(env.getProperty("mailserver.port"))); 24 //用戶名稱 25 mailSender.setUsername(env.getProperty("mailserver.username")); 26 //密碼,這里不是郵箱的密碼,而是開啟服務器后,生成的授權碼 27 mailSender.setPassword(env.getProperty("mailserver.password")); 28 //ssl加密,需要加,否則無法運行 29 Properties props = System.getProperties(); 30 final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; 31 props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); 32 mailSender.setJavaMailProperties(props); 33 return mailSender; 34 } 35 }
4.spitter.java
1 package spittr.domain; 2 3 public class Spitter { 4 //編號 5 private Long id; 6 //用戶名稱 7 private String username; 8 //用戶密碼 9 private String password; 10 //發件人的名稱 11 private String fullName; 12 //收件人的郵箱 13 private String email; 14 //判斷郵件是否帶有附件 15 private boolean updateByEmail; 16 17 public Spitter(Long id, String username, String password, String fullName, String email, boolean updateByEmail){ 18 this.id=id; 19 this.username=username; 20 this.password=password; 21 this.fullName=fullName; 22 this.email=email; 23 this.updateByEmail=updateByEmail; 24 } 25 26 public Long getId() { 27 return id; 28 } 29 30 public void setId(Long id) { 31 this.id = id; 32 } 33 34 public String getUsername() { 35 return username; 36 } 37 38 public void setUsername(String username) { 39 this.username = username; 40 } 41 42 public String getPassword() { 43 return password; 44 } 45 46 public void setPassword(String password) { 47 this.password = password; 48 } 49 50 public String getFullName() { 51 return fullName; 52 } 53 54 public void setFullName(String fullName) { 55 this.fullName = fullName; 56 } 57 58 public String getEmail() { 59 return email; 60 } 61 62 public void setEmail(String email) { 63 this.email = email; 64 } 65 66 public boolean isUpdateByEmail() { 67 return updateByEmail; 68 } 69 70 public void setUpdateByEmail(boolean updateByEmail) { 71 this.updateByEmail = updateByEmail; 72 } 73 }
5.Sputtle
1 package spittr.domain; 2 3 import java.util.Date; 4 5 public class Spittle { 6 //編號 7 private final Long id; 8 //郵件的內容 9 private final String text; 10 //發送的時間 11 private final Date postedTime; 12 //郵件信息的對象 13 private Spitter spitter; 14 15 public Spittle(Long id, String text, Date postedTime, Spitter spitter) { 16 this.id = id; 17 this.text = text; 18 this.postedTime = postedTime; 19 this.spitter = spitter; 20 } 21 22 public Long getId() { 23 return id; 24 } 25 26 public String getText() { 27 return text; 28 } 29 30 public Date getPostedTime() { 31 return postedTime; 32 } 33 34 public Spitter getSpitter() { 35 return spitter; 36 } 37 38 public void setSpitter(Spitter spitter) { 39 this.spitter = spitter; 40 } 41 }
6.SpitterMailService
1 package spittr.email; 2 3 import spittr.domain.Spittle; 4 5 import javax.mail.MessagingException; 6 7 public interface SpitterMailService { 8 public abstract void sendSimpleSpittleEmail(String to, Spittle spittle); 9 public abstract void sendSpittleEmailWithAttachment(String to, Spittle spittle) throws MessagingException; 10 public abstract void sendRichSpitterEmail(String to,Spittle spittle)throws MessagingException; 11 12 }
7.SpitterMailServiceImpl
1 package spittr.email; 2 3 //import org.apache.velocity.app.VelocityEngine; 4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.core.io.ClassPathResource; 6 import org.springframework.mail.SimpleMailMessage; 7 import org.springframework.mail.javamail.JavaMailSender; 8 import org.springframework.mail.javamail.MimeMessageHelper; 9 import org.springframework.stereotype.Component; 10 import spittr.domain.Spittle; 11 12 import javax.mail.MessagingException; 13 import javax.mail.internet.MimeMessage; 14 15 @Component 16 public class SpitterMailServiceImpl implements SpitterMailService { 17 //郵件發送的核心類 18 private JavaMailSender mailSender; 19 20 //通過構造方法將JavaMailSender依賴注入進來 21 @Autowired 22 public SpitterMailServiceImpl(JavaMailSender mailSender) { 23 this.mailSender = mailSender; 24 } 25 26 /* 創建一封簡單的郵件 */ 27 public void sendSimpleSpittleEmail(String to, Spittle spittle) { 28 //通過這個對象封裝信息,相當於信封 29 SimpleMailMessage message = new SimpleMailMessage(); 30 //獲取spittle對象中的收件人名字 31 String spitterName = spittle.getSpitter().getFullName(); 32 //發件人 33 message.setFrom("1354440850@qq.com"); 34 //收件人 35 message.setTo(to); 36 //郵件主題 37 message.setSubject("New spittle from " + spitterName); 38 //郵件內容 39 message.setText("haha,hui,這個是通過程序發送的!"); 40 //發送郵件 41 mailSender.send(message); 42 } 43 44 /* 創建一封帶有圖片附件的郵件 */ 45 public void sendSpittleEmailWithAttachment(String to, Spittle spittle) throws MessagingException { 46 //通過郵件發送器的createMimeMessage方法構建可含附件的郵件 47 MimeMessage message = mailSender.createMimeMessage(); 48 // 第一個參數是郵件的對象 49 // 第二個參數為true表示這個消息是multipart類型的消息(表示是帶有附件的郵件) 50 // 第三個參數是防止中文亂碼 51 MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8"); 52 //獲取收件人名,用於后面發送郵件做主題 53 String spitterName = spittle.getSpitter().getFullName(); 54 //寄件人 55 helper.setFrom("1354440850@qq.com"); 56 //收件人 57 helper.setTo(to); 58 //郵件的主題內容 59 helper.setSubject("New spittle from " + spitterName); 60 //郵件的發送內容 61 helper.setText(spitterName + " says: " + spittle.getText()); 62 //通過路徑獲取圖片附件 63 ClassPathResource couponImage = new ClassPathResource("/collateral/coupon.jpg"); 64 //第一個參數是圖片的名稱,到時候收件人收到的附件名 65 //第二個參數是圖片附件的資源 66 helper.addAttachment("Coupon.jpg", couponImage); 67 //send方法是發送郵件的方法 68 mailSender.send(message); 69 70 } 71 72 73 /* 創建一封嵌套圖片的文本郵件*/ 74 public void sendRichSpitterEmail(String to, Spittle spittle) throws MessagingException { 75 //創建一封富文本郵件 76 MimeMessage message = mailSender.createMimeMessage(); 77 //第二個參數表明傳遞進來的第一個參數是html文本 78 MimeMessageHelper helper = new MimeMessageHelper(message, true, "utf-8"); 79 //發件人 80 helper.setFrom("1354440850@qq.com"); 81 //收件人 82 helper.setTo(to); 83 //發送的郵件主題 84 helper.setSubject("New spittle from " + spittle.getSpitter().getFullName()); 85 //cid:spitterLogo,標記一個變量,后面為這個變量添加一張圖片 86 //第二個參數表示傳遞的第一個參數是html 87 helper.setText("<html><body><img src='cid:spittleLogo'>" + "<h4>" + 88 spittle.getSpitter().getFullName() + "says...</h4>" + "<i>" + spittle.getText() + 89 "</i>" + "</body></html>", true); 90 //創建一個變量存放圖片 91 ClassPathResource image = new ClassPathResource("/collateral/coupon.jpg"); 92 //為消息添加嵌入式的圖片 93 helper.addInline("spittleLogo", image); 94 //發送郵件 95 mailSender.send(message); 96 } 97 }
8.測試類
1 package spittr.email; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.BeansException; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.context.ApplicationContext; 8 import org.springframework.context.ApplicationContextAware; 9 import org.springframework.mail.javamail.JavaMailSenderImpl; 10 import org.springframework.test.context.ContextConfiguration; 11 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 12 import spittr.config.MailConfig; 13 import spittr.domain.Spitter; 14 import spittr.domain.Spittle; 15 16 import java.util.Date; 17 18 @RunWith(SpringJUnit4ClassRunner.class) 19 @ContextConfiguration(classes=MailConfig.class) 20 public class SpitterMailServiceImplTest implements ApplicationContextAware { 21 @Autowired 22 private SpitterMailService mailService; 23 24 @Autowired 25 private ApplicationContext applicationContext; 26 27 @Test 28 public void sendSimpleSpittleEmail() throws Exception { 29 JavaMailSenderImpl beanName = (JavaMailSenderImpl)applicationContext.getBean("mailSender"); 30 31 Spitter spitter = new Spitter(1L, "", null, "coffie", "1354440850@qq.com", true); 32 Spittle spittle = new Spittle(1L, "Hiya!",new Date(),spitter); 33 //第一個參數是收件人,第二個參數是郵件 34 // mailService.sendSimpleSpittleEmail(spitter.getEmail(),spittle); 35 // mailService.sendSpittleEmailWithAttachment(spitter.getEmail(), spittle); 36 mailService.sendRichSpitterEmail(spitter.getEmail(),spittle); 37 } 38 39 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 40 this.applicationContext=applicationContext; 41 } 42 }