2010-08-18 10 views
11

Tôi có một thủ tục SQL Server 2008 gửi email qua sp_send_dbmail.Làm cách nào để gửi email văn bản thuần túy (có ngắt dòng) bằng sp_send_dbmail?

Tôi đang sử dụng đoạn mã sau:

set @bodyText = (select 
         N'Here is one line of text ' + 
         N'It would be nice to have this on a 2nd line ' + 
         N'Below is some data: ' + 
         N' ' + 
         N' ' + 
         field1 + 
         N' ' + 
         field2 + 
         N' ' + 
         N'This is the last line' 
        from myTable) 

    EXEC msdb.dbo.sp_send_dbmail 
     @profile_name = 'myProfile', 
     @recipients = @to, 
     @body = @bodyText, 
     @body_format = 'TEXT', 
     @subject = 'Testing Email' ; 

myProfile tôi được thiết lập để sử dụng máy chủ smtp địa phương, mà kết quả trong một file .eml trong c: \ inetpub \ mailroot \ đợi

Khi tôi mở một trong các tệp .eml đó (ug - thứ duy nhất có thể mở chúng là triển vọng, nhìn vào chúng trong bất cứ thứ gì khác chỉ hiển thị phần thân dưới dạng blob được mã hóa base64). Có vẻ như nó hiển thị kết quả dưới dạng HTML - vì vậy, tôi không chắc liệu sự cố có xảy ra với khách hàng hay không hoặc

I đã thử đặt \ n vào tin nhắn, nhưng điều đó không hiệu quả. Làm cách nào để gửi văn bản thuần túy có ngắt dòng và xác minh rằng kết quả cuối cùng có vẻ chính xác?

BTW, tôi thực sự không thể gửi email để kiểm tra nó với các ứng dụng email thực - corp. mạng bị khóa.

+0

có bất kỳ câu trả lời nào trong số này giải quyết được sự cố của bạn không? –

+0

@KM - vâng. Tôi đang cố gắng quyết định nên chấp nhận điều gì - bạn thanh lịch hơn và đọc tốt hơn, nhưng Martins cũng hoạt động. – chris

Trả lời

7

Bạn hiện không thực sự chèn bất kỳ ngắt dòng nào. Bạn có thể nhúng chúng trực tiếp vào một chuỗi chữ trong SQL Server như dưới đây.

SET @bodyText = (SELECT N'Here is one line of text 
It would be nice to have this on a 2nd line 
Below is some data: 


' + field1 + N' 

' + field2 + N' 

' + N'This is the last line' 
       FROM myTable); 

Hoặc một cách tiếp cận ngăn nắp có thể

DECLARE @Template NVARCHAR(max) = 
N'Here is one line of text 
It would be nice to have this on a 2nd line 
Below is some data: 

##field1## 

##field2## 

This is the last line'; 

SET @bodyText = (SELECT REPLACE(
        REPLACE(@Template, 
         '##field1##', field1), 
         '##field2##', field2) 
       FROM myTable); 

Cả hai sẽ nâng cao một lỗi nếu myTable chứa nhiều hơn một hàng như bạn đang giao kết quả cho một biến vô hướng.

+0

Đáng ngạc nhiên là nó! Trong thực tế, tôi có thể đặt toàn bộ khối thành một cặp dấu ngoặc kép. – chris

+0

thực sự làm cho mã trông thật sôi nổi, tôi đã từng làm theo cách đó. tuy nhiên, tôi thấy 'CHAR (13) + CHAR (10)' hoạt động tốt hơn với các truy vấn thụt lề và mã khác. –

+0

Có nó không thực sự làm việc tốt với indenting như ''' cần phải đi ngay tại đầu của dòng để tránh tiêm một tải toàn bộ không gian dư thừa nhưng nó có thể nhìn một chút WYSIWYG nơi mà không phải là một mối quan ngại. –

14

Tôi luôn sử dụng CHAR(13)+CHAR(10) để tạo ngắt dòng (mà dường như làm việc trộn lẫn với các giá trị nvarchar) trong TSQL, vì vậy hãy thử một cái gì đó như thế này:

DECLARE @CRLF char(2) 
     ,@bodyText nvarchar(max) 
     ,@field1 nvarchar(10) 
     ,@field2 nvarchar(10) 
SELECT @CRLF=CHAR(13)+CHAR(10) 
     ,@field1='your data' 
     ,@field2='and more' 

set @bodyText = 
       N'Here is one line of text ' 
       [email protected]+ N'It would be nice to have this on a 2nd line ' 
       [email protected]+ N'Below is some data: ' + N' ' + N' ' + ISNULL(@field1,'') + N' ' + ISNULL(@field2 + N' ' ,'') 
       [email protected]+ N'This is the last line' 


PRINT @bodyText 

OUTPUT:

Here is one line of text 
It would be nice to have this on a 2nd line 
Below is some data: your data and more 
This is the last line 

CHAR(13)+CHAR(10) này sẽ hoạt động với msdb.dbo.sp_send_dbmail, tôi gửi e-mail được định dạng bằng cách sử dụng tất cả thời gian.

+1

Không phải nếu bạn đang gửi email có nội dung dưới dạng HTML – Fandango68

1

Đợi đến bữa tiệc, nhưng dưới dạng Fernando68 đề cập ở trên, nếu bạn được phép gửi email html, đặt @bodyFormat = 'HTML', thì bạn có thể sử dụng <br/> để ngắt dòng và làm cho nó trở nên hấp dẫn như bạn muốn sử dụng tất cả các thẻ bạn nhận được từ HTML như ngắt dòng, img, mạnh mẽ và vân vân ...

set @bodyText = (select 
         '<h1>My Data</h1><p>Here is one line of text<br/> 
         It would be nice to have this on a 2nd line <br/> 
         Below is some data: <br/>' 
         + field1 + '<br/>' 
         + field2 + '<br/>' 
         + 'This is the last line</p>' 
         from myTable) 

    EXEC msdb.dbo.sp_send_dbmail 
     @profile_name = 'myProfile', 
     @recipients = @to, 
     @body = @bodyText, 
     @body_format = 'HTML', 
     @subject = 'Testing Email' ;