Почему некоторые теги привязки неверны?

#zend-framework #email-client #zend-mail

#zend-framework #email-клиент #zend-mail

Вопрос:

Я использую Zend_Mail для отправки текстовых электронных писем через SMTP. В тестовой среде я заметил, что при сборе моих электронных писем через клиент браузера URL-адреса были преобразованы в гиперссылки, но граница между ссылкой и обычным текстом была проведена в неправильном месте.

Например, в приведенном ниже фрагменте письма вы можете видеть, что я отправил пользователю регистрационное электронное письмо. Он включает параметры для ‘id’ и ‘code’. Вы увидите, что в этом случае клиент браузера решил, что «идентификатор» является частью гиперссылки, а «код» — нет.

 please follow this link <a href="http://mydomain.com/user/validate/id/18">http://mydomain.com/user/validate/id/18</a>/code/1a0d917c1512c700f7237ae1f3727e47 If you did not...
  

Иногда «граница» рисуется в произвольном месте — например, на полпути через поле кода!

При сборе электронной почты через клиент, такой как Outlook, проблема, похоже, не возникает.

Предположительно, это какая-то несовместимость наборов символов между моей PHP-средой и клиентом моего браузера. Сказав это, я использую стандартную установку PHP, и у меня не было проблем с получением ссылок с других сайтов в моем клиенте браузера. (Клиент браузера предоставляется как часть учетной записи веб-мастера.)

Есть идеи?

ОБНОВЛЕНИЕ: вот код, который генерирует ссылку. Пробовал все виды комбинаций, включая EOT, одинарные кавычки, двойные кавычки… Тот же результат…

 $id         = $options['id'];
$code       = $options['validation'];
$link       = "http://mydomain.com/user/validate/id/" . $id . "/code/" . $code;

$body = 'Thanks for registering ... please follow this 
link ' . $link . ' If you did not request ....please ignore it.';

$this->setBodyText($body);
  

Комментарии:

1. Можете ли вы показать код, который генерирует эту привязку?

Ответ №1:

С помощью setBodyText() вы задаете текст только для части электронного письма: когда вы пишете в обычном текстовом электронном письме ссылку, вы пишете только несколько символов без особого значения; клиент, получающий почту, поймет, является ли это ссылкой и как ее отобразить. Однако этот процесс находится вне нашего контроля (он находится на стороне клиента и зависит от клиента, который есть у пользователя).

На мой взгляд, лучшим решением является установка также HTML-части объекта Zend_Mail, вызывающего

 $yourMailObject->setBodyHtml($htmlString);
  

Делая это, вы явно указываете почтовому клиенту, как отобразить ссылку.

Очевидно, что вам нужно поработать немного больше, но поскольку вы хотите, чтобы клиент отображал свойство HTML в виде тега, лучший способ — передать ему правильный HTML.

Подводя итог, можно сказать, что рабочий процесс выглядит следующим образом:

  1. определите ссылку и поместите ее (допустим) в $link переменную
  2. подготовьте текст письма в виде обычного текста: $bodyText = "Something... click here: $link ...";
  3. подготовьте текст письма в формате HTML: $bodyHtml = "<body><p>Click the link below</p><p><a href='$link'>$link</a></p><p>Or copy and paste in your browser the url:<br/><pre>$link</pre></p></body>";
  4. вызовите оба метода объекта mail: $yourMailObject->setBodyText($bodyText)->setBodyHtml($bodyHtml);

Затем вы можете отправить почту как обычно. При желании вы можете настроить html более сложным способом, добавив встроенный css и так далее. Вы также можете отформатировать его так, чтобы оно отображалось как текстовое сообщение (с моноширинным шрифтом), но поскольку вы передали правильный HTML, вы можете быть уверены, что клиент нажмет на нужную ссылку.