คำแนะนำเกี่ยวกับบริการอีเมลอย่างง่าย (AWS SES) พร้อม Spring Boot และ Spring Cloud PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

คำแนะนำเกี่ยวกับ Simple Email Service (AWS SES) ด้วย Spring Boot และ Spring Cloud

บทนำ

AWS SES (บริการอีเมลอย่างง่าย) เป็นบริการส่งและรับอีเมลที่ง่ายต่อการตั้งค่า การจัดการระบบอีเมลภายในองค์กรมักจะเป็นเรื่องยาก ยุ่งยาก และน่าเบื่อหน่าย ดังนั้นการจ้างกระบวนการภายนอกจึงเป็นทางเลือกยอดนิยม

เราสามารถใช้ Amazon SES เพื่อส่งอีเมลธุรกรรม อีเมลการตลาด หรืออีเมลแจ้งเตือนประเภทอื่นๆ ไปยังลูกค้าของเรา เป็นโซลูชันราคาไม่แพงสำหรับธุรกิจทุกขนาดที่ใช้อีเมลเพื่อเชื่อมต่อกับลูกค้า เนื่องจากสร้างขึ้นจากโครงสร้างพื้นฐานที่เชื่อถือได้และปรับขนาดได้ของ Amazon Web Services (AWS).

สำหรับการส่งอีเมลจำนวนมาก แอปพลิเคชันใดๆ อาจโต้ตอบกับ Amazon SES เราจ่ายเฉพาะอีเมลที่เราส่งจริงเท่านั้น ไม่ว่าจะเป็นอีเมลธุรกรรมหรืออีเมลการตลาด นอกจากนี้ Amazon SES ยังรองรับการกำหนดค่าต่างๆ ซึ่งรวมถึงที่อยู่ IP เฉพาะ ที่แชร์หรือเป็นเจ้าของ ธุรกิจสามารถทำให้ทุกอีเมลมีค่าด้วยการใช้แดชบอร์ดการส่งมอบและรายงานเกี่ยวกับข้อมูลผู้ส่ง

ในคู่มือนี้ เราจะกำหนดค่าอินสแตนซ์ AWS SES ในภูมิภาคแล้วรวมเข้าด้วยกัน Spring Cloud สำหรับ AWS ซึ่งเป็นโครงการย่อยของ เมฆฤดูใบไม้ผลิ. เราจะลองใช้สถานการณ์ต่างๆ เพื่อส่งอีเมลจากแอปพลิเคชันของเรา

หมายเหตุ คุณสามารถค้นหาซอร์สโค้ดทั้งหมดที่ใช้ในคู่มือ Github.

วงจรชีวิตของการส่งอีเมลโดยใช้ AWS SES

มาดูกันว่าวงจรชีวิตของอีเมลที่ส่งโดยแอปพลิเคชันไปถึงกล่องจดหมายปลายทางอย่างไร:

  • ในกรณีของเรา โค้ด Spring Cloud ร้องขอให้ AWS SES ส่งอีเมลไปยังผู้รับอย่างน้อยหนึ่งราย

  • SES จะตรวจสอบคำขอในขั้นต้น และหากได้รับการอนุมัติ จะสร้างข้อความอีเมลพร้อมข้อกำหนดเฉพาะของคำขอ ข้อความอีเมลนี้มีส่วนหัว เนื้อความ และซองจดหมาย และสอดคล้องกับ RFC 5322คำจำกัดความรูปแบบข้อความทางอินเทอร์เน็ตของ

  • จากนั้น SES จะส่งข้อความไปยังผู้รับของผู้รับผ่านทางอินเทอร์เน็ต ทันทีที่ส่งข้อความไปยัง SES ข้อความนั้นมักจะถูกส่งทันที โดยปกติแล้วความพยายามในการส่งครั้งแรกจะเกิดขึ้นภายในเวลาไม่กี่วินาที

  • มีหลายผลลัพธ์ในเวลานี้ ตัวอย่างเช่น:

    • จัดส่งเรียบร้อย: ผู้ให้บริการอินเทอร์เน็ต (ISP) ยอมรับอีเมลและส่งไปยังผู้รับที่ต้องการ
    • ตีกลับอย่างหนัก: เนื่องจากที่อยู่ของผู้รับไม่ถูกต้อง ISP จึงปฏิเสธอีเมล ISP จะส่งการแจ้งเตือนฮาร์ดแบ็คกลับไปยัง Amazon SES ซึ่งจะแจ้งผู้ส่งผ่านอีเมลหรือโดยการเผยแพร่ไปยังหัวข้อ Amazon Simple Notification Service (Amazon SNS) ที่ตั้งค่าให้รับการแจ้งเตือนนี้
    • ซอฟท์เด้ง: เนื่องจากเงื่อนไขต่างๆ เช่น กล่องจดหมายของผู้รับเต็ม โดเมนไม่มีอยู่ หรือสถานการณ์ที่ส่งผ่าน เช่น ISP ยุ่งเกินกว่าจะประมวลผลคำขอ ISP อาจไม่สามารถส่งอีเมลไปยังผู้รับได้ จากนั้น ISP จะลองส่งอีเมลอีกครั้งตามจำนวนครั้งที่กำหนด และส่งข้อความ SES ที่มีการตีกลับแบบซอฟต์ หาก SES ไม่สามารถส่งอีเมลได้ภายในกรอบเวลาที่กำหนด SES จะเผยแพร่กิจกรรมไปยังหัวข้อ SNS หรือส่งข้อความ Hard Bounce ทางอีเมล
    • การร้องเรียน: อีเมลถูกจัดประเภทเป็นสแปมโดยผู้รับในโปรแกรมอีเมลของตน การแจ้งเตือนการร้องเรียนจะถูกส่งไปยัง Amazon SES ซึ่งจะส่งต่อไปยังผู้ส่งหาก Amazon SES และ ISP มีลูปการตอบรับที่จัดตั้งขึ้น
    • ตอบกลับอัตโนมัติ: ISP ของผู้รับจะแจ้ง Amazon SES เกี่ยวกับการตอบกลับอัตโนมัติจากผู้รับ เช่น การแจ้งลางาน และ Amazon SES จะส่งการแจ้งเตือนไปยังผู้ส่ง

เมื่อการส่งไม่สำเร็จ Amazon SES จะส่งคืนข้อผิดพลาดไปยังผู้ส่งและลบอีเมลนั้น

การตั้งค่า Amazon SES

ไม่เหมือนกับบริการอื่นๆ ของ AWS ตรงที่ไม่จำเป็นต้องสร้างอินสแตนซ์ SES เนื่องจากบัญชี AWS ใหม่ทั้งหมดจะอยู่ในแซนด์บ็อกซ์ AWS SES ตามค่าเริ่มต้น บัญชี AWS แต่ละบัญชีมีสิทธิ์เข้าถึงแซนด์บ็อกซ์สำหรับ AWS SES ในภูมิภาคที่มีอยู่ตามค่าเริ่มต้น

เมื่อใช้โหมดแซนด์บ็อกซ์ เราสามารถส่งอีเมลไปยังตัวตนที่ได้รับการยืนยันเท่านั้น โดเมนหรือที่อยู่อีเมลที่เราใช้ในการส่งอีเมลเป็นการยืนยันตัวตน เราต้องสร้างและตรวจสอบตัวตนแต่ละรายการที่เราตั้งใจจะใช้เป็น From, To, Source, Sender,หรือ Return-Path ที่อยู่ก่อนที่เราจะสามารถส่งอีเมลโดยใช้ SES ในโหมดแซนด์บ็อกซ์ ด้วยการใช้ Amazon SES เพื่อยืนยันตัวตน เราสามารถพิสูจน์ความเป็นเจ้าของและหยุดการใช้งานที่ผิดกฎหมายได้

เพื่อหลีกเลี่ยงการฉ้อโกงและรักษาชื่อเสียงของที่อยู่ IP AWS SES ได้รวมขีดจำกัดการส่งอีเมล ข้อจำกัดเหล่านี้ระบุจำนวนอีเมลสูงสุดต่อวินาที และขีดจำกัดอีเมลรายวันสำหรับผู้ใช้แต่ละราย ในการติดต่อกับ AWS Support Center เราอาจกำหนดโควต้าดังกล่าวตามภูมิภาค

มายืนยันตัวตนกัน เข้าสู่ระบบ AWS Console และค้นหา “บริการอีเมล Amazon Simple"

บทนำ SES

จากนั้นคลิกที่“สร้างเอกลักษณ์” เพื่อเพิ่มอีเมลหรือโดเมนสำหรับการยืนยัน ในกรณีของเรา เราจะเพิ่มอีเมลสำหรับการตรวจสอบ

สร้างเอกลักษณ์

เมื่อสร้างข้อมูลประจำตัวแล้ว เราสามารถตรวจสอบรายละเอียดได้

สร้างเอกลักษณ์

ตัวตนที่เราสร้างเข้าไป “อยู่ระหว่างการตรวจสอบ" เวที. ในขั้นตอนนี้ ผู้ใช้ต้องตรวจสอบอีเมลยืนยันจาก AWS และทำตามคำแนะนำเพื่อรับอีเมลยืนยัน

ยืนยันตัวตน

ต่อไปเราต้องดึง “คีย์การเข้าถึง"และ"รหัสลับ” สำหรับการรับรองความถูกต้องและการอนุญาตแอปพลิเคชันของเราด้วย SES ในการสร้างสิ่งนั้น เราจำเป็นต้องสร้างกลุ่มผู้ใช้และเพิ่มผู้ใช้ในกลุ่มนั้น เมื่อเราสร้างผู้ใช้นั้น AWS จะสร้างรหัสการเข้าถึงและรหัสลับ ดังนั้นขอเปลี่ยนเส้นทางไปที่ “AMI” ใน AWS Console และสร้างกลุ่มผู้ใช้

สร้างกลุ่มผู้ใช้

จากนั้นเราต้องเพิ่ม “การเข้าถึงผู้ดูแลระบบ” อนุญาตกลุ่มนั้นสำหรับ SES

เพิ่มสิทธิ์

สุดท้าย เราจะเพิ่มผู้ใช้ในกลุ่มข้างต้น

เพิ่มผู้ใช้

ต่อไปเราต้องเลือกกลุ่มสำหรับการอนุญาต

เพิ่มกลุ่ม

สุดท้าย ให้คัดลอกคีย์การเข้าถึงและคีย์ลับที่แสดงบนหน้าจอเพื่อใช้งานต่อไป

การส่งอีเมลโดยใช้ Spring Cloud Project

ตั้งค่าโครงการ

มาเริ่มโครงการ Spring Cloud และเรียกใช้กรณีการใช้งานเพื่อรวมเข้ากับ SES วิธีที่ง่ายที่สุดในการเริ่มต้นด้วยโครงการโครงกระดูกคือ ฤดูใบไม้ผลิ Initializr:

ฤดูใบไม้ผลิ Initializr

เราได้เพิ่ม เว็บสปริง สำหรับ REST MVC อาปาเช่ ฟรีมาร์คเกอร์ เพื่อสร้างเทมเพลตอีเมลที่ใช้ HTML ผู้ส่งจดหมาย Java เพื่อส่งอีเมลและ ลอมบอก (ไลบรารีลดสำเร็จรูปทางเลือก) การพึ่งพา นอกจากนี้ เราจำเป็นต้องเพิ่มการอ้างอิงที่เกี่ยวข้องสำหรับ Spring Cloud AWS และ SES สำหรับ Spring Cloud AWS เราจะเพิ่ม Spring Cloud AWS BOM แยกต่างหากใน pom.xml ไฟล์โดยใช้สิ่งนี้ บล็อก:

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>io.awspring.cloud</groupId>
			<artifactId>spring-cloud-aws-dependencies</artifactId>
			<version>2.3.0</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

สุดท้าย ในการเพิ่มการสนับสนุนสำหรับ SES เราจำเป็นต้องรวมการขึ้นต่อกันของโมดูลซึ่งพร้อมใช้งานเป็นโมดูลเริ่มต้น spring-cloud-starter-aws-ses:

<dependency>
	<groupId>io.awspring.cloud</groupId>
	<artifactId>spring-cloud-starter-aws-ses</artifactId>
</dependency>

spring-cloud-starter-aws-ses รวมถึงการพึ่งพาสกรรมกริยาสำหรับ spring-cloud-starter-awsและ spring-cloud-aws-ses. spring-cloud-aws-ses โมดูลสำหรับ SES มีสองคลาส: SimpleEmailServiceMailSender และ SimpleEmailServiceJavaMailSender.

  • พื้นที่ SimpleEmailServiceMailSender คลาสใช้ Amazon Simple Email Service เพื่อส่งอีเมล Java Mail API ไม่ใช่ข้อกำหนดสำหรับการใช้งานนี้ อาจใช้เพื่อส่งข้อความเมลแบบตรงไปตรงมาโดยไม่มีไฟล์แนบ
  • พื้นที่ SimpleEmailServiceJavaMailSender คลาสเปิดใช้งานการส่งอีเมลที่มีไฟล์แนบและองค์ประกอบ mime อื่น ๆ

ดังนั้นสิ่งนี้จึงครอบคลุมข้อกำหนดพื้นฐานทั้งหมดของเรา!

การกำหนดค่าถั่ว

ตามที่กล่าวไว้ข้างต้น เราจำเป็นต้องกำหนดถั่วสองประเภท: SimpleEmailServiceMailSender และ SimpleEmailServiceJavaMailSender. เราสามารถส่งคีย์การเข้าถึงและรหัสลับเป็นข้อมูลประจำตัวและกำหนดค่าa MailSender bean ที่เราจะใช้ในการส่งอีเมล:

@Configuration
public class SesConfig {

    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;

    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;

    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonSimpleEmailService amazonSimpleEmailService() {
        BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        return AmazonSimpleEmailServiceClientBuilder.standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(region)
                .build();
    }

    @Bean
    public MailSender mailSender(AmazonSimpleEmailService amazonSimpleEmailService) {
        return new SimpleEmailServiceMailSender(amazonSimpleEmailService);
    }

    @Bean
    public JavaMailSender javaMailSender(AmazonSimpleEmailService amazonSimpleEmailService) {
        return new SimpleEmailServiceJavaMailSender(amazonSimpleEmailService);
    }
}

ในการส่งอีเมลพร้อมไฟล์แนบ เราจำเป็นต้องกำหนดค่า SimpleEmailServiceJavaMailSender ซึ่งเป็นการดำเนินการของ JavaMailSender ส่วนต่อประสานจากนามธรรมเมลของ Spring

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

เราจะกำหนดคุณสมบัติในการดึงข้อมูลด้วย application.yml:

cloud:
  aws:
    region:
      static: eu-central-1
      auto: false
    stack:
      auto: false
    credentials:
      access-key: ********
      secret-key: **************************

การส่งอีเมลอย่างง่าย

เราสามารถส่งอีเมลอย่างง่ายโดยใช้ SimpleEmailServiceMailSender bean ที่เรากำหนดค่าไว้ข้างต้น มากำหนดเลเยอร์บริการเพื่อใช้บีนนี้:

@Service
public class EmailService {

    @Autowired
    private MailSender mailSender;

    public void sendMessage(SimpleMailMessage simpleMailMessage) {
        this.mailSender.send(simpleMailMessage);
    }
}

เราเรียก send() วิธีการใน MailSender ถั่วเพื่อส่งอีเมลของเรา เรายังต้องผ่านการ SimpleMailMessage ที่จะมีคุณสมบัติเช่น from, to, ข้อความและหัวเรื่องสำหรับอีเมลของเรา ลองนิยาม a . กัน Controller คลาสเพื่อเรียกใช้บริการด้านบนโดยใช้ REST API:

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @PostMapping("/sendEmail")
    public String sendMessage(@RequestBody EmailDetails emailDetails) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(emailDetails.getFromEmail());
        simpleMailMessage.setTo(emailDetails.getToEmail());
        simpleMailMessage.setSubject(emailDetails.getSubject());
        simpleMailMessage.setText(emailDetails.getBody());
        emailService.sendMessage(simpleMailMessage);

        return "Email sent successfully";
    }
}

ตอนนี้ หากเราเรียกใช้แอปพลิเคชันและดำเนินการ curl ต่อไปนี้ มันจะส่งอีเมลไปยังที่อยู่อีเมลที่ตรวจสอบแล้ว:

curl -i -X POST 
   -H "Content-Type:application/json" 
   -d 
'{
  "fromEmail": "[email protected]",
  "toEmail": "[email protected]",
  "subject": "test email",
  "body": "Hi, This is a test email."
}' 
 'http://localhost:8080/sendEmail'

ต่อไป เราสามารถเข้าสู่ระบบไปยังที่อยู่อีเมลของผู้รับและตรวจสอบว่าผู้รับได้รับอีเมลหรือไม่

การส่งอีเมลอย่างง่ายพร้อมไฟล์แนบ

เราจะกำหนดชั้นบริการเพื่อส่งไฟล์แนบเป็น mime และตั้งค่าแอตทริบิวต์อีเมลอื่น ๆ เช่น from, to, ข้อความและหัวเรื่อง:

@Service
public class EmailService {

    @Autowired
    private JavaMailSender javaMailSender;

    public void sendMessageWithAttachment(SimpleMailMessage simpleMailMessage) {

        try {
            MimeMessage message = javaMailSender.createMimeMessage();

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

            
            helper.addAttachment("logo.png", new ClassPathResource("logo.png"));
            helper.setTo(Objects.requireNonNull(simpleMailMessage.getTo()));
            helper.setText(Objects.requireNonNull(simpleMailMessage.getText()));
            helper.setSubject(Objects.requireNonNull(simpleMailMessage.getSubject()));
            helper.setFrom(Objects.requireNonNull(simpleMailMessage.getFrom()));
            javaMailSender.send(message);

        } catch (MessagingException e) {
            System.err.println("Exception: " + e.getMessage());
        }
    }
}

ที่นี่เรากำลังใช้ MimeMessageHelper เพื่อสร้างอีเมลพร้อมไฟล์แนบ ในที่สุดเราจะกำหนด Controller ชั้นที่จะผ่าน SimpleMailMessage แอตทริบิวต์:

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @PostMapping("/sendEmailWithAttachment")
    public String sendMessageWithAttachment(@RequestBody EmailDetails emailDetails) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(emailDetails.getFromEmail());
        simpleMailMessage.setTo(emailDetails.getToEmail());
        simpleMailMessage.setSubject(emailDetails.getSubject());
        simpleMailMessage.setText(emailDetails.getBody());
        emailService.sendMessageWithAttachment(simpleMailMessage);

        return "Email sent successfully";
    }
}

ตอนนี้ หากเราเรียกใช้แอปพลิเคชันและดำเนินการ curl ต่อไปนี้ มันจะส่งอีเมลไปยังที่อยู่อีเมลที่ตรวจสอบแล้ว:

curl -i -X POST 
   -H "Content-Type:application/json" 
   -d 
'{
  "fromEmail": "[email protected]",
  "toEmail": "[email protected]",
  "subject": "test email",
  "body": "Hi, This is a test email with attachment."
}' 
 'http://localhost:8080/sendEmailWithAttachment'

ต่อไป เราสามารถเข้าสู่ระบบไปยังที่อยู่อีเมลของผู้รับและตรวจสอบว่าผู้รับได้รับอีเมลหรือไม่

การส่งอีเมลเทมเพลตพร้อมไฟล์แนบ

กรณีการใช้งานก่อนหน้านี้ที่เราเห็นว่าดีสำหรับสถานการณ์การพัฒนาหรือการทดสอบ แต่ในการผลิต โดยทั่วไปเราใช้เทมเพลตอีเมลที่มีตัวแปรซึ่งจะถูกแทนที่โดยใช้การตอบกลับของ API ก่อนหน้านี้เราได้เพิ่มการพึ่งพาสำหรับ อาปาเช่ ฟรีมาร์คเกอร์. เราจะใช้เพื่อกำหนดเทมเพลตและโหลดเพื่อดำเนินการ!

สำหรับสิ่งนี้ ขั้นแรกให้กำหนดเทมเพลตอย่างง่าย ตั้งชื่อเป็น email-template.ftl และวางไว้ใน templates ภายใต้โฟลเดอร์ resources:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>StackAbuse Email</title>
</head>

<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
    <tr>
        <td align="center" valign="top" bgcolor="#838383"
            style="background-color: #838383;"><br> <br>
            <table width="600" border="0" cellspacing="0" cellpadding="0">
                <tr>
                    <td align="center" valign="top" bgcolor="#d3be6c"
                        style="background-color: #d3be6c; font-family: Arial,
                         Helvetica, sans-serif; font-size: 13px; color: #000000;
                          padding: 0px 15px 10px 15px;">

                        <div style="font-size: 48px; color:blue;">
                            <b>StackAbuse</b>
                        </div>

                        <div style="font-size: 24px; color: #555100;">
                            <br> Sending Email using Spring Cloud with <b>FreeMarker</b> template !!! <br>
                        </div>
                        <div>
                            <br> Want to learn a new technology or become an in-demand full-stack developer?<br>
                            <br> We teach the skills you need to level up in your career.<br>
                            <br>"Sharing knowledge is the biggest learning" <br> <br>
                            <br> <br> <b>${Name}</b><br>${location}<br>
                            <br>
                        </div>
                    </td>
                </tr>
            </table> <br> <br></td>
    </tr>
</table>
</body>
</html>

ต่อไป เราต้องกำหนดคลาสการกำหนดค่าเพื่อโหลดเทมเพลตจากเส้นทางและเพิ่มเป็น bean สำหรับสิ่งนี้เราจะกำหนด FreeMarkerConfigurationFactoryBean:

@Configuration
public class FreemarkerConfig {

    @Primary
    @Bean
    public FreeMarkerConfigurationFactoryBean factoryBean() {
        FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
        bean.setTemplateLoaderPath("classpath:/templates");
        return bean;
    }
}

ต่อไป เราจะกำหนดชั้นบริการของเราเพื่อโหลดเทมเพลตนี้ และสร้างข้อความสุดท้ายเพื่อส่งไปยัง SES:

@Service
public class EmailService {
    
    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private Configuration config;
    
    public void sendTemplateMessageWithAttachment(SimpleMailMessage simpleMailMessage) {

        try {
            MimeMessage message = javaMailSender.createMimeMessage();

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

            Template t = config.getTemplate("email-template.ftl");
            Map model = new HashMap();
            model.put("Name", "StackAbuse Admin");
            model.put("location", "Bangalore, India");
            String html = FreeMarkerTemplateUtils.processTemplateIntoString(t, model);

            
            helper.addAttachment("logo.png", new ClassPathResource("logo.png"));
            helper.setTo(Objects.requireNonNull(simpleMailMessage.getTo()));
            helper.setText(html, true);
            helper.setSubject(Objects.requireNonNull(simpleMailMessage.getSubject()));
            helper.setFrom(Objects.requireNonNull(simpleMailMessage.getFrom()));
            javaMailSender.send(message);

        } catch (MessagingException | IOException | TemplateException e) {
            System.err.println("Exception: " + e.getMessage());
        }
    }

ในที่สุดเราจะกำหนด a Controller เลเยอร์เพื่อส่งผ่านแอตทริบิวต์อีเมลแบบไดนามิก:

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @PostMapping("/sendTemplateEmailWithAttachment")
    public String sendTemplateMessageWithAttachment(@RequestBody EmailDetails emailDetails) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(emailDetails.getFromEmail());
        simpleMailMessage.setTo(emailDetails.getToEmail());
        simpleMailMessage.setSubject(emailDetails.getSubject());
        simpleMailMessage.setText(emailDetails.getBody());
        emailService.sendTemplateMessageWithAttachment(simpleMailMessage);

        return "Email sent successfully";
    }
}

ตอนนี้ หากเราเรียกใช้แอปพลิเคชันและดำเนินการ curl ต่อไปนี้ มันจะส่งอีเมลไปยังที่อยู่อีเมลที่ตรวจสอบแล้ว:

curl -i -X POST 
   -H "Content-Type:application/json" 
   -d 
'{
  "fromEmail": "[email protected]",
  "toEmail": "[email protected]",
  "subject": "test email",
  "body": "Hi, This is a test template email with attachment."
}' 
 'http://localhost:8080/sendTemplateEmailWithAttachment'

ต่อไป เราสามารถเข้าสู่ระบบที่อยู่อีเมลของผู้รับและตรวจสอบว่าผู้รับได้รับอีเมลหรือไม่:

อีเมลเทมเพลต Freemarker

การส่งอีเมลส่วนบุคคลโดยใช้เทมเพลตใน AWS SES

ในกรณีการใช้งานก่อนหน้านี้ เราใช้เทมเพลตแบบคงที่เพื่อส่งอีเมล เราจะเปิดใช้งานเทมเพลตให้ออกแบบแบบไดนามิกเพื่อวัตถุประสงค์ที่แตกต่างกันและผู้รับประเภทต่างๆ ได้อย่างไร AWS SES ช่วยให้เราสร้างเทมเพลตอีเมลเพื่อส่งอีเมลส่วนบุคคลไปยังปลายทางอย่างน้อยหนึ่งแห่งในการดำเนินการเดียว

เราสามารถสร้างเทมเพลตอีเมลได้สูงสุด 10,000 รายการต่อบัญชี Amazon SES แต่ละเทมเพลตสามารถมีขนาดสูงสุด 500KB รวมทั้งส่วนข้อความและ HTML เราสามารถส่งได้ถึง 50 ปลายทางในแต่ละสาย

ดังนั้นมาสร้างเทมเพลตอีเมลกันอย่างรวดเร็ว ก่อนอื่น เราสามารถกำหนดไฟล์ JSON โดยใช้เทมเพลตต่อไปนี้:

{
  "Template": {
    "TemplateName": "MyTemplate",
    "SubjectPart": "Greetings from {{name}}!",
    "HtmlPart": "StackAbuse Email


StackAbuse

Sending Email using Spring Cloud with AWS SES Email template !!!

Want to learn a new technology or become an in-demand full-stack developer?

We teach the skills you need to level up in your career.

"Sharing knowledge is the biggest learning"



{{name}}
{{location}}



"
, "TextPart": "Dear {{name}},rnHere is your StackAbuse Email." } }

เทมเพลตนี้มีแอตทริบิวต์ต่อไปนี้:

  • ชื่อแม่แบบ: ประกอบด้วยชื่อของเทมเพลต
  • เรื่องส่วน: นี่ถือเป็นหัวเรื่องของอีเมล แท็กทดแทนอาจมีอยู่ในเนื้อหานี้ แท็กเหล่านี้มีรูปแบบดังนี้: {{tagname}}. คุณสามารถป้อนค่าสำหรับ {{tagname}} สำหรับแต่ละปลายทางเมื่อส่งอีเมล
  • Html ส่วน: มีเนื้อหา HTML ของอีเมลและสามารถมีแท็กแทนที่ได้
  • ส่วนข้อความ: นี่แสดงถึงเนื้อหาข้อความของอีเมล อีเมลรุ่นนี้จะถูกส่งไปยังผู้รับที่ไคลเอนต์อีเมลไม่ดูอีเมล HTML แท็กทดแทนอาจมีอยู่ในเนื้อหานี้

เราสามารถบันทึกไฟล์นี้เป็น mytemplate.json. สุดท้าย เราสามารถใช้คำสั่ง AWS CLI เพื่อสร้างเทมเพลตได้ดังนี้:

$ aws ses create-template --cli-input-json file://mytemplate.json

ต่อไป มากำหนดชั้นบริการเพื่อกำหนดแอตทริบิวต์และส่งอีเมลเทมเพลต:

@Service
public class EmailService {

    @Autowired
    private AmazonSimpleEmailService simpleEmailService;

    public void sendTemplatedMessage(SimpleMailMessage simpleMailMessage) {

        Destination destination = new Destination();
        List toAddresses = new ArrayList();
        String[] emails = simpleMailMessage.getTo();
        Collections.addAll(toAddresses, Objects.requireNonNull(emails));
        destination.setToAddresses(toAddresses);

        SendTemplatedEmailRequest templatedEmailRequest = new SendTemplatedEmailRequest();
        templatedEmailRequest.withDestination(destination);
        templatedEmailRequest.withTemplate("MyTemplate");
        templatedEmailRequest.withTemplateData("{ "name":"StackAbuse Admin", "location": "Bangalore, India"}");
        templatedEmailRequest.withSource(simpleMailMessage.getFrom());
        simpleEmailService.sendTemplatedEmail(templatedEmailRequest);
    }
}

เราเพิ่มได้หลายรายการ Destination ที่อยู่เพื่อส่งอีเมลจำนวนมากไปยังผู้รับหลายคน เรากำลังใช้ sendTemplatedEmail() วิธีการจาก AmazonSimpleEmailService อินเทอร์เฟซเพื่อส่งอีเมล templated นี้ เรายังจำเป็นต้องส่งแท็กแทนที่เพื่อแทนที่ในข้อความ HTML ของเทมเพลตที่เราสร้างไว้ก่อนหน้านี้

ในที่สุดเราจะกำหนด a Controller เลเยอร์เพื่อกำหนด REST API เพื่อส่งผ่านแอตทริบิวต์:

@RestController
public class EmailController {

    @Autowired
    private EmailService emailService;

    @PostMapping("/sendAWSTemplatedEmail")
    public String sendTemplatedMessage(@RequestBody EmailDetails emailDetails) {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(emailDetails.getFromEmail());
        simpleMailMessage.setTo(emailDetails.getToEmail());
        simpleMailMessage.setSubject(emailDetails.getSubject());
        simpleMailMessage.setText(emailDetails.getBody());
        emailService.sendTemplatedMessage(simpleMailMessage);

        return "Email sent successfully";
    }
}

ต่อไป เมื่อเราเรียกใช้แอป เราสามารถดำเนินการดังต่อไปนี้ curl เพื่อส่งอีเมล templated:

curl -i -X POST 
   -H "Content-Type:application/json" 
   -d 
'{
  "fromEmail": "[email protected]",
  "toEmail": "[email protected]",
  "subject": "Greetings from StackAbuse Admin",
  "body": "Hi, This is a AWS templated email."
}' 
 'http://localhost:8080/sendAWSTemplatedEmail'

ในที่สุดผู้รับก็จะได้เห็นอีเมล templated:

อีเมลเทมเพลต

ขอการเข้าถึงการผลิต

สุดท้าย ในการส่งอีเมลถึงผู้รับ ไม่ว่าที่อยู่หรือโดเมนของผู้รับจะผ่านการตรวจสอบความถูกต้องหรือไม่ ท้ายที่สุด เราต้องนำบัญชีของเราออกจากแซนด์บ็อกซ์ ตัวตนของเราทั้งหมดรวมถึง From, Source, Senderและ Return-Path ที่อยู่ยังคงต้องได้รับการยืนยัน เราสามารถส่งคำขอสำหรับการเข้าถึงการผลิตได้จาก "แดชบอร์ดบัญชี” หน้าดังนี้

แดชบอร์ดบัญชี
ขอการเข้าถึงการผลิต

เราสามารถส่งคำขอโดยกรอกรายละเอียดด้านบนทั้งหมดจาก AWS Console นอกจากนี้ยังสามารถส่งแบบเดียวกันโดยใช้ AWS CLI สิ่งนี้จะเป็นประโยชน์เมื่อเราจำเป็นต้องร้องขอการเข้าถึงข้อมูลระบุตัวตนจำนวนมากและต้องการให้กระบวนการเป็นไปโดยอัตโนมัติ

สรุป

แนวคิดหลักของ Amazon Simple Email Service (SES) และไลบรารี่ที่ Spring Cloud AWS เสนอเพื่อเชื่อมต่อกับบริการดังกล่าวมีอยู่ในบทความนี้ นอกจากนี้ เราได้สร้างแอปพลิเคชัน Spring Boot ด้วย REST API ที่สามารถส่งอีเมลผ่านโมดูล Spring Cloud AWS SES

ตอนนี้คุณควรมีความเข้าใจอย่างถ่องแท้ว่า Amazon Simple Email Service (SES) คืออะไร และจะใช้อย่างไรในการส่งอีเมล

ประทับเวลา:

เพิ่มเติมจาก สแต็ค