㈠ SpringBoot使用javaMailSender發送郵件
在Spring Boot項目中使用JavaMailSender進行郵件發送已成為一種高效便捷的方式。隨著技術發展,早期使用JavaMail API編寫郵件發送代碼變得相對繁瑣。為解決這一問題,Spring框架推出了JavaMailSender介面,進一步簡化了郵件發送過程。在此基礎上,Spring Boot通過引入spring-boot-starter-mail依賴包,為開發者提供了一站式的郵件發送解決方案。
JavaMail是由Sun定義的用於發送和接收電子郵件的API,廣泛適用於不同廠商的實現。雖然它未被包含在JDK中,但卻是Java EE的重要組成部分。JavaMailSender底層基於JavaMail jar包,實現郵件發送功能。
郵件通信協議分為SMTP、POP3和IMAP三種。對於加密傳輸,有SMTPS、POP3S和IMAPS等協議,確保數據安全。此外,JavaMail服務提供程序需要配合JAF(JavaBeansActivationFramework)處理非文本郵件內容,包括MIME(多用途互聯網郵件擴展)、URL頁面和文件附件等。
在Spring Boot中,發送郵件流程可概括為以下幾個步驟:
1. **添加依賴**:在pom.xml文件中引入spring-boot-starter-mail依賴。
2. **配置參數**:在application.properties(或application.yml)文件中加入相應的配置信息,例如郵箱伺服器地址、埠號、用戶名、密碼等。
示例配置(以網易郵箱為例):
mail.smtp.host=smtp.163.com
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.debug=true
埠號默認為25,根據實際情況調整。
3. **編寫郵件服務介面**:定義一個介面並實現發送郵件功能。
4. **封裝在Controller層**:在Controller層中調用郵件服務介面,完成郵件發送。
至此,發送郵件的流程完整結束。啟動項目並調用相關介面,即可成功發送郵件。
Spring Boot的starter模塊提供了自動化配置,引入spring-boot-starter-mail依賴後,系統會根據配置文件中的信息創建JavaMailSender實例。因此,開發者只需在需要使用郵件發送功能的代碼中使用@Autowired註解引入JavaMailSender對象即可。
㈡ java 代碼發郵件怎麼添加附件
實現java發送郵件的過程大體有以下幾步:
准備一個properties文件,該文件中存放SMTP伺服器地址等參數。
利用properties創建一個Session對象
利用Session創建Message對象,然後設置郵件主題和正文
利用Transport對象發送郵件
需要的jar有2個:activation.jar和mail.jar發送附件,需要用到Multipart對象。
importjava.io.File;
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Properties;
importjavax.activation.DataHandler;
importjavax.activation.DataSource;
importjavax.activation.FileDataSource;
importjavax.mail.BodyPart;
importjavax.mail.Message;
importjavax.mail.MessagingException;
importjavax.mail.Multipart;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
importjavax.mail.internet.MimeUtility;
{
privateMimeMessagemessage;
privateSessionsession;
privateTransporttransport;
privateStringmailHost="";
privateStringsender_username="";
privateStringsender_password="";
privatePropertiesproperties=newProperties();
/*
*初始化方法
*/
publicJavaMailWithAttachment(booleandebug){
InputStreamin=JavaMailWithAttachment.class.getResourceAsStream("MailServer.properties");
try{
properties.load(in);
this.mailHost=properties.getProperty("mail.smtp.host");
this.sender_username=properties.getProperty("mail.sender.username");
this.sender_password=properties.getProperty("mail.sender.password");
}catch(IOExceptione){
e.printStackTrace();
}
session=Session.getInstance(properties);
session.setDebug(debug);//開啟後有調試信息
message=newMimeMessage(session);
}
/**
*發送郵件
*
*@paramsubject
*郵件主題
*@paramsendHtml
*郵件內容
*@paramreceiveUser
*收件人地址
*@paramattachment
*附件
*/
publicvoiddoSendHtmlEmail(Stringsubject,StringsendHtml,StringreceiveUser,Fileattachment){
try{
//發件人
InternetAddressfrom=newInternetAddress(sender_username);
message.setFrom(from);
//收件人
InternetAddressto=newInternetAddress(receiveUser);
message.setRecipient(Message.RecipientType.TO,to);
//郵件主題
message.setSubject(subject);
//向multipart對象中添加郵件的各個部分內容,包括文本內容和附件
Multipartmultipart=newMimeMultipart();
//添加郵件正文
BodyPartcontentPart=newMimeBodyPart();
contentPart.setContent(sendHtml,"text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
//添加附件的內容
if(attachment!=null){
BodyPartattachmentBodyPart=newMimeBodyPart();
DataSourcesource=newFileDataSource(attachment);
attachmentBodyPart.setDataHandler(newDataHandler(source));
//網上流傳的解決文件名亂碼的方法,其實用MimeUtility.encodeWord就可以很方便的搞定
//這里很重要,通過下面的Base64編碼的轉換可以保證你的中文附件標題名在發送時不會變成亂碼
//sun.misc.BASE64Encoderenc=newsun.misc.BASE64Encoder();
//messageBodyPart.setFileName("=?GBK?B?"+enc.encode(attachment.getName().getBytes())+"?=");
//MimeUtility.encodeWord可以避免文件名亂碼
attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()));
multipart.addBodyPart(attachmentBodyPart);
}
//將multipart對象放到message中
message.setContent(multipart);
//保存郵件
message.saveChanges();
transport=session.getTransport("smtp");
//smtp驗證,就是你用來發郵件的郵箱用戶名密碼
transport.connect(mailHost,sender_username,sender_password);
//發送
transport.sendMessage(message,message.getAllRecipients());
System.out.println("sendsuccess!");
}catch(Exceptione){
e.printStackTrace();
}finally{
if(transport!=null){
try{
transport.close();
}catch(MessagingExceptione){
e.printStackTrace();
}
}
}
}
publicstaticvoidmain(String[]args){
JavaMailWithAttachmentse=newJavaMailWithAttachment(true);
Fileaffix=newFile("c:\測試-test.txt");
se.doSendHtmlEmail("郵件主題","郵件內容","[email protected]",affix);//
}
}
㈢ Javamail發送附件,為什麼將附件內容直接顯示在郵件正文中
DataSource source = new FileDataSource(new File("E:\\path.txt"));
body.setDataHandler(new DataHandler(source));
你好,復在後面在加上附製件文件名的設置:
body.setFileName(MimeUtility.encodeText(文件名));//設置附件文件名
例如:
body.setFileName(MimeUtility.encodeText(new File("E:\\path.txt").getName()));
ps:郵箱會根據附件的MIME類型自動打開附件,設置一個文件名可以將附件流控製成文件,不讓郵箱自動打開
㈣ Java實現163郵箱發送郵件到QQ郵箱
在本教程中,我們將指導您使用Java實現將163郵箱的郵件發送到QQ郵箱。請按照以下步驟操作:
首先,在Maven項目中創建一個普通項目。
在項目中添加依賴,具體依賴如下:
4.0.0
com.xlgl.wzy
javamail
1.0
commonsIO
2.5.0
system
${pom.basedir}/jar/commonsIO-2.5.0.jar
com.sun.mail
javax.mail
1.6.1
junit
junit
4.10
log4j
log4j
1.2.8
org.apache.commons
commons-compress
1.5
javax.mail
mail
1.4.7
maven-assembly-plugin
jar-with-dependencies
com.xlgl.wzy.mail.SendMailUtils
make-assembly
package
single
為了實現郵件發送,您需要配置以下信息:
1. 創建配置類,用於接收配置文件中的信息,如伺服器地址、埠號、用戶名和授權碼。
2. 在配置類中設置屬性,例如伺服器地址、埠號、用戶名、授權碼等。
3. 實現配置類的載入方法,以載入配置文件中的信息。
4. 在配置文件中,確保授權碼是您163郵箱的授權碼,而非郵箱地址。若未正確配置,程序將顯示錯誤信息:使用163郵箱或其他網易郵箱時出現535 Error: authentication failed。
5. 准備郵件發送工具類,並編寫發送關鍵方法,包括正文和附件的發送。
6. 在測試類中,通過配置信息載入和發送工具類,進行郵件發送測試。
注意:如果在發送過程中出現錯誤,請檢查代碼實現是否有誤。確保所有步驟正確無誤後,您的郵件應成功發送到QQ郵箱,並且在郵箱中查看到附件。
㈤ java 發送郵件 需要哪些jar包
使用發送郵件需要用到mail.jar和activtion.jar兩個包。
該類實現了較完整的郵件發送功能,包括以HTML格式發送,添加附件和抄送人。下面是具體的代碼:
packagecn.cgw.util.mail;
importjava.util.Properties;
importjavax.activation.DataHandler;
importjavax.activation.FileDataSource;
importjavax.mail.Address;
importjavax.mail.BodyPart;
importjavax.mail.Message;
importjavax.mail.Multipart;
importjavax.mail.Session;
importjavax.mail.Transport;
importjavax.mail.internet.InternetAddress;
importjavax.mail.internet.MimeBodyPart;
importjavax.mail.internet.MimeMessage;
importjavax.mail.internet.MimeMultipart;
publicclassMail{
privateMimeMessagemimeMsg;//MIME郵件對象
privateSessionsession;//郵件會話對象
privatePropertiesprops;//系統屬性
privatebooleanneedAuth=false;//smtp是否需要認證
//smtp認證用戶名和密碼
privateStringusername;
privateStringpassword;
privateMultipartmp;//Multipart對象,郵件內容,標題,附件等內容均添加到其中後再生成MimeMessage對象
/**
*Constructor
*@paramsmtp郵件發送伺服器
*/
publicMail(Stringsmtp){
setSmtpHost(smtp);
createMimeMessage();
}
/**
*設置郵件發送伺服器
*@paramhostNameString
*/
publicvoidsetSmtpHost(StringhostName){
System.out.println("設置系統屬性:mail.smtp.host="+hostName);
if(props==null)
props=System.getProperties();//獲得系統屬性對象
props.put("mail.smtp.host",hostName);//設置SMTP主機
}
/**
*創建MIME郵件對象
*@return
*/
()
{
try{
System.out.println("准備獲取郵件會話對象!");
session=Session.getDefaultInstance(props,null);//獲得郵件會話對象
}
catch(Exceptione){
System.err.println("獲取郵件會話對象時發生錯誤!"+e);
returnfalse;
}
System.out.println("准備創建MIME郵件對象!");
try{
mimeMsg=newMimeMessage(session);//創建MIME郵件對象
mp=newMimeMultipart();
returntrue;
}catch(Exceptione){
System.err.println("創建MIME郵件對象失敗!"+e);
returnfalse;
}
}
/**
*設置SMTP是否需要驗證
*@paramneed
*/
publicvoidsetNeedAuth(booleanneed){
System.out.println("設置smtp身份認證:mail.smtp.auth="+need);
if(props==null)props=System.getProperties();
if(need){
props.put("mail.smtp.auth","true");
}else{
props.put("mail.smtp.auth","false");
}
}
/**
*設置用戶名和密碼
*@paramname
*@parampass
*/
publicvoidsetNamePass(Stringname,Stringpass){
username=name;
password=pass;
}
/**
*設置郵件主題
*@parammailSubject
*@return
*/
publicbooleansetSubject(StringmailSubject){
System.out.println("設置郵件主題!");
try{
mimeMsg.setSubject(mailSubject);
returntrue;
}
catch(Exceptione){
System.err.println("設置郵件主題發生錯誤!");
returnfalse;
}
}
/**
*設置郵件正文
*@parammailBodyString
*/
publicbooleansetBody(StringmailBody){
try{
BodyPartbp=newMimeBodyPart();
bp.setContent(""+mailBody,"text/html;charset=GBK");
mp.addBodyPart(bp);
returntrue;
}catch(Exceptione){
System.err.println("設置郵件正文時發生錯誤!"+e);
returnfalse;
}
}
/**
*添加附件
*@paramfilenameString
*/
publicbooleanaddFileAffix(Stringfilename){
System.out.println("增加郵件附件:"+filename);
try{
BodyPartbp=newMimeBodyPart();
FileDataSourcefileds=newFileDataSource(filename);
bp.setDataHandler(newDataHandler(fileds));
bp.setFileName(fileds.getName());
mp.addBodyPart(bp);
returntrue;
}catch(Exceptione){
System.err.println("增加郵件附件:"+filename+"發生錯誤!"+e);
returnfalse;
}
}
/**
*設置發信人
*@paramfromString
*/
publicbooleansetFrom(Stringfrom){
System.out.println("設置發信人!");
try{
mimeMsg.setFrom(newInternetAddress(from));//設置發信人
returntrue;
}catch(Exceptione){
returnfalse;
}
}
/**
*設置收信人
*@paramtoString
*/
publicbooleansetTo(Stringto){
if(to==null)returnfalse;
try{
mimeMsg.setRecipients(Message.RecipientType.TO,InternetAddress.parse(to));
returntrue;
}catch(Exceptione){
returnfalse;
}
}
/**
*設置抄送人
*@paramtoString
*/
publicbooleansetCopyTo(Stringto)
{
if(to==null)returnfalse;
try{
mimeMsg.setRecipients(Message.RecipientType.CC,(Address[])InternetAddress.parse(to));
returntrue;
}
catch(Exceptione)
{returnfalse;}
}
/**
*發送郵件
*/
publicbooleansendOut()
{
try{
mimeMsg.setContent(mp);
mimeMsg.saveChanges();
System.out.println("正在發送郵件....");
SessionmailSession=Session.getInstance(props,null);
Transporttransport=mailSession.getTransport("smtp");
transport.connect((String)props.get("mail.smtp.host"),username,password);
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.TO));
transport.sendMessage(mimeMsg,mimeMsg.getRecipients(Message.RecipientType.CC));
//transport.send(mimeMsg);
System.out.println("發送郵件成功!");
transport.close();
returntrue;
}catch(Exceptione){
System.err.println("郵件發送失敗!"+e);
returnfalse;
}
}
/**
*調用sendOut方法完成郵件發送
*@paramsmtp
*@paramfrom
*@paramto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@returnboolean
*/
publicstaticbooleansend(Stringsmtp,Stringfrom,Stringto,Stringsubject,Stringcontent,Stringusername,Stringpassword){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要驗證
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
/**
*調用sendOut方法完成郵件發送,帶抄送
*@paramsmtp
*@paramfrom
*@paramto
*@paramto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@returnboolean
*/
publicstaticbooleansendAndCc(Stringsmtp,Stringfrom,Stringto,Stringto,Stringsubject,Stringcontent,Stringusername,Stringpassword){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要驗證
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setCopyTo(to))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
/**
*調用sendOut方法完成郵件發送,帶附件
*@paramsmtp
*@paramfrom
*@paramto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@paramfilename附件路徑
*@return
*/
publicstaticbooleansend(Stringsmtp,Stringfrom,Stringto,Stringsubject,Stringcontent,Stringusername,Stringpassword,Stringfilename){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要驗證
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.addFileAffix(filename))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
/**
*調用sendOut方法完成郵件發送,帶附件和抄送
*@paramsmtp
*@paramfrom
*@paramto
*@paramto
*@paramsubject
*@paramcontent
*@paramusername
*@parampassword
*@paramfilename
*@return
*/
publicstaticbooleansendAndCc(Stringsmtp,Stringfrom,Stringto,Stringto,Stringsubject,Stringcontent,Stringusername,Stringpassword,Stringfilename){
MailtheMail=newMail(smtp);
theMail.setNeedAuth(true);//需要驗證
if(!theMail.setSubject(subject))returnfalse;
if(!theMail.setBody(content))returnfalse;
if(!theMail.addFileAffix(filename))returnfalse;
if(!theMail.setTo(to))returnfalse;
if(!theMail.setCopyTo(to))returnfalse;
if(!theMail.setFrom(from))returnfalse;
theMail.setNamePass(username,password);
if(!theMail.sendOut())returnfalse;
returntrue;
}
}