Quebra de linha no corpo de mailto: link

Eu quero criar um link “Encaminhar isso para um amigo” abaixo de uma postagem do blog que abre meu cliente de e-mail com uma mensagem preparada. Posso começar a trabalhar para uma mensagem de uma única linha, mas eu gostaria de quebrar linhas dentro do corpo da mensagem. Como eu posso fazer isso?

<?php printf( 'Forward this to a friend', the_title_attribute('echo=0'), sprintf('The link: %s Have a great day! Stefaan', get_the_permalink()) ); ?> 

Como faço para começar “Tenha um ótimo dia!” Em uma nova linha com uma linha vazia acima?

A binding: …

Tenha um ótimo dia!

Stefaan

Meu blog usa o WordPress com um tema do Genesis e coloco meu código no gancho genesis_footer_entry com PHP habilitado (veja a captura de canvas – o texto do e-mail está em holandês).

Você não pode usar tags HTML no corpo de mailto

De acordo com RFC 2368 , isso não é possível:

O nome especial “corpo” indica que o valor associado é o corpo da mensagem. O nome do “corpo” deve conter o conteúdo da primeira parte do texto / parte do corpo simples da mensagem. O URL do mailto destina-se principalmente a geração de mensagens de texto curtas que são realmente o conteúdo do processamento automático (como “subscrever” mensagens para listas de endereços), não corpos MIME gerais.

Portanto, qualquer solução depende de tags HTML não é possível. A solução que estou sugerindo é usar \ r \ n juntamente com a function PHP rawurlencode

Então aqui está o código

 
Forward this to a friend
', 'My Subject', rawurlencode(sprintf( "Hi there, this might be interesting for you.\r\nThis is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s.\r\nHave a great day!\r\nStefaan", get_the_permalink())) ); ?>

Nota: Eu tentei o código com a substituição get_the_permalink () com variável transportando http://example.com/test.php

referências:

MailTo com corpo HTML

Qual é o equivalente ao componente encodeURI do JavaScript em PHP?

De acordo com a especificação de e-mail, cada linha de e-mail precisa terminar no par – então você precisa usar \r\n na cordão sprintf() .

"This is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s.\r\n Have a great day!\r\n Stefaan"

E se \r\n não funcionar, você tem uma limitação de idioma de origem. Dado que:

  • é ASCII 13 (hex 0D )
  • \n é ASCII 10 (hex 0A )

talvez você possa usar " " ?

Explicação

a mailto: é um esquema URI para o endereço de e-mail, como todos os outros URIs, os personagens precisam ser traduzidos para um formato que pode ser transmitido pela Internet.

Tome uma forma simplificada do seu código original para ilustrar os pontos abaixo

 printf(Description, the_title_attribute( 'echo=0' ) , sprintf("content link:https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s more content", get_the_permalink()) 

O código é executado nas seguintes sequências

  1. get_the_permalink() obtém o URL da sua página
  2. sprintf() substitui https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s em $content com o resultado do passo 1
  3. print_f() então substitui
    i) o primeiro https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s ie subject=https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s com o resultado obtido de the_title_attribute( 'echo=0' ) , que eu suponho é o título da página ou seu site e, em seguida, ii) o segundo https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s ie body=https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s com o resultado do passo 2 para formar um link completo de a mailto

Para manter as quebras de linha, você deve converter a seqüência de $content em formato codificado em URL antes de emiti-lo.

No PHP que é feito usando a function rawurlencode() , ele traduz as quebras de linha \r\n na string em %0D%0A , conforme RFC 3986 .

Como o sinal de porcentagem % é usado para especificações de conversão em sprint_f() , você deve passar a string para rawurlencode() depois que a string foi formatada por sprint_f() , portanto, o uso de rawurlencode(sprint_f($string, $arg))


Solução
Coloquei a solução na íntegra para que você copie e cole em seu widget para evitar falso negativo devido à implementação incorreta.

O Formato 1 e o formato 2 contêm essencialmente o mesmo código, os dois formatos estão para ilustrar a você como você pode inserir a quebra de linha, por meio de 1) pressing enter OU 2) typing in \r\n onde é necessária a quebra de linha.

Eu crie $content uma seqüência separada para facilitar a edição e legibilidade do código.

Formato 1

   
Forward this to a friend
',the_title_attribute( 'echo=0' ), rawurlencode(sprintf( $content,get_the_permalink())) ); ?>

Formato 2

  
Forward this to a friend
',the_title_attribute( 'echo=0' ), rawurlencode(sprintf( $content,get_the_permalink())) ); ?>

Demo

Adicione outro argumento de https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s à sua chamada sprintf() e transmita-a a versão codificada por URL do feed %0A feed line %0A (duas vezes):

 printf( '
Forward this to a friend
', 'subject', sprintf( 'Hi there, this might be interesting for you. This is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s. https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%sHave a great day! Stefaan', "link-here", "%0A%0A" ) );

Editar: Além disso, você também pode simplesmente adicionar o %0A à string em si, mas você deve se lembrar de escaping do % char adicionando um extra antes dele:

 printf( '
Forward this to a friend
', 'subject', sprintf( 'Hi there, this might be interesting for you. This is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s. %%0A%%0AHave a great day! Stefaan', "link-here" ) );

Use corda urlencoded para CR / LF

 %0D%0A 

onde você quer uma pausa.

No exemplo

  

Eu decidi passar completamente a questão e abordar todas as tentativas que foram feitas aqui. Se você quiser uma resposta rápida , olhe para o presente atualmente aceito.

Solução de trabalho

Para usar um texto em mailto: parâmetro de body URL , codifique por cento . Em PHP, use rawurlencode() . O assunto também deve ser codificado.

 $subj = "Whatever subject"; $body = "Multi-\r\nline\r\nbody"; printf( "mailto:?subject=https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s&body=https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s", rawurlencode($subj), rawurlencode($body) ); 
 mailto:?subject=Whatever%2Osubject&body=Multi-%0D%0Aline%0D%0Abody 

Para usá-lo como alvo de um link HTML , substitua caracteres que tenham um significado especial em HTML com referências de entidade – htmlspecialchars() é usado para isso em PHP, e o WordPress possui um esctrator (e filtrado) esc_html() .

 $subj = "Whatever subject"; $body = "Multi-\r\nline\r\nbody"; printf( 'mailto: URL with multi-line body', htmlspecialchars(sprintf( "mailto:?subject=https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s&body=https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s", rawurlencode($subj), rawurlencode($body) ), ENT_QUOTES) ); 

Você pode adicionar uma tag em seu sprintf (assumindo que deseja exibir a linha de interrupção para HTML):

 sprintf( 'Hi there, this might be interesting for you. This is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s.
Have a great day!
Stefaan',get_the_permalink() )

EDITAR:

Se você deseja que o correio de texto simples use \r\n e aspas duplas:

 sprintf("Hi there, this might be interesting for you. This is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s.\r\n Have a great day!\r\n Stefaan",get_the_permalink() ) 

Você provavelmente poderia mandar um PHP_EOL lá

 
Forward this to a friend
', the_title_attribute( 'echo=0' ), sprintf( 'Hi there, this might be interesting for you. This is the link: https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%s. https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%sHave a great day! https://stackoverflow.com/questions/37524663/line-break-in-body-of-mailto-link/%sStefaan',get_the_permalink(), PHP_EOL, PHP_EOL ) );