一、邮件服务器与传输协议
要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
SMTP协议
通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议
通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
二、Java发送邮件
代码:
① .yml配置文件
spring: mail: host: smtp.163.com password: TZPVAGGRPGOGYSJS username: c2483173886@163.com port: default-encoding: UTF-8 protocol: smtp properties: mail.smtp.auth: true mail.smtp.starttls.enable: true mail.smtp.starttls.required: true mail.smtp.socketFactory.port: 465 mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory mail.smtp.socketFactory.fallback: false
② .SenEmailController
/** * @Author: ycw * @Description: TODO * @DateTime: 2021/9/13 15:53 **/ @RestController @Slf4j @CrossOrigin(allowCredentials = "true") @RequestMapping("/senMail") public class SenEmailController { @Autowired private UploadDownloadUtils uploadAndDownload; @Autowired private ISendEmailService iSendEmailService; @ApiOperation(value = "邮件") @RecordLog(value = "发邮件",operateType = 2) @PostMapping public R senMail(@RequestParam("email") String email, @RequestParam("subject") String subject, @RequestParam("text") String text, @RequestParam("file") MultipartFile file){ Map<String, Object> map = uploadAndDownload.fileUploads(file); if(CollectionUtils.isEmpty(map)){ throw new ExException(2001,"附件上传失败!"); } Boolean senResult = false; senResult = iSendEmailService.sendAttachmentMail(email,subject,text,map); if (senResult){ return R.ok(); } return R.error(); } }
③ .ISendEmailService
/** * @Author: ycw * @Description: TODO * @DateTime: 2021/9/13 13:16 **/ public interface ISendEmailService { //简单邮件 boolean sendEmail(); //定时发送带附件邮件 Boolean sendAttachmentMail(Map<String,Object> map); //发送带附件的复杂的邮件 boolean sendAttachmentMail(String email, String subject ,String text, Map<String,Object> map); }
④ .ISendEmailService
/** * @Author: ycw * @Description: TODO * @DateTime: 2021/9/13 13:17 **/ @Service @Slf4j public class ISendEmailServiceImpl implements ISendEmailService { @Value("${file.save-file-path}") private String saveFilePath; @Value("${spring.mail.username}") private String fromEmail; @Autowired private JavaMailSender mailSender; //注入spring发送邮件的对象 @Autowired private JavaMailSender javaMailSender; @Override public boolean sendEmail() { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); //目标邮箱 simpleMailMessage.setTo("c2483173886@163.com"); simpleMailMessage.setFrom(fromEmail); //主题 simpleMailMessage.setSubject("测试"); simpleMailMessage.setText("utf-8"); try { javaMailSender.send(simpleMailMessage); //执行发送 } catch (Exception e) { return false; } return true; } @Override public Boolean sendAttachmentMail(Map<String, Object> map) { if (!CollectionUtils.isEmpty(map)){ for (Map.Entry entryMap : map.entrySet()) { try { //邮件对象 MimeMessage mimeMessage = mailSender.createMimeMessage(); //解决中文名乱码 System.setProperty("mail.mime.splitlongparameters", "false"); //邮件处理对象 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "utf-8"); //发件人 helper.setFrom(fromEmail); //收件人 helper.setTo((String) entryMap.getKey()); //主题 helper.setSubject("hello!"); //文本内容 helper.setText("当月经营指导书和报表!", false); //设置文件资源 helper.addAttachment((String) entryMap.getValue(), new File(saveFilePath+entryMap.getValue())); //发送 mailSender.send(mimeMessage); log.info("单附件邮件发送成功!"); } catch (MessagingException e) { log.error("单附件邮件发送失败:{}", e); continue; } } return true; } return false; } @Override public boolean sendAttachmentMail(String email, String subject ,String text, Map<String,Object> map){ String saveFilePath = "saveFilePath"; String fileName = "fileName"; try { //邮件对象 MimeMessage mimeMessage = mailSender.createMimeMessage(); //解决中文名乱码 System.setProperty("mail.mime.splitlongparameters", "false"); //邮件处理对象 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8"); //发件人 helper.setFrom(fromEmail); //收件人 helper.setTo(email); //主题 helper.setSubject(subject); //文本内容 helper.setText(text,false); //设置文件资源 helper.addAttachment((String) map.get(fileName), new File((String) map.get(saveFilePath))); System.out.println(fileName); //发送 mailSender.send(mimeMessage); log.info("【单附件邮件发送成功】收件人:{} 主题:{} 文本内容:{} 文件路径:{}",email,text,text); } catch (MessagingException e) { log.error("单附件邮件发送失败:{}",e); return false; } return true; } }