Почта базы данных SQL Server отправляет пустые сообщения, когда я даю ему тело HTML

Я пытаюсь использовать почту базы данных SQL Server Management Studio для отправки автоматических электронных писем в формате HTML. Он отлично работает, когда я даю ему простое текстовое тело, но как только я изменяю его на 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;">'+@creator+'</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;">'+@opty_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;">'+@opty_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.


person noandpickles    schedule 20.06.2016    source источник
comment
Если вы select @msg перед отправкой вызова, вы видите, что вы ожидаете?   -  person Alex K.    schedule 20.06.2016
comment
Я не уверен, что понимаю, что вы имеете в виду...   -  person noandpickles    schedule 20.06.2016
comment
Поместите else во все операторы case, чтобы вы могли видеть, есть ли совпадения.   -  person Gordon Linoff    schedule 20.06.2016
comment
@ Гордон Спасибо. Но все равно ничего.   -  person noandpickles    schedule 20.06.2016
comment
Как сказал Гордон, нулевое значение в переменной может привести к пустому электронному письму. Я использовал ISNULL(@variable, ' ') для решения проблемы.   -  person Aloha480    schedule 14.03.2019


Ответы (1)


Это слишком долго для комментария.

Наиболее вероятной причиной сбоя является отсутствие соответствия выражениям 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().

person Gordon Linoff    schedule 20.06.2016
comment
Я не думал ни о том, ни о другом. Я думаю, что исправил их обоих сейчас. Я добавил ISNULL(), где я использую @notes в @msg, но я все еще получаю пустые электронные письма. Я также дважды проверил строку, из которой я извлекаю, и ни одно из значений, которые я использую, не является NULL. - person noandpickles; 20.06.2016
comment
Сотрите это. Я пропустил поле, которое, как я думал, не может принимать значение NULL. Теперь работает. :) - person noandpickles; 20.06.2016
comment
Спасибо, сэр. Вторая проблема была моей проблемой - person drzounds; 16.03.2020