Pergunta

Como abro o programa de e-mail padrão com Assunto e Corpo em plataforma cruzada?

Infelizmente, isso é para um aplicativo cliente escrito em Java, não para um site.

Eu gostaria que isso funcionasse de forma multiplataforma (o que significa Windows e Mac, desculpe Linux).Fico feliz em executar um VBScript no Windows ou AppleScript no OS X.Mas não tenho ideia do que esses scripts deveriam conter.Eu adoraria executar o programa padrão do usuário vs.apenas procurando por Outlook ou algo assim.

No OS X, tentei executar o comando:

open mailto:?subject=MySubject&body=TheBody

O escape de URL é necessário para substituir espaços por %20.

Atualizada No Windows, você precisa jogar todos os tipos de jogos para obter start para funcionar corretamente.Aqui está o encantamento Java adequado:

class Win32 extends OS {
    public void email(String subject, String body) throws Exception {
        String cmd = "cmd.exe /c start \"\" \"" + formatMailto(subject, body) + "\"";
        Runtime.getRuntime().exec(cmd);
    }
}
Foi útil?

Solução

No Java 1.6 você tem uma maneira padrão de abrir o mailer padrão da plataforma:o método Desktop.mail (URI).O URI pode ser usado para definir todos os campos do e-mail (remetente, destinatários, corpo, assunto).Você pode conferir um exemplo completo de integração de desktop em Java 1.6 em Usando a API Desktop em Java SE 6

Outras dicas

start funciona bem no Windows (veja abaixo).Eu usaria o UrlEscape integrado do Java e apenas executaria uma segunda substituição para caracteres '+'.

start mailto:"?subject=My%20Subject&body=The%20Body"

1.Adicione uma linha de assunto

Você pode preencher previamente a linha de assunto do e-mail adicionando o assunto precedido por '?assunto=' após o endereço de e-mail.

Então o link agora se torna:

<a href="mailto:someone@yoursite.com?subject=Mail from Our Site">Email Us</a> 

2.Enviar para vários destinatários

A correspondência pode ser enviada para destinatários adicionais como cópias carbono (cc) ou cópias ocultas (cco).

Isto é feito de maneira semelhante, colocando '?cc=alguémelse@seusite.com'após o endereço inicial.

Então o link fica assim:

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com">Email Us</a>

cc pode simplesmente ser substituído por cco se você desejar enviar cópias ocultas.

Isso pode ser muito útil se você tiver links em páginas com assuntos diversos.Você pode fazer com que o e-mail de cada página seja enviado para a pessoa apropriada em uma empresa, mas também com uma cópia de todos os e-mails enviados para um endereço central.

É claro que você pode especificar mais de um destinatário adicional, basta separar sua lista de destinatários com uma vírgula.

<a href="mailto:someone@yoursite.com?cc=someoneelse@theirsite.com, another@thatsite.com, me@mysite.com">Email Us</a> 

Proveniente de Obtendo mais do 'mailto' que agora 404s.Recuperei o conteúdo do waybackmachine.

3.Combinando Código

Você pode combinar os vários bits de código acima adicionando um '&' entre cada um.

Adicionando assim

me@mysite.com?subject=Hello&cc=you@yoursite.com&bcc=her@hersite.com

enviaria um e-mail com o assunto 'Olá' para mim, você e ela.

4.Escreva o e-mail

Você também pode preencher previamente o corpo do e-mail com o início de uma mensagem ou escrever a mensagem inteira, se desejar!Para adicionar algo ao corpo do e-mail é tão simples quanto acima - '?corpo=' após o endereço de e-mail.No entanto, formatar esse e-mail pode ser um pouco complicado.Para criar espaços entre palavras você terá que usar código hexadecimal - por exemplo '%20' entre cada palavra, e criar novas linhas significará adicionar '%0D'.Da mesma forma, símbolos como $ os sinais precisarão ser escritos em código hexadecimal.

Se você também deseja adicionar uma linha de assunto e enviar cópias para vários destinatários, isso pode tornar o código muito longo e difícil de escrever.

Ele enviará uma mensagem para três pessoas, com o assunto e a mensagem preenchidos, bastando adicionar seu nome.

Basta olhar o código!

<a href="mailto:abbeyvet@outfront.net?CC=spooky@outfront.net
&BCC=thomasbrunt@outfront.net&Subject=Please%2C%20I%20insist
%21&Body=Hi%0DI%20would%20like%20to%20send%20you%20
%241000000%20to%20divide%20as%20you%20see%20fit%20among
%20yourselves%20and%20all%20the%20moderators.%0DPlease%
20let%20me%20know%20to%20whom%20I%20should%20send
%20the%20check.">this link</a> 

Observação:O URL da fonte original onde encontrei isso agora é 404, então eu pegou o conteúdo do waybackmachine e postei aqui para não se perder.Além disso, o OP afirmou que não se tratava de um site, que é o que são esses exemplos, mas algumas dessas técnicas ainda podem ser úteis.

Eu tive que reimplementar o urlencode porque os java usariam + para o espaço e o correio os levou literalmente.

Não sei se Java tem algum método interno para codificar a string com url, mas este link http://www.permadi.com/tutorial/urlEncoding/ mostra alguns dos caracteres mais comuns para codificar:

;       %3B
?       %3F
/       %2F
:       %3A
#       %23
&       %24
=       %3D
+       %2B
$       %26
,       %2C
space   %20 or +
%       %25
<       %3C
>       %3E
~       %7E
%       %25

Não sei se Java tem algum método interno para codificar a string com url, mas este link http://www.permadi.com/tutorial/urlEncoding/ mostra alguns dos caracteres mais comuns para codificar:

Para nomes e valores de URI mailto com codificação percentual, eu uso as regras em http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding.Sob http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, há um exemplo Java que pode ajudar.

Basicamente, eu uso:

private String encodex(final String s) {
    try {
        return java.net.URLEncoder.encode(s, "utf-8").replaceAll("\\+", "%20").replaceAll("\\%0A", "%0D%0A");
    } catch (Throwable x) {
        return s;
    }
}

A string passada deve ser uma string com e perdida já normalizada para .

Observe também que apenas retornar a string original em uma exceção como acima só é seguro se o argumento URI mailto que você está passando na linha de comando tiver escape e aspas corretamente.

No Windows, isso significa:

  1. Cite o argumento.
  2. Escape de qualquer "dentro das aspas com \.
  3. Escape de qualquer \ que preceda um " ou o final da string com \.

Além disso, no Windows, se você estiver lidando com strings UTF-16 como em Java, talvez queira usar ShellExecuteW para "abrir" o URI mailto.Se você não fizer isso e retornar s em uma exceção (onde algum hvalue não estiver completamente codificado por porcentagem, você poderá acabar restringindo alguns caracteres largos e perdendo informações.Porém, nem todos os clientes de e-mail aceitam argumentos unicode, então, idealmente, você deseja passar um argumento ascii utf8 com codificação percentual adequada com ShellExecute.

Assim como 'start', ShellExecute com "open" deve abrir o URI mailto no cliente padrão.

Não tenho certeza sobre outros sistemas operacionais.

Nunca use Runtime.exec(String) no Mac OS X ou qualquer outro sistema operacional.Se você fizer isso, terá que descobrir como citar corretamente todas as sequências de argumentos e assim por diante;é doloroso e muito sujeito a erros.

Em vez disso, use Runtime.exec(String[]) que leva uma série de argumentos já separados.Isto é muito mais apropriado para praticamente todos os usos.

Mailto não é um caminho ruim a seguir.Mas, como você mencionou, você precisará ter certeza de que está codificado corretamente.

O principal problema do uso do mailto é a quebra de linhas.Use %0A para retornos de carro, %20 para espaços.

Além disso, lembre-se de que mailto é considerado o mesmo que uma espécie de URL e, portanto, terá as mesmas limitações de comprimento.Verhttp://support.microsoft.com/kb/208427, observe o comprimento máximo do URL de 2.083 caracteres.Isso também é confirmado para o MailTo neste artigo: http://support.microsoft.com/kb/279460/en-us.Além disso, alguns clientes de e-mail também podem ter um limite (acredito que versões mais antigas do Outlook Express tinham um limite muito menor, como 483 caracteres ou algo assim.Se você espera ter uma string mais longa do que isso, precisará procurar alternativas.

Aliás, você não deveria ter que recorrer a um script para fazer isso, desde que possa executar um comando de Java (não sei se você pode, já que não uso Java).

Você pode usar isso...

main(string[] args){    
String forUri = String.format("mailto:?subject=%s&body=%s",  urlEncode(sub), urlEncode(mailBody));
                        Desktop.getDesktop().mail(new URI(forUri));
}

private static final String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, "UTF-8").replace("+", "%20");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
    }

Também para formatação, leia Uma maneira simples de enviar e-mails em Java:links para email

Eu implementei isso e funciona bem no OS X.(A menção de Ryan ao comprimento máximo do URL não foi codificada.)

public void email(String subject, String body) throws Exception {
    String cmd = "open mailto:";        
    cmd += "?subject=" + urlEncode(subject);
    cmd += "&body=" + urlEncode(body);
    Runtime.getRuntime().exec(cmd);
}

private static String urlEncode(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        char ch = s.charAt(i);
        if (Character.isLetterOrDigit(ch)) {
            sb.append(ch);
        }
        else {
            sb.append(String.format("%%%02X", (int)ch));
        }
    }
    return sb.toString();
}

Eu tive que reimplementar o URLencode porque o Java usaria + para espaço e o Mail interpretou isso literalmente.Ainda não testei no Windows.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top