1

似乎找不到太多关于如何附加作为 BLOB 作为电子邮件一部分存储的文件的信息。

我知道您可以将文件系统 (C:\temp...) 中的文件附加到正在 DBMAIL 或自定义存储过程中设置的电子邮件。但是,我还没有看到任何关于附加诸如 PDF 之类的内容的引用,这些内容作为二进制对象存储在表中。

我看到您可以在哪里将查询附加为文件,但我认为这不是我想要的。

我们将通过应用程序以编程方式执行此操作,但我们需要能够通过触发器或应用程序的服务器端代码来启动此 SP。

这是可能的还是我应该问其他问题,因为通常二进制对象还需要具有与之关联的内容类型,以便浏览器或邮件对象知道如何处理?

4

1 回答 1

1

解决方案不能附加存储在 db 字段中的二进制对象,您可以稍微更改架构存储二进制文件的路径。如果您可以在数据库服务器中启用 .net clr,您将有更多选择。

use master
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[usp_send_cdosysmail]')
and objectproperty(id, N'isprocedure') = 1)
drop procedure [dbo].[usp_send_cdosysmail]
go

create procedure usp_send_cdosysmail
@from varchar(500) ,
@to varchar(500) ,
@subject varchar(500),
@body nvarchar(max) ,
@smtpserver varchar(25),
@bodytype varchar(10) ,
@attachment varchar(100)= ' '
as
declare @imsg int
declare @hr int
declare @source varchar(255)
declare @description varchar(500)
declare @output varchar(1000)
exec @hr = sp_oacreate 'cdo.message', @imsg out
exec @hr = sp_oasetproperty @imsg,
'configuration.fields("http://schemas.microsoft.com/cdo/configuration/sendusing").value','2'

exec @hr = sp_oasetproperty @imsg, 'configuration.fields("http://schemas.microsoft.com/cdo/configuration/smtpserver").value', @smtpserver 

exec @hr = sp_oamethod @imsg, 'configuration.fields.update', null
exec @hr = sp_oasetproperty @imsg, 'to', @to
exec @hr = sp_oasetproperty @imsg, 'from', @from
exec @hr = sp_oasetproperty @imsg, 'subject', @subject

-- if you are using html e-mail, use 'htmlbody' instead of 'textbody'.

exec @hr = sp_oasetproperty @imsg, @bodytype, @body

-- Attachments...

IF @attachment IS NOT NULL AND LEN(@attachment) > 0 BEGIN
    Declare @files table(fileid int identity(1,1),[file] varchar(255))
    Declare @file varchar(255)
    Declare @filecount int ; set @filecount=0
    Declare @counter int ; set @counter = 1
    DECLARE @outVar INT
    SET @outVar  = NULL

        INSERT @files SELECT cValue FROM master..fn_split(@attachment,',')
        SELECT @filecount=@@ROWCOUNT

        WHILE @counter<(@filecount+1)
        BEGIN
                SELECT @file = [file] 
                FROM @files
                WHERE fileid=@counter

                EXEC @hr = sp_OAMethod @imsg, 'AddAttachment',@outVar OUT, @file

                SET @counter=@counter+1
        END
END

exec @hr = sp_oamethod @imsg, 'send', null

-- sample error handling.
if @hr <>0 
select @hr
begin
exec @hr = sp_oageterrorinfo null, @source out, @description out
if @hr = 0
begin
select @output = ' source: ' + @source
print @output
select @output = ' description: ' + @description
print @output
end
else
begin
print ' sp_oageterrorinfo failed.'
return
end
end
exec @hr = sp_oadestroy @imsg
go
set quoted_identifier off 
go
set ansi_nulls on 
go

sp_configure 'Ole Automation Procedures', 1
RECONFIGURE
GO
于 2010-06-22T20:19:14.723 回答