Οδηγός για την απλή υπηρεσία ηλεκτρονικού ταχυδρομείου (AWS SES) με Spring Boot και Spring Cloud PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Οδηγός για την απλή υπηρεσία ηλεκτρονικού ταχυδρομείου (AWS SES) με Spring Boot και Spring Cloud

Εισαγωγή

AWS SES (Απλή υπηρεσία email) είναι μια απλή στην εγκατάσταση υπηρεσία αποστολής και λήψης email. Είναι συνήθως δύσκολο, επίπονο και κουραστικό να διαχειρίζεσαι ένα σύστημα ηλεκτρονικού ταχυδρομείου on-premise, επομένως η εξωτερική ανάθεση της διαδικασίας είναι μια δημοφιλής επιλογή.

Μπορούμε να χρησιμοποιήσουμε το Amazon SES για να στείλουμε μηνύματα ηλεκτρονικού ταχυδρομείου συναλλαγών, μηνύματα ηλεκτρονικού ταχυδρομείου μάρκετινγκ ή οποιοδήποτε άλλο είδος μηνυμάτων ηλεκτρονικού ταχυδρομείου ειδοποίησης στους πελάτες μας. Είναι μια οικονομικά προσιτή λύση για επιχειρήσεις όλων των μεγεθών που χρησιμοποιούν email για να συνδεθούν με τους πελάτες τους, καθώς βασίζεται στην αξιόπιστη και επεκτάσιμη υποδομή του Amazon Web Services (AWS).

Για την αποστολή μαζικών μηνυμάτων ηλεκτρονικού ταχυδρομείου, οποιαδήποτε εφαρμογή μπορεί να αλληλεπιδράσει με το Amazon SES. Πληρώνουμε μόνο για τα email που πραγματικά στέλνουμε, είτε πρόκειται για email συναλλαγών είτε για email μάρκετινγκ. Επιπλέον, μια σειρά από διαμορφώσεις, συμπεριλαμβανομένων αποκλειστικών, κοινόχρηστων ή ιδιόκτητων διευθύνσεων IP, υποστηρίζονται από το Amazon SES. Οι επιχειρήσεις μπορούν να κάνουν κάθε email να μετράει με τη χρήση πινάκων ελέγχου παραδοσιμότητας και αναφορών σχετικά με τις πληροφορίες αποστολέα.

Σε αυτόν τον οδηγό πρόκειται να διαμορφώσουμε μια παρουσία AWS SES σε μια περιοχή και στη συνέχεια να ενσωματώσουμε Spring Cloud για AWS που αποτελεί υποέργο του Άνοιξη σύννεφο. Θα δοκιμάσουμε διαφορετικά σενάρια για να στείλουμε email από την εφαρμογή μας.

Σημείωση: Μπορείτε να βρείτε όλο τον πηγαίο κώδικα που χρησιμοποιείται στον οδηγό στο Github.

Κύκλος ζωής αποστολής email με χρήση AWS SES

Ας δούμε πώς ο κύκλος ζωής ενός email που αποστέλλεται από μια εφαρμογή φτάνει στο γραμματοκιβώτιο προορισμού:

  • Μια εφαρμογή, στην περίπτωσή μας, ο κώδικας Spring Cloud ζητά από το AWS SES να στείλει ένα email σε έναν ή περισσότερους παραλήπτες.

  • Το SES αρχικά επαληθεύει το αίτημα και, εάν εγκριθεί, παράγει ένα μήνυμα ηλεκτρονικού ταχυδρομείου με τις προδιαγραφές του αιτήματος. Αυτό το μήνυμα ηλεκτρονικού ταχυδρομείου έχει κεφαλίδα, σώμα και φάκελο και συμμορφώνεται με RFC 5322Ορισμός της μορφής μηνυμάτων Διαδικτύου.

  • Στη συνέχεια, το SES μεταδίδει το μήνυμα στον δέκτη του παραλήπτη μέσω του Διαδικτύου. Μόλις το μήνυμα παραδοθεί στο SES, συχνά μεταδίδεται αμέσως, με την αρχική προσπάθεια παράδοσης να πραγματοποιείται συνήθως σε λίγα χιλιοστά του δευτερολέπτου.

  • Υπάρχουν αρκετά αποτελέσματα αυτή τη στιγμή. Για παράδειγμα:

    • Επιτυχής Παράδοση: Ο πάροχος υπηρεσιών Διαδικτύου (ISP) αποδέχεται το email και το στέλνει στον προοριζόμενο παραλήπτη.
    • Σκληρή αναπήδηση: Επειδή η διεύθυνση του παραλήπτη δεν είναι έγκυρη, ο ISP απορρίπτει το email. Ο ISP στέλνει την ειδοποίηση σκληρής εγκατάλειψης πίσω στο Amazon SES, το οποίο ειδοποιεί τον αποστολέα μέσω email ή δημοσιεύοντάς το σε ένα θέμα Amazon Simple Notification Service (Amazon SNS) που έχει ρυθμιστεί για τη λήψη αυτής της ειδοποίησης.
    • Μαλακή αναπήδηση: Λόγω συνθηκών όπως τα εισερχόμενα του παραλήπτη είναι γεμάτα, ο τομέας δεν υπάρχει ή οποιαδήποτε περίσταση παρέλευσης όπως ο ISP είναι πολύ απασχολημένος για να επεξεργαστεί το αίτημα, ο ISP ενδέχεται να μην μπορεί να παραδώσει το email στον παραλήπτη. Στη συνέχεια, ο πάροχος υπηρεσιών διαδικτύου επαναλαμβάνει το μήνυμα ηλεκτρονικού ταχυδρομείου έως και έναν ορισμένο αριθμό φορές και στέλνει στον SES ένα μαλακό μήνυμα αναπήδησης. Εάν η SES δεν μπορεί να παραδώσει το μήνυμα ηλεκτρονικού ταχυδρομείου εντός του καθορισμένου χρονικού πλαισίου, είτε δημοσιεύει το συμβάν σε ένα θέμα SNS είτε στέλνει ένα σκληρό μήνυμα αναπήδησης μέσω email.
    • Καταγγελία: Το email ταξινομείται ως ανεπιθύμητο από τον παραλήπτη στο πρόγραμμα email του. Μια ειδοποίηση καταγγελίας αποστέλλεται στο Amazon SES, το οποίο στη συνέχεια τη μεταδίδει στον αποστολέα εάν το Amazon SES και ο ISP έχουν δημιουργήσει έναν βρόχο ανατροφοδότησης.
    • Αυτόματη απάντηση: Ο ISP του παραλήπτη ειδοποιεί την Amazon SES για μια αυτοματοποιημένη απάντηση από τον παραλήπτη, όπως μια ειδοποίηση εκτός γραφείου, και η Amazon SES διαβιβάζει την ειδοποίηση στον αποστολέα.

Όταν η παράδοση δεν είναι επιτυχής, το Amazon SES επιστρέφει ένα σφάλμα στον αποστολέα και διαγράφει το email.

Ρύθμιση Amazon SES

Σε αντίθεση με οποιεσδήποτε άλλες υπηρεσίες AWS, πρακτικά δεν χρειάζεται να δημιουργήσετε μια παρουσία SES, καθώς όλοι οι νέοι λογαριασμοί AWS τοποθετούνται στο sandbox AWS SES από προεπιλογή. Κάθε λογαριασμός AWS έχει πρόσβαση στο sandbox για AWS SES στις διαθέσιμες περιοχές από προεπιλογή.

Όταν χρησιμοποιούμε τη λειτουργία sandbox, μπορούμε να στείλουμε email μόνο σε επαληθευμένες ταυτότητες. Ένας τομέας ή μια διεύθυνση email που χρησιμοποιούμε για να στείλουμε ένα email είναι μια επαληθευμένη ταυτότητα. Πρέπει να κατασκευάσουμε και να επικυρώσουμε κάθε ταυτότητα που σκοπεύουμε να χρησιμοποιήσουμε ως α From, To, Source, Sender, ή Return-Path διεύθυνση πριν μπορέσουμε να στείλουμε ένα email χρησιμοποιώντας SES σε λειτουργία sandbox. Χρησιμοποιώντας το Amazon SES για την επαλήθευση της ταυτότητας, μπορούμε να αποδείξουμε την ιδιοκτησία μας και να σταματήσουμε την παράνομη χρήση.

Για την αποφυγή απάτης και τη διατήρηση της φήμης μιας διεύθυνσης IP, το AWS SES περιλαμβάνει όρια αποστολής email. Αυτοί οι περιορισμοί καθορίζουν τον μέγιστο αριθμό email ανά δευτερόλεπτο και το ημερήσιο όριο email για κάθε χρήστη. Ερχόμενοι σε επαφή με το Κέντρο Υποστήριξης AWS, ενδέχεται να καθορίσουμε τέτοιες ποσοστώσεις ανά περιοχή.

Ας επαληθεύσουμε τις ταυτότητες. Συνδεθείτε στην Κονσόλα AWS και αναζητήστε "Απλή υπηρεσία email της Amazon"

Εισαγωγή SES

Στη συνέχεια, κάντε κλικ στο "Δημιουργία Ταυτότητας” για να προσθέσετε ένα email ή έναν τομέα για επαλήθευση. Στην περίπτωσή μας, πρόκειται να προσθέσουμε ένα email για επαλήθευση.

Δημιουργία Ταυτότητας

Μόλις δημιουργηθεί η ταυτότητα, μπορούμε να επαληθεύσουμε τις λεπτομέρειες.

Δημιουργημένη Ταυτότητα

Η ταυτότητα που δημιουργήσαμε εμπίπτει στο "Η επαλήθευση εκκρεμεί” στάδιο. Σε αυτό το στάδιο, ο χρήστης πρέπει να ελέγξει την αλληλογραφία επαλήθευσης από το AWS και να ακολουθήσει τις οδηγίες για την επαλήθευση του email.

Επαληθευμένη ταυτότητα

Στη συνέχεια, πρέπει να φέρουμε "κλειδί πρόσβασης"Και"μυστικό κλειδί” για τον έλεγχο ταυτότητας και την εξουσιοδότηση της εφαρμογής μας με SES. Για να το δημιουργήσουμε, πρέπει να δημιουργήσουμε μια Ομάδα χρηστών και να προσθέσουμε έναν Χρήστη σε αυτήν την ομάδα. Όταν δημιουργούμε αυτόν τον Χρήστη, το AWS δημιουργεί ένα κλειδί πρόσβασης και ένα μυστικό κλειδί. Ας ανακατευθυνθούμε λοιπόν στο "IAM” στην Κονσόλα AWS και δημιουργήστε Ομάδα χρηστών.

Δημιουργία ομάδας χρηστών

Τότε πρέπει να προσθέσουμε "Πρόσβαση διαχειριστή” άδεια σε αυτήν την ομάδα για SES.

Προσθήκη άδειας

Τέλος, θα προσθέσουμε έναν Χρήστη στην παραπάνω ομάδα.

Πρόσθεσε χρήστη

Στη συνέχεια, πρέπει να επιλέξουμε την ομάδα για δικαιώματα.

Προσθήκη ομάδας

Τέλος, αντιγράψτε το κλειδί πρόσβασης και το μυστικό κλειδί που εμφανίζονται στην οθόνη για περαιτέρω χρήση.

Αποστολή email χρησιμοποιώντας το Spring Cloud Project

Ρύθμιση έργου

Ας δημιουργήσουμε ένα έργο Spring Cloud και ας διερευνήσουμε τις περιπτώσεις χρήσης για να ενσωματωθούμε με το SES. Ο ευκολότερος τρόπος για να ξεκινήσετε με ένα σκελετό έργο είναι μέσω Spring Initializr:

Spring Initializr

Έχουμε προσθέσει Ανοιξιάτικος Ιστός για REST MVC, Apache Freemarker για τη δημιουργία προτύπων email που βασίζονται σε HTML, Αποστολέας αλληλογραφίας Java για να στείλετε ένα email και Λομπόκ (προαιρετική βιβλιοθήκη μείωσης λέβητα) εξαρτήσεις. Επιπλέον, πρέπει να προσθέσουμε σχετικές εξαρτήσεις για το Spring Cloud AWS και το SES. Για το Spring Cloud AWS, θα προσθέσουμε ένα ξεχωριστό Spring Cloud AWS BOM στο δικό μας pom.xml αρχείο χρησιμοποιώντας αυτό block:

<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 για την αποστολή email. Το Java Mail API δεν απαιτείται για αυτήν την υλοποίηση. Μπορεί να χρησιμοποιηθεί για την αποστολή απλών μηνυμάτων αλληλογραφίας χωρίς συνημμένα.
  • Η SimpleEmailServiceJavaMailSender class επιτρέπει την αποστολή email που περιέχουν συνημμένα και άλλα στοιχεία μιμικής.

Αυτό λοιπόν καλύπτει όλες τις βασικές μας απαιτήσεις!

Διαμόρφωση φασολιών

Όπως αναφέρθηκε παραπάνω, πρέπει να ορίσουμε δύο τύπους φασολιών: SimpleEmailServiceMailSender και SimpleEmailServiceJavaMailSender. Μπορούμε απλά να περάσουμε το κλειδί πρόσβασης και το μυστικό κλειδί ως διαπιστευτήρια και να διαμορφώσουμε το α MailSender bean που θα χρησιμοποιήσουμε για να στείλουμε email:

@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);
    }
}

Για να στείλουμε email με συνημμένα πρέπει να διαμορφώσουμε το SimpleEmailServiceJavaMailSender που αποτελεί υλοποίηση του JavaMailSender διεπαφή από την αφαίρεση αλληλογραφίας του Spring.

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Θα ορίσουμε επίσης τις ιδιότητες από τις οποίες θα ανακτήσουμε τις πληροφορίες application.yml:

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

Αποστολή απλού email

Μπορούμε να στείλουμε απλά email χρησιμοποιώντας το SimpleEmailServiceMailSender φασόλι που διαμορφώσαμε παραπάνω. Ας ορίσουμε ένα επίπεδο υπηρεσίας για να χρησιμοποιήσουμε αυτό το φασόλι:

@Service
public class EmailService {

    @Autowired
    private MailSender mailSender;

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

Καλούμε το send() μέθοδος στο MailSender φασόλι για να στείλουμε το email μας. Πρέπει επίσης να περάσουμε το SimpleMailMessage που θα περιέχει χαρακτηριστικά όπως from, to, το κείμενο και το θέμα για το email μας. Λοιπόν, ας ορίσουμε το α 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";
    }
}

Τώρα, εάν τρέξουμε την εφαρμογή και εκτελέσουμε την ακόλουθη μπούκλα, θα στείλουμε ένα email στην επαληθευμένη διεύθυνση email:

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'

Στη συνέχεια, μπορούμε να συνδεθούμε στη διεύθυνση αλληλογραφίας του παραλήπτη και να επαληθεύσουμε εάν ο παραλήπτης έχει λάβει το email.

Αποστολή απλού email με συνημμένο

Θα ορίσουμε ένα επίπεδο υπηρεσίας για να μεταβιβάσουμε το συνημμένο ως mime και θα ορίσουμε τα άλλα χαρακτηριστικά email όπως 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 για να δημιουργήσετε ένα email με συνημμένο. Τέλος, θα ορίσουμε 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";
    }
}

Τώρα, εάν τρέξουμε την εφαρμογή και εκτελέσουμε την ακόλουθη μπούκλα, θα στείλουμε ένα email στην επαληθευμένη διεύθυνση email:

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'

Στη συνέχεια, μπορούμε να συνδεθούμε στη διεύθυνση αλληλογραφίας του παραλήπτη και να επαληθεύσουμε εάν ο παραλήπτης έχει λάβει το email.

Αποστολή προτύπου email με συνημμένο

Οι προηγούμενες περιπτώσεις χρήσης που είχαμε δει είναι καλές για σενάρια ανάπτυξης ή δοκιμών, αλλά στην παραγωγή, γενικά χρησιμοποιούμε ένα πρότυπο email με μεταβλητές που θα αντικατασταθούν χρησιμοποιώντας τις απαντήσεις ενός API. Είχαμε προσθέσει νωρίτερα την εξάρτηση για Apache Freemarker. Θα το χρησιμοποιήσουμε για να ορίσουμε ένα πρότυπο και να το φορτώσουμε για επεξεργασία!

Για αυτό, ας ορίσουμε πρώτα ένα απλό πρότυπο, ονομάστε το ως 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>

Στη συνέχεια, πρέπει να ορίσουμε μια κλάση διαμόρφωσης για να φορτώσει το πρότυπο από τη διαδρομή και να προσθέσει ως φασόλι. Για αυτό, θα ορίσουμε 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());
        }
    }

Τέλος, θα ορίσουμε α Controller επίπεδο για να μεταβιβάσετε τα δυναμικά χαρακτηριστικά email:

@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";
    }
}

Τώρα, εάν τρέξουμε την εφαρμογή και εκτελέσουμε την ακόλουθη μπούκλα, θα στείλουμε ένα email στην επαληθευμένη διεύθυνση email:

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'

Στη συνέχεια, μπορούμε να συνδεθούμε στη διεύθυνση αλληλογραφίας του παραλήπτη και να επαληθεύσουμε εάν ο παραλήπτης έχει λάβει το email:

Email προτύπου Freemarker

Αποστολή εξατομικευμένου email με χρήση προτύπων στο AWS SES

Στην προηγούμενη περίπτωση χρήσης χρησιμοποιήσαμε ένα στατικό πρότυπο για την αποστολή email. Πώς μπορούμε να επιτρέψουμε τη δυναμική σχεδίαση προτύπων για διαφορετικούς σκοπούς και διαφορετικούς τύπους παραληπτών; Το AWS SES μας επιτρέπει να δημιουργούμε πρότυπα email για να στέλνουμε εξατομικευμένα μηνύματα ηλεκτρονικού ταχυδρομείου σε έναν ή περισσότερους προορισμούς με μία μόνο λειτουργία.

Μπορούμε να δημιουργήσουμε έως και 10,000 πρότυπα email ανά λογαριασμό Amazon SES. Κάθε πρότυπο μπορεί να έχει μέγεθος έως 500 KB, συμπεριλαμβανομένων τόσο του κειμένου όσο και των τμημάτων HTML. Μπορούμε να στείλουμε έως και 50 προορισμούς σε κάθε κλήση.

Ας δημιουργήσουμε λοιπόν γρήγορα ένα πρότυπο email. Αρχικά, μπορούμε να ορίσουμε ένα αρχείο 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." } }

Αυτό το πρότυπο περιέχει τα ακόλουθα χαρακτηριστικά:

  • Όνομα προτύπου: Περιέχει το όνομα του προτύπου.
  • Θέμα Μέρος: Αυτό περιέχει τη γραμμή θέματος του email. Σε αυτό το στοιχείο ενδέχεται να υπάρχουν ετικέτες αντικατάστασης. Αυτές οι ετικέτες μορφοποιούνται ως εξής: {{tagname}}. Μπορείτε να εισαγάγετε μια τιμή για {{tagname}} για κάθε προορισμό κατά την αποστολή του email.
  • HtmlPart: Περιέχει το σώμα HTML του email και μπορεί επίσης να περιέχει ετικέτες αντικατάστασης.
  • TextPart: Αυτό αντιπροσωπεύει το σώμα κειμένου του email. Αυτή η έκδοση του μηνύματος ηλεκτρονικού ταχυδρομείου αποστέλλεται σε παραλήπτες των οποίων οι πελάτες ηλεκτρονικού ταχυδρομείου δεν βλέπουν μηνύματα ηλεκτρονικού ταχυδρομείου HTML. Σε αυτό το στοιχείο ενδέχεται να υπάρχουν ετικέτες αντικατάστασης.

Μπορούμε να αποθηκεύσουμε αυτό το αρχείο ως mytemplate.json. Τέλος, μπορούμε να χρησιμοποιήσουμε μια εντολή AWS CLI για να δημιουργήσουμε το πρότυπο ως εξής:

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

Στη συνέχεια, ας ορίσουμε ένα επίπεδο υπηρεσίας για να ορίσουμε χαρακτηριστικά και να στείλουμε πρότυπα email:

@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 διεπαφή για να στείλετε αυτό το πρότυπο email. Πρέπει επίσης να περάσουμε τις ετικέτες αντικατάστασης που θα αντικατασταθούν στο κείμενο HTML του προτύπου μας που δημιουργήσαμε νωρίτερα.

Τέλος, θα ορίσουμε α 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 για να στείλετε πρότυπα email:

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'

Τώρα ο παραλήπτης μπορεί επιτέλους να δει ένα πρότυπο email:

Πρότυπο email

Ζητήστε πρόσβαση στην παραγωγή

Τέλος, για να στείλουμε email σε οποιονδήποτε παραλήπτη, ανεξάρτητα από το αν η διεύθυνση ή ο τομέας του παραλήπτη είναι επικυρωμένη, πρέπει τελικά να βγάλουμε τον λογαριασμό μας από το sandbox. Όλες μας οι ταυτότητες, συμπεριλαμβανομένων From, Source, Sender, να Return-Path διευθύνσεις, πρέπει ακόμα να επαληθευτούν. Μπορούμε να υποβάλουμε αίτημα για πρόσβαση στην παραγωγή από το "Πίνακας ελέγχου λογαριασμού» σελίδα ως εξής:

Πίνακας ελέγχου λογαριασμού
Ζητήστε πρόσβαση στην παραγωγή

Μπορούμε να υποβάλουμε το αίτημα συμπληρώνοντας όλα τα παραπάνω στοιχεία από την Κονσόλα AWS. Το ίδιο μπορεί επίσης να υποβληθεί χρησιμοποιώντας το AWS CLI. Αυτό θα ήταν χρήσιμο όταν πρέπει να ζητήσουμε πρόσβαση για μεγάλο αριθμό ταυτοτήτων και θα θέλαμε να αυτοματοποιήσουμε τη διαδικασία.

Συμπέρασμα

Οι βασικές ιδέες του Amazon Simple Email Service (SES) και των βιβλιοθηκών που προσφέρονται από το Spring Cloud AWS για διασύνδεση με αυτό καλύφθηκαν σε αυτό το άρθρο. Επιπλέον, δημιουργήσαμε μια εφαρμογή Spring Boot με REST API που μπορεί να στείλει email μέσω της ενότητας Spring Cloud AWS SES.

Θα πρέπει τώρα να κατανοήσετε καλά τι είναι η Amazon Simple Email Service (SES) και πώς να τη χρησιμοποιήσετε για την αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse