【问题标题】:Send emails to multiple email addresses, It feeds email addresses from a csv file向多个电子邮件地址发送电子邮件,它从 csv 文件中提供电子邮件地址
【发布时间】:2021-03-11 23:56:12
【问题描述】:

我想创建一个应用程序来向多个收件人发送电子邮件。它从 csv 文件中提供电子邮件地址并向每个收件人发送电子邮件,但我在执行此操作时遇到了一些麻烦。 你能帮帮我吗?

这是我的 CSVHelper.java

@Component
public class CSVHelper 
{
    
  public static String TYPE = "text/csv";
  static String[] HEADERs = { "id", "email", "dateEcheance"};


//This method is used to filter the csv file and get only the emails
public List<ContactsFile> csvToEmails() throws NumberFormatException, ParseException 
  {
      InputStream is = null;
      try (BufferedReader fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                CSVParser csvParser = new CSVParser(fileReader, CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());) 
        {

          List<ContactsFile> emailsList = new ArrayList<>();

          Iterable<CSVRecord> csvRecords = csvParser.getRecords();

          for (CSVRecord csvRecord : csvRecords) 
          {
              ContactsFile contact = new ContactsFile(csvRecord.get("email"));
              emailsList.add(contact);
          }
          System.out.println(emailsList);
          return emailsList;
        
        }
        catch (IOException e) { throw new RuntimeException("fail to get emails: " + e.getMessage()); }
  }  

我们在控制器中调用 csvToEmails() 方法来发送电子邮件

@Autowired
    private CSVHelper csvHelper;

    @PostMapping("/getdetails")
    public @ResponseBody EmailNotification sendMail(@RequestBody EmailNotification details) throws Exception {

        MimeMessage message = sender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message,
                MimeMessageHelper.MULTIPART_MODE_MIXED_RELATED,
                StandardCharsets.UTF_8.name());

  
        try {
            helper.setTo((InternetAddress) csvHelper.csvToEmails());
            helper.setText(details.getMessage(),true);
            helper.setSubject("Test Mail");
        } catch (javax.mail.MessagingException e) {
            e.printStackTrace();
        }
        sender.send(message);

        return details;

这是 csv 文件的示例:

id,email,dateEcheance
1,address@email.com,10/05/2021
2,address2@email.com,10/02/2021

我是 Spring Boot 新手,我无法完成这个项目。

【问题讨论】:

  • 您遇到了什么问题?
  • 我在过滤 csv 文件并仅从中获取电子邮件时遇到了麻烦。我不知道如何继续
  • 我已添加我的回复。
  • 非常感谢您的帮助,但是一旦我想将电子邮件发送给收件人,我就会收到此异常: .mmaExceptionHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error : 无法从 VALUE_STRING 令牌中反序列化 java.util.ArrayList 的实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of java.util.ArrayList out of VALUE_STRING token

标签: spring-boot csvhelper


【解决方案1】:

假设您已经配置好邮件服务器。首先,您需要提供JavaMailSender 实现。 Spring 确实提供了相同的实现。您必须创建一个 bean 并按如下方式配置邮件服务器配置。

    @Configuration
    public class MailConfig {
    
      @Autowired
      private Environment env;
    
      @Bean
      public JavaMailSender mailSender() {
        try {
          JavaMailSenderImpl mailSenderImpl = new JavaMailSenderImpl();
          mailSenderImpl.setHost(env.getRequiredProperty("mail.smtp.host"));
          mailSenderImpl.setUsername(env.getRequiredProperty("mail.smtp.username"));
          mailSenderImpl.setPassword(env.getRequiredProperty("mail.smtp.password"));
          mailSenderImpl.setDefaultEncoding(env.getRequiredProperty("mail.smtp.encoding"));
          mailSenderImpl.setPort(Integer.parseInt(env.getRequiredProperty("mail.smtp.port")));
          mailSenderImpl.setProtocol(env.getRequiredProperty("mail.transport.protocol"));
          Properties p = new Properties();
          p.setProperty("mail.smtp.starttls.enable", "true");
          p.setProperty("mail.smtp.auth", "true");
          mailSenderImpl.setJavaMailProperties(p);
          return mailSenderImpl;
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      }
    
    }

application.properties 中的配置设置。根据邮件服务器添加设置。

# SMTP mail settings
mail.smtp.host=**********
mail.smtp.username=**********
mail.smtp.password=**********

mail.smtp.port=**********
mail.smtp.socketFactory.port=**********

mail.smtp.encoding=utf-8
mail.transport.protocol=smtp
mail.smtp.auth=true
mail.smtp.timeout=10000
mail.smtp.starttls.enable=true
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

CSVHelper.java

    @Component
    public class CSVHelper {
    
      // This method is used to filter the csv file and get only the emails
      public List<String> csvToEmails() {
        InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("csvFile.csv");
        try (BufferedReader fileReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            CSVParser csvParser = new CSVParser(fileReader,
                CSVFormat.DEFAULT.withFirstRecordAsHeader().withIgnoreHeaderCase().withTrim());) {
    
          List<String> emails = new ArrayList<>();
          Iterable<CSVRecord> csvRecords = csvParser.getRecords();
          for (CSVRecord csvRecord : csvRecords) {
            String email = csvRecord.get("email");
            emails.add(email);
          }
          return emails;
        } catch (IOException e) {
          throw new RuntimeException("fail to get emails: " + e.getMessage());
        } 
      }
    }

发送邮件服务

    @Service
    public class MailSenderService {
    
      @Autowired
      private CSVHelper csvHelper;
    
      @Autowired
      private JavaMailSender sender;
    
      public void sendMail(EmailNotification details) {
    
        try {
          List<String> recipients = csvHelper.csvToEmails();
          String[] to = recipients.stream().toArray(String[]::new);
    
          JavaMailSenderImpl jms = (JavaMailSenderImpl) sender;
          MimeMessage message = jms.createMimeMessage();
          MimeMessageHelper helper = new MimeMessageHelper(message, true);
          
          // add the sender email address below
          helper.setFrom("sender@mail.com");
          
          helper.setTo(to);
          helper.setText(details.getMessage(), true);
          helper.setSubject("Test Mail");
          sender.send(message);
        } catch (javax.mail.MessagingException | NumberFormatException e) {
          // action for exception case
        } 
      } 
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    • 2014-07-20
    相关资源
    最近更新 更多