JavaMail实现邮件发送

一、邮件服务器与传输协议
要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。

SMTP协议

通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。

POP3协议

通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

二、Java发送邮件JavaMail实现邮件发送
代码:
① .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;
    }
}

上一篇:Linux网络命令ping、ifconfig、mail、last


下一篇:一次性email