Abhi1 Kanobi Ответов: 1

Отправка изображений с помощью хранимых процедур по электронной почте


У меня есть хранимая процедура, которая используется для отправки писем списку людей .

Я сохранил изображение в varbinary (max) в своей базе данных в imagetable .

Я не могу отправить электронное письмо вместе с изображениями в теле .

Кто-нибудь может пожалуйста помочь ?

Что я уже пробовал:

попробовал добавить изображение в body like ..

в '<а href="someurl/информационный бюллетень.aspx-файл/?идентификатор=' + литые(@ID, как тип varchar(20))+"+литой(@образ как varchar(МАКС))+"+"в'>Пожалуйста, нажмите здесь, чтобы заполнить недостающие детали';


Курсоры следующие..

Начать
-- Объявите Переменную, Чтобы Сохранить Адрес Электронной Почты Восстановленным
Объявить @Email varchar(255)
Объявить @Name varchar(255)
Объявить @ID int
Объявите @theimage varbinary(max)


-- Объявить курсор для циклического перебора табличных данных
Объявить курсор EmailCursor для
Выберите ID, адрес электронной почты,имя из демо-почты

-- Открыть курсор для выборки данных в переменной электронной почты
откройте EmailCursor
Принести следующий из EmailCursor в @ИД@электронной почты@имя
while (@@FETCH_STATUS = 0)
Начать
Объявить @out_desc varchar(1000),
@out_mesg varchar (10)

1 Ответов

Рейтинг:
12

Kornfeld Eliyahu Peter

SQL имеет системную хранимую процедуру, называемую процедура sp_send_dbmail[^]. Одним из параметров является @вложенный файл...

Цитата:
[ @вложенный файл= ] 'file_attachments'
Это разделенный точкой с запятой список имен файлов, которые нужно прикрепить к сообщению электронной почты. Файлы в списке должны быть указаны как абсолютные пути. Список вложений имеет тип nvarchar (max). По умолчанию Почта базы данных ограничивает количество вложений файлов 1 Мб на файл.


Abhi1 Kanobi

Спасибо, но я использую отдельную хранимую процедуру , а не ту, что дает sql server .
Как это можно сделать в моем случае?

Спасибо

Kornfeld Eliyahu Peter

Какой ИП вы используете?

Abhi1 Kanobi

Я создал отдельный SP для того же самого .

Изменить процедуру [dbo].[sp_send_mail]
@from varchar(500) ,
@to varchar(500) ,
@subject varchar(500),
@body varchar(4000) ,
@bodytype varchar (10),
@output_mesg varchar (10) вывод,
@output_desc varchar (1000) вывод
АС
Объявить @оказывает инт
Объявить @hr int
Объявить @source varchar(255)
DECLARE @description varchar(500)

EXEC @hr = sp_oacreate 'cdo. message', @imsg out


EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/sendusing"). значение', '2'

-От SMTP сервера
EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/smtpserver"). ценность',
'------'

--Имя пользователя SMTP
EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/sendusername"). ценность',
'----'

-- Пароль Gmail
EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/sendpassword"). ценность',
'----'


EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/smtpusessl"). ценность',
'---'

EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/smtpserverport"). ценность',
'465'

EXEC @hr = sp_oasetproperty @imsg,
- конфигурация.поля("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"). ценность',
"1"

EXEC @hr = sp_oamethod @imsg, ' конфигурация.поля.обновление', нуль
Метод exec @ч = sp_oasetproperty @оказывает, 'в', @к
Метод exec @ч = sp_oasetproperty @оказывает, 'С', @от
Метод exec @ч = sp_oasetproperty @оказывает, 'тема', @темы



EXEC @hr = sp_oasetproperty @imsg, @bodytype, @body
Метод exec @ч = процедуру sp_oamethod @оказывает, 'отправить', нуль

SET @output_mesg = 'успех'


Если @hr <> 0
Выберите @hr
НАЧАТЬ
Метод exec @ч = процедура sp_oageterrorinfo значение null, @источник, @Описание из
Если @hr = 0
НАЧАТЬ

set @output_desc = @описание
КОНЕЦ
ЕЩЁ
НАЧАТЬ
Набор @output_desc = 'вызов sp_oageterrorinfo искусству'
КОНЕЦ
Если нет, то @output_desc равен NULL
Ошибкой @output_mesg=''
КОНЕЦ
EXEC @hr = sp_oadestroy @imsg

Kornfeld Eliyahu Peter

И есть какая-то конкретная причина, по которой вы написали это чудовище?
В любом случае-нет никаких признаков того, что вы устанавливаете свойство "вложения" в любом месте... так что же у вас есть, кроме?

Abhi1 Kanobi

Я выложил этого монстра просто для ясности .. :)


Я пытался реализовать его таким образом, но безуспешно .
SET @IMAGEFILE = 'test.jpg'
SET @IMAGEPATH = 'C:\Users\----\Desktop\test.jpg'


-- Объявить курсор для циклического перебора табличных данных
Объявить курсор EmailCursor для
Выберите ID, адрес электронной почты,имя из демо-почты

-- Открыть курсор для выборки данных в переменной электронной почты
откройте EmailCursor
Принести следующий из EmailCursor в @ИД@электронной почты@имя
while (@@FETCH_STATUS = 0)
Начать
Объявить @out_desc varchar(1000),
@out_mesg varchar (10)

Объявить @body varchar (max) =
--'< a href="http://newsletter.qendidate.com/?id= ' + CAST(@ID As varchar(20))+" '& gt; пожалуйста, нажмите здесь, чтобы заполнить недостающие данные';
--'< a href="someurl.com/?id=1" > пожалуйста, нажмите здесь, чтобы заполнить недостающие данные';
'< img src= "cid:' +@IMAGEFILE+' ""width=" 235 "height=" 70 "border=" 0 "alt= " no image"> & lt;a href= " someurl. aspx/? id=' + CAST(@ID As varchar(20))+" 'Пожалуйста, нажмите здесь, чтобы заполнить недостающие данные';

Kornfeld Eliyahu Peter

Поскольку вы создаете объект CDO.Message, было бы разумно прочитать документацию и установить соответствующие свойства для вложений, а не заново изобретать wheal (который в вашем случае больше похож на квадрат)...
(Подсказка - ваш файл находится на серверах C:, но у получателя нет файла на его C:, но все равно src из img будет указывать на C:)

Abhi1 Kanobi

может ли путь к изображению быть каким-то url-адресом, и передача того же самого будет работать ?

Kornfeld Eliyahu Peter

Если к вашему изображению можно получить доступ по URL-адресу (я бы рассматривал его как большую дыру в безопасности), то да - это будет работать именно так...

Abhi1 Kanobi

Да, вы правы . путь не должен быть пройден .
Каким должен быть правильный путь?

Kornfeld Eliyahu Peter

По-настоящему правильный способ-использовать сборку SQL в sp_send_dbmail... Однако если вам нужно придерживаться CDO, то прочтите документацию и используйте 'sp_oasetproperty' в свойстве Attachments...

Abhi1 Kanobi

Хорошо , но будет ли он прикреплять файл или вставлять его в тело ,
Мне нужно, чтобы он был встроен в тело

Kornfeld Eliyahu Peter

Прикрепить-также ваше решение не будет встраивать изображение... Для этого вам нужно превратить его в строку base64 и добавить ее в качестве источника изображения...

Abhi1 Kanobi

Ладно, я пытаюсь