当前位置:   article > 正文

Java实现发送邮件(含个人和企业邮箱,以及可能遇到的报错等完整讲述)_java发送企业邮箱

java发送企业邮箱

这里给出完整的发送邮箱的代码,可直接使用2、完整代码这里也给出了一些报错的解决方案。


目录

1、了解SMTP协议

2、完整代码

2.1导入依赖

2.2配置文件中配置基础信息:

2.3工具类MailUtil

2.4Controller接口

3、企业邮箱的配置

4、发送邮箱报错

4.1使用企业邮箱的情况报错

 4.2报错:501 mail from address must be same as authorization user


1、了解SMTP协议

这里我们是发送邮件,所以使用SMTP协议。

1.1简单了解涉及的两个传输协议

SMTP协议:

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

POP3协议:

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

1.2获取qq邮箱授权码步骤

(这里是 个人邮箱 获取授权码的方式)企业邮箱在后面3、企业邮箱的配置

步骤2做完之后,下滑页面,就可以看到步骤3、4

 

2、完整代码

2.1导入依赖

  1. <!--发送邮件-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-mail</artifactId>
  5. </dependency>

这里也有用到hutool包,也可以顺便导入进去

  1. <!-- hutool工具类 版本:<hutool.version>5.3.8</hutool.version> -->
  2. <dependency>
  3. <groupId>cn.hutool</groupId>
  4. <artifactId>hutool-core</artifactId>
  5. <version>5.3.8</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>cn.hutool</groupId>
  9. <artifactId>hutool-crypto</artifactId>
  10. <version>5.3.8</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>cn.hutool</groupId>
  14. <artifactId>hutool-extra</artifactId>
  15. <version>5.3.8</version>
  16. </dependency>
  17. <dependency>
  18. <groupId>cn.hutool</groupId>
  19. <artifactId>hutool-http</artifactId>
  20. <version>5.3.8</version>
  21. </dependency>

2.2配置文件中配置基础信息:

  1. spring:
  2. mail:
  3. # SMTP服务器的地址,这是QQ的,其他的邮箱要改一下
  4. # 企业使用 smtp.exmail.qq.com
  5. # host: smtp.exmail.qq.com
  6. # username: 邮箱地址
  7. # password: 前面获取的授权码
  8. # 个人使用: smtp.qq.com
  9. host: smtp.qq.com
  10. username: 发送人的邮件地址,这里有坑,不能使用邮箱名字,使用邮箱地址
  11. password: 前面获取的授权码
  12. receiver: 接收人的邮件地址
  13. # 设置是否需要认证,如果为true,那么用户名和密码就必须的,
  14. # 如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
  15. properties:
  16. mail:
  17. smtp:
  18. auth: true
  19. # STARTTLS 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
  20. starttls:
  21. enable: true
  22. required: true
  23. default-encoding: UTF-8

2.3工具类MailUtil

创建SpringBean对象

  1. import lombok.Data;
  2. import java.io.Serializable;
  3. @Data
  4. public class Mail implements Serializable {
  5. private static final long serialVersionUID = 1L;
  6. private String recipient ;//邮件接收人
  7. private String subject; //邮件主题(标题)
  8. private String content; //邮件内容
  9. }
  1. @Component
  2. @Slf4j
  3. public class MailUtil {
  4. @Value("${spring.mail.username}")
  5. private String sender; //邮件发送者
  6. @Resource
  7. private JavaMailSender javaMailSender;
  8. /**
  9. * 发送纯文本邮件
  10. *
  11. * @param mail
  12. */
  13. public void sendSimpleMail(Mail mail) throws BusinessException {
  14. try {
  15. SimpleMailMessage mailMessage = new SimpleMailMessage();
  16. mailMessage.setFrom(sender); //邮件发送者
  17. mailMessage.setTo(mail.getRecipient()); // 邮件发给的人
  18. mailMessage.setSubject(mail.getSubject()); // 邮件主题
  19. mailMessage.setText(mail.getContent()); // 邮件内容
  20. javaMailSender.send(mailMessage);
  21. log.info("邮件发送成功 收件人:{}", mail.getRecipient());
  22. } catch (Exception e) {
  23. log.error("邮件发送失败 {}", e.getMessage());
  24. throw new BusinessException("邮件发送异常"); //这是我自定义的一个异常码
  25. }
  26. }
  27. /**
  28. * 复杂邮件
  29. * 可附带各种文件的邮件
  30. *
  31. * @param mail
  32. */
  33. public void sendWordMessageWord(Mail mail) throws MessagingException {
  34. //复杂邮件
  35. MimeMessage mimeMessage = javaMailSender.createMimeMessage();
  36. //true表示需要创建一个multipart message
  37. MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
  38. messageHelper.setFrom(sender);
  39. messageHelper.setTo(mail.getRecipient());
  40. messageHelper.setSubject("这个可以理解为邮件的标题");
  41. messageHelper.setText("这里就是一个邮件内容主体信息");
  42. String filePath = "E:\\demo\\个人简历.docx";
  43. //这里需要给出文件的绝对路径
  44. FileSystemResource file = new FileSystemResource(new File(filePath));
  45. String fileName = file.getFilename();
  46. messageHelper.addAttachment(fileName, file);
  47. javaMailSender.send(mimeMessage);
  48. }
  49. }

2.4Controller接口

  1. @RestController
  2. @Slf4j
  3. public class MailContraller {
  4. //三种方式选择邮件接收者
  5. //接收人
  6. private static String recipient = "xxxxxxxxxx@qq.com";
  7. //这里使用配置文件配置的邮件接收者
  8. @Value("${spring.mail.receiver}")
  9. private String receiver; //邮件接收者
  10. @Resource
  11. private MailUtil mailUtil;
  12. /**
  13. * 普通纯文本邮件
  14. */
  15. @GetMapping(value = "/mailDemo")
  16. public Result<?> sendMailDemo(@RequestParam("写你的接收者") String "写你的接收者") throws BusinessException {
  17. // recipient = reception;
  18. Mail mail = new Mail();
  19. int code = (int) ((Math.random() * 9 + 1) * 100000);
  20. //这里配置接收者,可以从接口参数中获取,也可以提前配置
  21. mail.setRecipient("这里写接收的邮箱即可");
  22. // mail.setRecipient("recipient");
  23. mail.setSubject("修改邮箱");
  24. mail.setContent("亲爱的用户:您好!\n" +
  25. "\n" + " 您收到这封电子邮件是因为您 (也可能是某人冒充您的名义) 申请了修改邮箱。假如这不是您本人所申请, 请不用理会这封电子邮件, 但是如果您持续收到这类的信件骚扰, 请您尽快联络管理员。\n" +
  26. "\n" +
  27. " 请使用以下验证码完成后续修改邮箱流程\n" + "\n " +
  28. code + "\n\n" + " 注意:请您收到邮件的十分钟内(" +
  29. DateFormatUtils.format(new Date().getTime() + 10 * 60 * 1000, "yyyy-MM-dd HH:mm:ss") +
  30. ")前使用,否则验证码将会失效。"
  31. );
  32. mailUtil.sendSimpleMail(mail);
  33. return Result.OK();
  34. }
  35. /**
  36. * 带有附件邮件
  37. */
  38. @GetMapping(value = "/wordMailDemo")
  39. public Result<?> sendWordMailDemo(@RequestParam(value = "reception", required = false) String reception) throws MessagingException {
  40. //reception 接收者的邮箱
  41. if (ObjectUtil.isEmpty(reception)) {
  42. recipient = reception;
  43. }
  44. Mail mail = new Mail();
  45. mail.setRecipient(recipient);
  46. mailUtil.sendWordMessageWord(mail);
  47. return Result.OK();
  48. }
  49. }

到这里就可以实现发送邮件了:

3、企业邮箱的配置

        企业邮箱授权码需要管理员才可以获取,需要登录上管理员账户,再去像前面一样获取企业邮箱的授权码即可。

#需要改一下smtp地址,不过在前面写的配置文件中,我已经注释了,可以直接使用

spring.mail.host=smtp.exmail.qq.com

spring.mail.username=xxxxx@xxxx.com

#注意这里的密码可以填登录密码,不需要授权码,但如果你想用授权码登录,授权码获取参照第三条

spring.mail.password=xxxx

spring.mail.properties.mail.smtp.auth=true

spring.mail.properties.mail.smtp.starttls.enable=true

spring.mail.properties.mail.smtp.starttls.required=true

spring.mail.default-encoding=UTF-8

需要注意

        现在很多服务器运营商都封25端口了!主要是防止垃圾邮件,不过一般是可以申请开启的。

        这是为了加强管理,因为如果大量垃圾邮件从你的平台出去,以后ip段都被人黑名单了,谁也别想发了,所以想阿里云等服务器运营商都封了25端口,所以我们项目部署到服务器的时候邮件要换成465端口发送,这里依据各自项目情况而定。

        只需要在配置文件下加上SSL配置就好,建议在本地发送的时候也加上,更加安全。

  1. # SSL 配置
  2. spring.mail.port=465
  3. spring.mail.protocol=smtp
  4. spring.mail.properties.mail.smtp.ssl.enable=true
  5. spring.mail.properties.mail.smtp.socketFactory.port=465
  6. spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

4、发送邮箱报错

4.1使用企业邮箱的情况报错

报错:

org.springframework.mail.MailSendException: Failed messages: com.sun.mail.smtp.SMTPSendFailedException: 550 Connection frequency limited

这里是因为使用的是企业邮箱,这个邮箱可以设置同一个IP一个时间段的请求数量来做限流。只需要使用管理员账号去修改这个设置即可。 

 4.2报错:501 mail from address must be same as authorization user

翻译:501 发件人地址必须与授权用户相同

        首先就是不能发送人和接收人是同一个人,然后这里如果检查代码没问题,就重新运行项目(热部署的不行,需要重新运行),如果还是不行,就去maven的生命周期中,先clear再install运行,然后重新运行项目即可。

        还有就是要确保接收人的邮箱是开通的才可以,不然也会报错。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/728336
推荐阅读
相关标签
  

闽ICP备14008679号