Я хочу отправить электронное письмо нескольким получателям.
я использовал персонализации, но все электронные письма появляются в поле «to», что нарушает их конфиденциальность.
Я не хочу использовать BCC, так как это часто приводит к ненужным результатам (например, http://www.standss.com/blog/index.php/why-you-should-avoid-using-bcc-for-emails/).
Поэтому мой вопрос заключается в том, как я могу отправить электронное письмо нескольким получателям, чтобы в поле «Кому» не отображались все электронные письма.
Единственная альтернатива, которую я вижу, — это отправлять отдельный запрос в API для каждого письма, используя цикл, который очень ресурсоемкий и занимает много времени, когда у меня много писем для отправки!
При использовании Персонализации SendGrid с несколькими группами получателей вам необходимо определить несколько объектов 1-го уровня в массиве Personalization.
Так что вместо:
{"personalizations": [
{"to": [
{"email": "[email protected]"},
{"email": "[email protected]"}
]}]}
что все будет общим To:
массив, который может видеть друг друга,
Ты хочешь:
{"personalizations": [
{"to": [{"email": "[email protected]"}]},
{"to": [{"email": "[email protected]"}]}
]}
На каждом уровне персонализации вы можете настроить контент, тему, теги подстановки и многое другое.
Таким образом, вы можете создать полную персонализацию и повторить эти 1000 раз. Получив 1000 получателей, объедините их в один вызов API и отправьте.
Чтобы построить @jacobmovingfwd, вот пример в Python, который отправляет одно и то же электронное письмо нескольким получателям с индивидуализированными полями «to». Я проверил код, и он работает для меня.
# Given a list of email addresses that are strings
sublist = [...]
mail = Mail()
for to_email in sublist:
# Create new instance for each email
personalization = Personalization()
# Add email addresses to personalization instance
personalization.add_to(Email(to_email))
# Add personalization instance to Mail object
mail.add_personalization(personalization)
# Add data that is common to all personalizations
mail.from_email = Email(from_email)
mail.subject = subject
mail.add_content(Content('text/plain', message_txt))
mail.add_content(Content('text/html', message_html))
# Send
sg = sendgrid.SendGridAPIClient(apikey=os.environ.get('SENDGRID_API_KEY'))
response = sg.client.mail.send.post(request_body=mail.get())
Вот версия C #, которая клонирует Personalization для каждого получателя для отправки по почте отдельно, но все же с помощью одного вызова API SendGrid:
public static void SendEachReceipient(SendGridMessage msg, IEnumerable<string> recipients)
{
if (msg == null || recipients == null || !recipients.Any())
return;
if (msg.Personalizations == null) //can easily be null if no substitutions have not been added
msg.Personalizations = new List<Personalization>();
var substitutionsCopy = msg.Personalizations.FirstOrDefault()?.Substitutions; //all substitutions (if any) are always all contained in the first personalization
msg.Personalizations.Clear(); //we will start fresh - one personalization per each receipient to keep emails private from each other
foreach (var email in recipients.Where(x => !string.IsNullOrEmpty(x)).Distinct())
{
var personalization = new Personalization();
personalization.Substitutions = substitutionsCopy;
personalization.Tos = new List<EmailAddress>() { new EmailAddress(email) };
msg.Personalizations.Add(personalization);
}
var result = new SendGridClient("api-key").SendEmailAsync(msg).Result;
}