xp_smtp_sendmail пустое пространство добавляется в html случайным образом - PullRequest
8 голосов
/ 23 февраля 2010

У меня есть процесс, в котором я создаю небольшой HTML-документ со ссылкой и отправляю его через процесс xp_smtp_sendmail. Ссылка генерируется на основе результатов запроса и является длинной. Это работает в большинстве случаев. Однако иногда ссылка прерывается из-за вставки пробелов в имена переменных строки запроса, т.е. & Na me = John.

Это может варьироваться в зависимости от почтовых клиентов (одна и та же ссылка работает в Gmail, но может не работать в comcast из-за пробелов. Кажется, что пробел вставлен случайным образом, поэтому в каждом неработающем почтовом пространстве ссылки могут нарушать другие переменные строки запроса. PRINT from proc ссылка чистая, пробелов нет.

Вот мой пример почтового процесса, выполняемого в основном процессе (который получает результаты запроса и генерирует HTML для @Message). Кажется, пробел вставляется независимо от того, кодирую я URL или нет.

Заранее благодарю за помощь. Я могу отправить более чистую версию кода, если она не отображается должным образом.

.... результаты запроса выше

SET @Message = NULL
SET @Message = @Message +
+ '<br/>Dear ' + @FirstName + ' ' + @LastName + ','
+ '<br/><br/>Recently you took "' + @Title + '". ' 
+ 'In response to the question "What is it?" ' 
+ 'you responded "' + @Response + '".' 
+ '<br/><br/>Following up on previous mailing'
+ '<br/><br/>Please click on the link below'
+ '<br/><br/><a href="' + @Link + '">Please click here</a>'
+ '<br/><br/>plain text'
+ '<br/><br/>plain text,'
+ '<br/><br/>plain text<br/>
plain text<br/>
plain text<br/>
plain text<br/>
plain text<br/>
plain text

EXEC @rc = master.dbo.xp_smtp_sendmail
 @FROM         = 'any@any.com',
 @FROM_NAME    = 'Any User',
 @TO           = @Email,
 @priority     = N'NORMAL',
 @subject      = N'My email',
 @message      = @Message,
 @messagefile  = N'',
 @type         = N'text/html', 
 @attachment   = N'',
 @attachments  = N'',
 @codepage     = 0,
 @server       = 'smtp.server.any'

Ответы [ 4 ]

1 голос
/ 14 июля 2010

1 - проверьте длину генерируемого сообщения и переключитесь на отправку из файла, если его длина приближается к 4000 знаков.

2 - вставлять символы cr / lf перед каждым предложением или абзацем.

3 - Убедитесь, что у вас есть cr / lf до и после открытия тега (или просто lf, если это нравится серверу smtp)

4 - Поговорите с кем угодно о сокращении длины этой встроенной ссылки - это просто неустойчиво

5 - запросить какие-либо параметры конфигурации на сервере smtp, чтобы вы могли отправлять электронную почту в виде полностью закодированного двоичного файла (требуются заголовки MIME и кодировка Base64)

6 - Ищите более свежую альтернативу xp_smtp_sendmail, возможно, .NET xp

0 голосов
/ 25 июля 2010

Ваша проблема в том, что вы относитесь к маю как к веб-странице. Почта была изобретена во время текстовых приставок, и часто имеет ограничение длины строки в 72 символа. Вам необходимо заключить HTML-код в строки длиной не более 72 символов, чтобы обеспечить его правильную доставку всем получателям.

Для этого используйте печатную кодировку в кавычках и оберните строки до 72 символов.

Однако я понятия не имею, как это сделать в SQL Server, кроме написания процедуры для работы. Вы можете следовать совету в ASP FAQ .

По сути, это сокращение ссылки путем уловок или с помощью служб сокращения ссылок.

0 голосов
/ 07 апреля 2010

Как насчет размещения возврата каретки в ваш код. BR только возврат каретки в HTML, но сам источник не имеет возврата каретки.

0 голосов
/ 20 марта 2010

Как долго ссылка со значениями?

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

Кажется случайным, поскольку значения имеют разную длину, поэтому разбиение происходит случайным образом.

Еще одна мысль: вам нужны только <br> теги. <br /> не требуется (с пробелом или без) и может внести вклад

...