SQL Server SP_SEND_DBMAIL Вложение файла изображения
Я использую триггер на столе для отправки электронной почты, используя sp_send_dbmail.
Я хочу включить в электронное письмо вложение типа изображения.
Необработанные данные для jpeg хранятся в столбце ndl_Image, который имеет тип двоичный.
У меня есть следующий код:-
DECLARE @ReferenceID varchar(max)
DECLARE @Recipient varchar(Max)
DECLARE @Body varchar(max)
DECLARE @Subject varchar(max)
DECLARE @Q varchar(max)
--Get the EntryId and FormID for the inserted data.
SET @ReferenceID = 40
SET @Recipient = (SELECT ndl_CategorySendTo FROM ndl_config WHERE ndl_CategoryName = 'Dead Animal')
SET @Body = '<html>A new request has been created.</html>'
SET @Subject = 'NDL Report It: New Request #'+@ReferenceID
SET @Q = 'SELECT ndl_Image from dbo.ndl_data where ndl_ID ='+@ReferenceID
--Execute the stored procedure to send mail.
EXEC msdb.dbo.sp_send_dbmail
--Pass it the following paramaters.
@recipients=@Recipient,
@body=@Body,
@subject=@Subject,
@profile_name='NDLProfile',
@body_format ='HTML',
@execute_query_database='NDL_MX',
@query = @Q,
@attach_query_result_as_file = 1,
@query_attachment_filename = 'image.jpg'
Это работает нормально, но, похоже, возвращает запрос в виде текстового файла, если я закомментирую последнюю строку.
Как я могу получить вложение в виде файла в формате JPEG????
Благодарю.
2 ответа
Я не думаю, что это возможно. Как указано в документации для SP_SEND_DBMAIL:
"Когда указан запрос, результирующий набор форматируется как встроенный текст. Двоичные данные в результате отправляются в шестнадцатеричном формате." [Выделение добавлено]
В приведенном ниже примере изображения будут вставлены в тег <img>, который будет работать с jpeg, png и т. Д. Он не решает PDF-файлы, но, по крайней мере, работает с изображениями.
CREATE TABLE [dbo].[EmailAttachment](
[EmailAttachmentID] [int] IDENTITY(1,1) NOT NULL,
[MassEmailID] [int] NULL, -- foreign key
[FileData] [varbinary](max) NOT NULL,
[FileName] [varchar](100) NOT NULL,
[MimeType] [varchar](100) NOT NULL )
-- ================================
declare @eRecipient nvarchar(max) = 'me@example.com';
declare @eSubject nvarchar(max) = 'Testing!';
declare @FileName nvarchar(2000);
declare @MimeType nvarchar(200);
declare @attachText nvarchar(max);
declare @eBody nvarchar(max) = '<html><head><style>table, th, td {border-collapse: collapse;border: 1px solid black;} img {width: 100%; max-width: 640px;}</style></head>' +
'<body><h1>Data with pics!</h1><table>' +
'<tr><th>Some text</th><th>Some Pics</th></tr>';
declare c1 cursor for
select FileName,
MimeType,
/* MimeType should be something like 'image/jpeg' or 'image/png' */
cast('' as xml).value('xs:base64Binary(sql:column("FileData"))', 'varchar(max)') attachText
/* the above uses XML commands to convert the binary attachment to UUencoded text */
from EmailAttachment
order by 1;
open c1;
fetch next from c1 into @FileName, @MimeType, @attachText
while @@FETCH_STATUS = 0
begin
set @eBody = @eBody + '<tr><td>Filename: ' + @FileName +
'</td><td><img src="data:' + @contentType + ';base64,' +
@AttachText + '="></td></tr>';
/* note that the img tag contents the encoded image data, the mime type, and that it ends in an = sign. */
fetch next from c1 into @FileName, @MimeType, @attachText
end;
close c1;
deallocate c1;
set @eBody = @eBody + '</table></body></html>';
exec msdb.dbo.sp_send_dbmail
@recipients = @eRecipient, @body = @eBody, @subject = @eSubject, @body_format='HTML'