2016-06-20 2 views
0

Я пытаюсь использовать SQL Server Management Studio Database Mail для отправки автоматических электронных писем в формате HTML. Он отлично работает, когда я даю ему текстовое тело, но как только я его сменю на HTML, сообщения пустые. Они по-прежнему отправляются с соответствующим предметом и всем остальным, но тела там нет.SQL Server Database Mail отправляет пустые сообщения, когда я даю ему тело HTML

Вот соответствующий фрагмент кода:

DECLARE @msg varchar(8000); --body of the message in html. 
DECLARE @recipient_emails varchar(50); --List of email addresses for everyone who needs to receive this message. 
DECLARE @subject_line varchar(100); --Subject line for the email. 
DECLARE @num_of_msgs int; --Since some updates need to trigger multiple different emails, this is used to determine how many emails will be sent. 
DECLARE @creator varchar(10); --Creator of the opportunity in CRM. 
DECLARE @account_id int; --Account number for customer. 
DECLARE @customer varchar(50); --Customer from whom the opportunity came. 
DECLARE @opty_type varchar(30); --Type of opportunity. 
DECLARE @opty_desc varchar(40); --Description of opportunity. 
DECLARE @date_created datetime; --Datetime when opportunity was created. 
DECLARE @notes varchar(500); --Notes about opportunity. 

SELECT 
@creator = CREATOR, 
@account_id = ACCT_ID, 
@opty_type = OPTY_TYPE_ID, 
@opty_desc = DESCRIPTION, 
@date_created = OPEN_DATE, 
@notes = COMMENTS 
FROM V_OPPORTUNITY 
WHERE ID = @opty_id; 

--Uses a CASE statement to determine recipient emails based on what activity has just been completed. 
SET @recipient_emails = 
CASE @description 
    WHEN 'Create Opportunity in CRM' THEN '[email protected]' 
    WHEN 'Request NDA' THEN 'Email 2' 
    WHEN 'Receive Formula' THEN 'Email 3' 
    WHEN 'Receive Product Specs-general lbl claim & pkg spec' THEN 'Email 4' 
    WHEN 'Issue Ballpark Quote' THEN 'Email 5' 
    WHEN 'Credit Check' THEN 'Email 6' 
    ELSE '' 
END; 

--Uses a CASE statement to determine HTML message based on what activity has just been completed. 
SET @msg = 
CASE @description 
    WHEN 'Create Opportunity in CRM' THEN '<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>DLI NEW CRM OPTY EMAIL</title> 
<style type="text/css"> 
body { 
    margin-left: 10px; 
    margin-top: 10px; 
    margin-right: 10px; 
    margin-bottom: 10px; 
    text-align: center; 
    background-color: #61FF51; 
} 
div#PAGECENTER { 
    width: 1000px; 
    margin-left: auto; 
    margin-right: auto 
} 

</style> 
</head> 

<body> 
<table width="100%" border="2" cellspacing="5" cellpadding="5"> 
    <tbody> 
    <tr> 
     <td colspan="4" align="center" valign="middle" style="font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace; font-weight: bold; font-size: 36px;"><p><!--<img src="/Images/DESLABLGtag3d.png" width="52" height="53" alt=""/>--><span style="font-size: 24px"> NEW OPTY CREATED IN CRM</span></p></td> 
    </tr> 
    <tr> 
     <td width="15%" height="40" align="right" valign="middle" style="font-weight: bold">CREATED BY</td> 
     <td width="35%" height="40" align="left" valign="middle" bgcolor="#E5E5E5" style="font-size: 16px; font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace;">'[email protected]+'</td> 
     <td width="15%" height="40" align="right" valign="middle" style="font-weight: bold">CUSTOMER</td> 
     <td width="35%" height="40" align="left" valign="middle" bgcolor="#E5E5E5" style="font-size: 16px; font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace;">SQL HERE</td> 
    </tr> 

    <tr> 
     <td width="15%" height="40" align="right" valign="middle" style="font-weight: bold">OPTY TYPE</td> 
     <td width="35%" height="40" align="left" valign="middle" bgcolor="#E5E5E5" style="font-size: 16px; font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace;">'[email protected]_type+'</td> 
     <td width="15%" height="40" align="right" valign="middle" style="font-weight: bold">DESCRIPTION</td> 
     <td width="35%" height="40" align="left" valign="middle" bgcolor="#E5E5E5" style="font-size: 16px; font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace;">'[email protected]_desc+'</td> 
    </tr> 
    <tr> 
     <td width="15%" height="40" align="right" valign="middle" style="font-weight: bold">DATE CREATED</td> 
     <td width="35%" height="40" align="left" valign="middle" bgcolor="#E5E5E5" style="font-size: 16px; font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace;">'+CAST(@date_created AS varchar(20))+'</span></td> 

    </tr> 
    <tr> 
     <td width="15%" height="40" align="right" valign="middle" style="font-weight: bold">NOTES</td> 
     <td height="40" colspan="3" align="left" valign="middle" bgcolor="#E5E5E5" style="font-family: Consolas, ''Andale Mono'', ''Lucida Console'', ''Lucida Sans Typewriter'', Monaco, ''Courier New'', monospace">'+ISNULL(@notes,'')+'</span></td> 
    </tr> 

    </tbody> 
</table> 
<div id="PAGECENTER"></div> 
</body> 
</html>' 

    WHEN 'Request NDA' THEN 'Msg 2' 
    WHEN 'Receive Formula' THEN 'Msg 3' 
    WHEN 'Receive Product Specs-general lbl claim & pkg spec' THEN 'Msg 4' 
    WHEN 'Issue Ballpark Quote' THEN 'Msg 5' 
    WHEN 'Credit Check' THEN 'Msg 6' 
    ELSE 'DEFAULT MSG' 
END; 

--Uses a CASE statement to determine subject line based on what activity has just been completed. 
SET @subject_line = 
CASE @description 
    WHEN 'Create Opportunity in CRM' THEN 'Subject 1' 
    WHEN 'Request NDA' THEN 'Subject 2' 
    WHEN 'Receive Formula' THEN 'Subject 3' 
    WHEN 'Receive Product Specs-general lbl claim & pkg spec' THEN 'Subject 4' 
    WHEN 'Issue Ballpark Quote' THEN 'Subject 5' 
    WHEN 'Credit Check' THEN 'Subject 6' 
    ELSE 'DEFAULT SUBJECT' 
END; 

--Uses a CASE statement to determine number of messages based on what activity has just been completed. 
SET @num_of_msgs = 
CASE @description 
    WHEN 'Create Opportunity in CRM' THEN 2 
    WHEN 'Request NDA' THEN 1 
    WHEN 'Receive Formula' THEN 1 
    WHEN 'Receive Product Specs-general lbl claim & pkg spec' THEN 1 
    WHEN 'Issue Ballpark Quote' THEN 1 
    WHEN 'Credit Check' THEN 1 
    ELSE 1 
END; 

--Sends an email. 
EXEC msdb.dbo.sp_send_dbmail @recipients = @recipient_emails, @body = @msg, @body_format = 'HTML', @subject = @subject_line, @profile_name = 'SQLProfile'; 

ПРИМЕЧАНИЯ: Единственный случай, я беспокоюсь о том, чтобы работать прямо сейчас является для «Создание возможностей в CRM. Кроме того, несколько переменных, используемых здесь, объявляются и/или устанавливаются ранее в коде, например @opty_id и @description.

+0

Если вы выберете @ msg перед отправкой вызова, вы увидите, чего вы ожидаете? –

+0

Я не уверен, что понимаю, что вы имеете в виду ... – 7Nate9

+0

Поместите 'else' во все инструкции' case', чтобы вы могли видеть, есть ли какие-либо совпадения. –

ответ

3

Это слишком длинный комментарий.

Наиболее вероятной причиной отказа является то, что нет соответствия с операциями case. У вас должно быть предложение else во всех операциях CASE, чтобы убедиться, что они обрабатываются так, как вы планируете.

очень близко второй является то, что один или несколько столбцов, используемых для построения @msg являются NULL. Это приведет к тому, что все значение будет NULL.

Например, если нет комментариев, то @Notes может быть NULL и вся @msg будет в конечном итоге NULL.

Вы должны добавить:

SELECT @creator, @account_id, @opty_type, @opty_desc, @date_created, @notes 

Чтобы быть уверенным, ни один из этих значений NULL.

Вы можете защитить от NULL значений, если @msg определяется с помощью COALESCE().

+0

Я не думал ни о одном из них. Кажется, я исправил их обоих. Я добавил ISNULL(), где я использую «@notes» в «@msg», но я все еще получаю пустые письма. Я также дважды проверял строку, из которой я выхожу, и ни один из значений, которые я использую, не имеет значения NULL. – 7Nate9

+0

Царапина, что. Я пропустил поле, которое, как я думал, не может принять NULL. Теперь работает. :) – 7Nate9

Смежные вопросы