Мне нужно отправить электронное письмо всем моим подписчикам. В настоящее время я использую план общего хостинга, который предлагает базу данных SQL Server 2008.
Я действительно не хочу копировать все электронные письма в свой почтовый клиент (thunderbird) и не хочу создавать программу, которая будет захватывать все электронные письма из базы данных и отправлять их через smtp.net.
Я ищу бесплатное решение, в котором я мог бы просто указать путь к базе данных и столбец электронных писем, и это позволит мне написать тему и тело и позволить мне отправить его.
Ответ 1 · рейтинг 2 · Aaron Bertrand
Настройте почту базы данных с профилем, в котором информация об отправителе и ответе соответствует тому, что вы хотите, чтобы ваши получатели видели. Здесь вы можете увидеть один учебник: http://www.mssqltips.com/sqlservertip/1100/setting-up-database-mail-for-sql-2005/
В зависимости от того, хотите ли вы отправить одно и то же сообщение всем или персонализировать каждого, вы можете использовать цикл либо для создания фрагментов адресов в скрытую копию (вы не обязательно хотите отправлять всем получателей сразу) или создать индивидуальное тело/тему для каждого получателя.
Если у вас есть тело и получатель(и) в каждой итерации цикла, вы можете использовать msdb.dbo.sp_send_dbmail для отправки каждого сообщения.
ИЗМЕНИТЬ, добавив образец кода.
Настраивать:
USE tempdb;
GO
CREATE TABLE dbo.Emails(Email VARCHAR(320));
INSERT dbo.Emails VALUES('[email protected]'),('[email protected]'),('[email protected]');
Если вы хотите просто отправить одно и то же сообщение и предполагать, что список короткий, пакетная обработка или фрагментация будут другим вопросом:
DECLARE @bcc VARCHAR(MAX) = '';
SELECT @bcc += ';' + Email FROM dbo.Emails;
SET @bcc = STUFF(@bcc,1,1,'');
SELECT @bcc;
/*
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'profile name',
@recipients = 'your address',
@blind_copy_recipients = @bcc,
@body = N'body',
@subject = N'subject';
*/
-- Если вы хотите отправить отдельное сообщение каждому получателю, используйте курсор:
DECLARE @e VARCHAR(320);
DECLARE e CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR SELECT Email FROM dbo.Emails;
OPEN e;
FETCH NEXT FROM e INTO @e;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'Sending to ' + @e;
/*
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'profile name',
@recipients = @e,
@body = N'body',
@subject = N'subject';
*/
FETCH NEXT FROM e INTO @e;
END
CLOSE e;
DEALLOCATE e;
Очистка:
DROP TABLE dbo.Emails;
Наконец, если ваш список получателей большой, я предлагаю вам поискать другие альтернативы, которые лучше приспособлены для массовой рассылки.
Ответ 2 · Jonathan Wilson
В ASP.net есть класс клиента SMTP. Я уверен, что вы могли бы select просмотреть все адреса электронной почты из своей таблицы, а затем просмотреть их, вызывая метод SMTP Send() для каждого адреса.