NodeJS Sendgrid Issue in sending email to multiple recipients

前端 未结 5 1020
清酒与你
清酒与你 2020-12-21 03:31

I am having issue in sending mails to multiple recipients.

My script is

var SendGrid = require(\'sendgrid\').SendGrid;
var sendgrid = new SendGrid(\         


        
相关标签:
5条回答
  • 2020-12-21 04:07

    You may use an array of recipients in both the to and bcc fields.

    For example:

    var SendGrid = require('sendgrid').SendGrid;
    var sendgrid = new SendGrid('{{sendgrid username}}', '{{sendgrid password}}');      
    sendgrid.send({
        to: ['one@example.com', 'two@example.com'],
        from: 'nick@sendgrid.com',
        bcc: ['three@example.com', 'four@example.com'],
        subject: 'This is a demonstration of SendGrid sending email to mulitple recipients.',
        html: '<img src="http://3.bp.blogspot.com/-P6jNF5dU_UI/TTgpp3K4vSI/AAAAAAAAD2I/V4JC33e6sPM/s1600/happy2.jpg" style="width: 100%" />'
    });
    

    If this isn't working for you and Node isn't spitting out any errors, check to see if the emails are being sent, by logging into SendGrid's website and looking at the Email Activity Log.

    One thing I came across while testing your code sample is if you're sending the to and bcc to the same gmail address, gmail will combine it all into one email (so it appears it didn't work). Make sure when testing you're sending email to entirely different accounts.

    If you need some email accounts to test with Guerrilla Mail is an excellent option for creating temporary test accounts.

    0 讨论(0)
  • 2020-12-21 04:19

    The new sendgrid-nodejs update has scrapped previous implementation methods and therefore the accepted answer wont help you now.

    So... just an update in case anyone lands to this thread with specific search result.

        to: [
          {
            email: 'email1@email.com', 
          },
          {
            email: 'email2@email.com', 
          },
        ],
    
    0 讨论(0)
  • 2020-12-21 04:19

    A solution for TypeScript (written in ts version 3.4.3 and sendGrid 7.1.1) where you don't want recipients to be able to see each other.

    import * as sendGrid from '@sendgrid/mail'
    
    type UserEmail = {
      to: string
      subject: string
    }
    // Add as many recipients as you want
    recipients = ['email1@global.com', 'email2@gmail.com']
    const personalizations: UserEmail[] = recipients.map(admin => ({
        to: admin,
        subject: 'Inject Subject Here',
    }))
    
    try {
        await sendGrid.send({
            from, // Inject
            personalizations,
            html, // Inject
        })
    } catch (err) {
        console.log(err)    
    }
    

    const personalizations looks like this

    [{ to: 'email1@global.com',
        subject: 'Inject Subject Here' },
      { to: 'email2@global.com'',
        subject: 'Inject Subject Here' }]
    
    0 讨论(0)
  • 2020-12-21 04:20

    This is the solution that I ended up with and thought it was more straightforward and could be helpful for folks.

    Note the difference in the shape of the personalizations object.

    Recipients can see each other:

    
    const sgMail = require('@sendgrid/mail')
    sgMail.setApiKey(process.env.SENDGRID_API_KEY)
    
    // Declare the content we'll use for the email
    const FROM_EMAIL = 'example@example.io' // <-- Replace with your email
    const subject = 'Test Email Subject'
    const body = '<p>Hello HTML world!</p>'
    const recipients = ['alice@example.com', 'bob@example.com'] // <-- Add your email(s) here to test
    
    // Create the personalizations object that will be passed to our message object
    let personalizations = [{
        to: [],
        subject
    }]
    
    // Iterate over our recipients and add them to the personalizations object
    for (let index in recipients) {
        personalizations[0].to[index] = { email: recipients[index] }
    }
    
    const msg = {
        personalizations,
        from: FROM_EMAIL,
        html: body,
    }
    
    // Log to see what our message object looks like
    console.log(msg)
    
    // Send the email, if success log it, else log the error message
    sgMail.send(msg)
        .then(() => console.log('Mail sent successfully'))
        .catch(error => console.error(error.toString()))
    

    Personalizations Object:

    { personalizations: [{
            to: [
                {email: "alice@example.com"},
                {email: "bob@example.com"},
            ],
            subject: "Test Email Subject"
        }]
    }
    

    Recipients can not see each other:

    // Create the personalizations object that will be passed to our message object
    personalizations = []
    
    // Iterate over our recipients and add them to the personalizations object
    for (let index in recipients) {
        personalizations[index] = { to: recipients[index], subject}
    }
    

    Personalizations Object:

    { 
        personalizations: [
            {
                to:  "alice@example.com",
                subject: "Test Email Subject"
            }, 
            { 
                to:  "bob@example.com",
                subject: "Test Email Subject"
            }
        ]
    }
    

    I created a run kit with the full solution and where you can test it out.

    0 讨论(0)
  • 2020-12-21 04:22

    For Sendgrid's v3 API, I found their "kitchen sink" example helpful. Here is a relevant bit from it:

    var helper = require('sendgrid').mail
    
    mail = new helper.Mail()
    email = new helper.Email("test@example.com", "Example User")
    mail.setFrom(email)
    
    mail.setSubject("Hello World from the SendGrid Node.js Library")
    
    personalization = new helper.Personalization()
    email = new helper.Email("test1@example.com", "Example User")
    personalization.addTo(email)
    email = new helper.Email("test2@example.com", "Example User")
    personalization.addTo(email)
    
    // ...
    
    mail.addPersonalization(personalization)
    
    0 讨论(0)
提交回复
热议问题