크로스 플랫폼 방식으로 제목과 본문이 포함된 기본 메일 프로그램을 어떻게 열 수 있나요?

StackOverflow https://stackoverflow.com/questions/17373

  •  08-06-2019
  •  | 
  •  

문제

크로스 플랫폼 방식으로 제목과 본문이 포함된 기본 메일 프로그램을 어떻게 열 수 있나요?

안타깝게도 이는 웹사이트가 아닌 Java로 작성된 클라이언트 앱용입니다.

나는 이것이 크로스 플랫폼 방식(Windows와 Mac, 죄송합니다. Linux를 의미함)으로 작동하길 원합니다.Windows에서 VBScript를 실행하거나 OS X에서 AppleScript를 실행하게 되어 기쁩니다.그러나 나는 그 스크립트에 무엇이 포함되어야 하는지 전혀 모릅니다.나는 사용자의 기본 프로그램과 기본 프로그램을 실행하고 싶습니다.Outlook 등을 검색하면 됩니다.

OS X에서는 다음 명령을 실행해 보았습니다.

open mailto:?subject=MySubject&body=TheBody

공백을 다음으로 바꾸려면 URL 이스케이프가 필요합니다. %20.

업데이트됨 Windows에서는 모든 종류의 게임을 플레이해야 합니다. start 올바르게 실행하려면.다음은 적절한 Java 주문입니다.

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);
    }
}
도움이 되었습니까?

해결책

Java 1.6에는 플랫폼의 기본 메일러를 여는 표준적인 방법이 있습니다.Desktop.mail(URI) 메소드.URI는 메일의 모든 필드(발신자, 수신자, 본문, 제목)를 설정하는 데 사용할 수 있습니다.Java 1.6의 데스크톱 통합에 대한 전체 예는 다음에서 확인할 수 있습니다. Java SE 6에서 데스크탑 API 사용

다른 팁

start Windows에서는 잘 작동합니다(아래 참조).UrlEscape에 내장된 Java를 사용한 다음 '+' 문자에 대한 두 번째 대체를 실행합니다.

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

1.제목 줄 추가

제목 앞에 '를 추가하여 이메일의 제목 줄을 미리 채울 수 있습니다.?제목=이메일 주소 뒤에 '.

이제 링크는 다음과 같습니다.

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

2.여러 수신자에게 보내기

메일은 참조(cc) 또는 숨은 참조(bcc)로 추가 수신자에게 보낼 수 있습니다.

비슷한 방식으로 '를 배치하여 수행됩니다.?cc=someoneelse@theirsite.com' 초기 주소 뒤에 .

따라서 링크는 다음과 같습니다.

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

숨은 참조 사본을 보내려는 경우 cc를 bcc로 간단히 대체할 수 있습니다.

이는 다양한 주제의 페이지에 대한 링크가 있는 경우 매우 유용할 수 있습니다.각 페이지의 이메일이 회사의 해당 담당자에게 전달되도록 할 수 있지만 모든 메일의 사본도 중앙 주소로 전송됩니다.

물론 두 명 이상의 추가 수신자를 지정할 수 있습니다. 수신자 목록을 쉼표로 구분하면 됩니다.

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

출처: 'mailto'에서 더 많은 정보 얻기 이제 404입니다.waybackmachine에서 콘텐츠를 검색했습니다.

삼.코드 결합

위의 다양한 코드 비트 사이에 '&'를 추가하여 결합할 수 있습니다.

따라서 추가

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

당신과 그녀에게 '안녕하세요'라는 제목의 이메일을 보낼 것입니다.

4.이메일을 작성하세요

메시지 시작 부분을 이메일 본문에 미리 입력하거나 원하는 경우 전체 메시지를 작성할 수도 있습니다!이메일 본문에 내용을 추가하려면 위와 같이 간단합니다. '?본문=이메일 주소 뒤에 '.그러나 해당 이메일의 형식을 지정하는 것은 약간 까다로울 수 있습니다.단어 사이에 공백을 만들려면 16진수 코드를 사용해야 합니다. 예를 들어 '%20' 각 단어 사이에 새 줄을 만드는 것은 '를 추가하는 것을 의미합니다.%0D'.마찬가지로 다음과 같은 기호는 $ 표지판은 16진수 코드로 작성되어야 합니다.

제목 줄을 추가하고 여러 수신자에게 사본을 보내려는 경우 코드 작성이 매우 길어지고 어려울 수 있습니다.

제목과 메시지가 채워진 메시지가 세 사람에게 전송됩니다. 사용자가 해야 할 일은 이름만 추가하는 것 뿐입니다.

코드를 보세요!

<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> 

메모:내가 찾은 원본 소스 URL은 이제 404ing이므로 waybackmachine의 콘텐츠를 가져왔습니다. 그리고 잃어버리지 않도록 여기에 게시했습니다.또한 OP는 웹사이트용이 아니라고 밝혔는데, 이는 이러한 예와 같지만 이러한 기술 중 일부는 여전히 유용할 수 있습니다.

Java는 우주에 +를 사용하고 메일이 문자 그대로 가져 갔기 때문에 Urlencode를 다시 구현해야했습니다.

Java에 문자열을 urlencoding하는 내장 메소드가 있는지는 모르겠지만 이 링크 http://www.permadi.com/tutorial/urlEncoding/ 인코딩할 가장 일반적인 문자 중 일부는 다음과 같습니다.

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

Java에 문자열을 urlencoding하는 내장 메소드가 있는지는 모르겠지만 이 링크 http://www.permadi.com/tutorial/urlEncoding/ 인코딩할 가장 일반적인 문자 중 일부는 다음과 같습니다.

퍼센트 인코딩 mailto URI hname 및 hvalue의 경우 다음 규칙을 사용합니다. http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding.아래에 http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, 도움이 될 수 있는 Java 예제가 있습니다.

기본적으로 다음을 사용합니다.

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;
    }
}

전달된 문자열은 이 있는 문자열이어야 하며, 은 이미 으로 정규화되어 있습니다.

또한 위와 같은 예외가 발생했을 때 원래 문자열을 반환하는 것은 명령줄에서 전달하는 mailto URI 인수가 올바르게 이스케이프되고 인용된 경우에만 안전하다는 점에 유의하세요.

창에서 이는 다음을 의미합니다.

  1. 주장을 인용해 보세요.
  2. \를 사용하여 따옴표 안의 "를 이스케이프합니다.
  3. " 앞에 오는 모든 \ 또는 문자열 끝을 \로 이스케이프합니다.

또한 Windows에서 Java와 같이 UTF-16 문자열을 처리하는 경우 ShellExecuteW를 사용하여 mailto URI를 "열" 수 있습니다.그렇지 않고 예외가 발생하여 s를 반환하는 경우(일부 hvalue가 완전히 퍼센트 인코딩되지 않은 경우 일부 와이드 문자의 범위가 좁아지고 정보가 손실될 수 있습니다.그러나 모든 메일 클라이언트가 유니코드 인수를 허용하는 것은 아니므로 이상적으로는 ShellExecute를 사용하여 적절하게 퍼센트 인코딩된 UTF8 ASCII 인수를 전달하는 것이 좋습니다.

'start'와 마찬가지로 "open"이 포함된 ShellExecute는 기본 클라이언트에서 mailto URI를 열어야 합니다.

다른 OS에서는 잘 모르겠습니다.

절대 사용하지 마세요 Runtime.exec(String) Mac OS X 또는 기타 운영 체제에서.그렇게 하려면 모든 인수 문자열 등을 적절하게 인용하는 방법을 알아내야 합니다.그것은 고통스럽고 오류가 발생하기 쉽습니다.

대신에 Runtime.exec(String[]) 이는 이미 분리된 인수의 배열을 취합니다.이는 거의 모든 용도에 훨씬 더 적합합니다.

Mailto는 나쁜 경로가 아닙니다.하지만 말씀하신 것처럼 올바르게 인코딩되었는지 확인해야 합니다.

mailto 사용 시 가장 큰 문제는 줄 바꿈입니다.캐리지 리턴에는 %0A를 사용하고 공백에는 %20을 사용하십시오.

또한 mailto는 일종의 URL과 동일하게 간주되므로 길이에 대한 제한이 동일하다는 점을 명심하세요.보다http://support.microsoft.com/kb/208427, 최대 URL 길이는 2083자입니다.이 기사에서는 Mailto에 대해서도 확인됩니다. http://support.microsoft.com/kb/279460/en-us.또한 일부 메일 클라이언트에도 제한이 있을 수 있습니다. 이전 버전의 Outlook Express에는 483자 정도의 제한이 있었던 것 같습니다.그보다 긴 문자열이 필요할 것으로 예상되면 대안을 살펴봐야 합니다.

그런데, Java에서 명령을 실행할 수 있는 한 그렇게 하기 위해 스크립트를 쫓아낼 필요는 없습니다(저는 Java를 하지 않기 때문에 가능한지 모르겠습니다).

이것을 사용할 수도 있습니다 ...

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);
        }
    }

또한 읽기 형식화를 위해 Java로 이메일을 보내는 간단한 방법:메일 링크

나는 이것을 구현했으며 OS X에서 잘 작동합니다.(최대 URL 길이에 대한 Ryan의 언급은 코드화되지 않았습니다.)

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();
}

Java가 사용하기 때문에 URLencode를 다시 구현해야 했습니다. + 공간을 위해 Mail은 이를 문자 그대로 받아들였습니다.Windows에서는 아직 테스트하지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top