㈠ 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;
}
}