none
MS SQL SERVER 2008 Database Mail 邮件主旨乱码 RRS feed

  • 问题

  • 公司使用MS SQL SERVER 2008(繁体) 版本:10.0.4000

    Database Mail 进行日常的派信.一直存在一个问题.就是中文字符超过60个就乱码.而保存在sysmail_mailitems中的subject栏位的内容是正常的

    直接使用Outlook派信.是可以正常派送长度<=255个中文字符的邮件

    测试脚本如下:

    1. 先派送60个中文字符:

    USE msdb
    go
    					
    					
    DECLARE @rc INT = 0 ,
        @mailitem_id INT = 0 ,
        @Subject NVARCHAR(255) = N'測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試'
    DECLARE @SubjectLength INT = LEN(@subject)
    
        
    EXEC @rc= msdb.dbo.sp_send_dbmail @profile_name = 'Service@MyCompany.com',
        @recipients = 'CHRIS@MyCompany.com', @subject = @Subject,
        @body = @SubjectLength, @body_format = 'HTML', @importance = 'HIGH',
        @mailitem_id = @mailitem_id OUTPUT
        
    PRINT LEN(@SUBJECT)
    PRINT @mailitem_id
     
    SELECT  *
    FROM    dbo.sysmail_mailitems
    WHERE   mailitem_id = @mailitem_id


    这个时候,OutLook收到的邮件显示主旨正常:

    2. 派送超过60个中文字符的邮件(60个中文字符 + 1个数字)

    (仅修改了一处地方,就是@Subject多增加了个 "1"

    				
    DECLARE @rc INT = 0 ,
        @mailitem_id INT = 0 ,
        @Subject NVARCHAR(255) = N'1測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試測試'
    

    这个时候,OutLook收到的邮件显示主旨不正常了: Base64字串

    3.查询两笔保存在sysmail_mailitems中派信结果,发现subject都显示正常:

    4.直接使用OutLook发送255个中文字符的邮件,正常

    DataBase Mail 架构图:

    而其SQL 内部派送调用大致的关键SP顺序为:

    sp_Send_dbMail 

      -->  sp_SendMailQueues 

       --> sp_SendMailMessage 

    调用期间,本人进行了详细追踪,其并未针对@Subject栏位进行处理或者类型转换,因此排除中途转换造成乱码.

    而 sp_SendMailMessage关键部分:

    DECLARE @conversationHandle uniqueidentifier;
    DECLARE @error int
    
    -- Start a conversation with the remote service
    BEGIN DIALOG  @conversationHandle
        FROM SERVICE    [InternalMailService]
        TO SERVICE      'ExternalMailService'
        ON CONTRACT     @contract_name
        WITH ENCRYPTION=OFF
    
    -- Check error
    SET @error = @@ERROR
    IF @error <> 0
    BEGIN
        RETURN @error
    END
    
    -- Send message
    ;SEND ON CONVERSATION @conversationHandle MESSAGE TYPE @message_type (@request)

    这里:    TO SERVICE      'ExternalMailService' 既是 SQL Server Broke 调用/触发 DataBaseMail90.exe 进行与EXCHANGE服务器进行交互,派信.

    因此,推断是否是DataBaseMail90.exe调用时,造成了乱码(Base64字符串被截断).

    以上为个人的逐步分析,如有不对之处,烦请指正.

    希望有碰到过,或者知道如何解决该问题的热心人士提出宝贵的意见/建议/解决方案

    十分感谢!






    2012年3月6日 3:21

答案

全部回复