首页 > 解决方案 > 使用 Spring Boot 按部分发送电子邮件(带分页)?

问题描述

我想通过电子邮件从数据库发送有关用户的信息。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    @Query(value = "SELECT user from User user where user.reportDate >= :ago order by user.reportDate desc")
    List<User> findAllWithDateAfter(@Param("ago") LocalDate ago);
}

经典用户实体:

@Entity
public class User {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Long id;

    private String name;

    /getters and setters, etc

}

服务:

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    public List<User> getUsersForRequiredDays(int days) {
        LocalDate daysAgoDate = LocalDate.now().minusDays(days);
        return badUtmMarksRepository.findAllWithDateAfter(daysAgoDate);
    }
}

但我想限制这个查询。如果我将从该查询中检索超过 30 行,我想将其分成几部分。我不想发送一封包含 100 行的电子邮件,而是发送四封电子邮件 (30/30/30/10)。我听说过分页,但我不知道如何将它应用于邮件。

我正在按时发送电子邮件:

public class ScheduledMailSenderService {

    private final MailSenderService mailSender;

    @Scheduled(cron = "${schedule.cron.update}")
    public void send() {
        log.info("Scheduled sending started");
        try {
            mailSender.send();
        } catch (MessagingException | IOException | TemplateException e) {
            log.error("Error occurred while sending email message:: {}", e.toString());
        }
        log.info("Scheduled sending finished");
    }

}

从 senderService 发送的方法(在上面的 try 块中):

public void send() throws MessagingException, IOException, TemplateException {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        List<User> users = userService.getUsersForRequiredDays(interval); //im using info from db here
        setMimeMessageSettings(mimeMessage, subject, emailTo, reportTable, from);
        mailSender.send(mimeMessage);
    }

标签: javaspringspring-boot

解决方案


你的repo方法应该是:

List<User> findAllWithDateAfter(Pageable pageable, @Param("ago") LocalDate ago);

在调用该方法时,您应该执行以下操作:

@Autowired
UserRepository userRepository; 
...
int size;
int index;

*** fill the size and index variables ***
PageRequest pageRequest = PageRequest.of(index, size);

userRepository.findAllWithDateAfter(pageRequest, your-other-parameter);

推荐阅读