2008-08-20 38 views
11

Làm cách nào để mở chương trình thư mặc định bằng Chủ đề và Nội dung theo cách đa nền tảng?Làm cách nào để mở chương trình thư mặc định với Chủ đề và Nội dung theo cách đa nền tảng?

Thật không may, đây là ứng dụng khách được viết bằng Java chứ không phải trang web.

Tôi muốn điều này hoạt động theo cách đa nền tảng (có nghĩa là Windows và Mac, xin lỗi Linux). Tôi rất vui khi thực hiện một VBScript trong Windows, hoặc AppleScript trong OS X. Nhưng tôi không có ý tưởng những gì các script nên chứa. Tôi rất thích thực thi chương trình mặc định của người dùng so với chỉ tìm kiếm Outlook hoặc bất kỳ thứ gì.

Trong OS X, tôi đã cố gắng thực hiện lệnh:

open mailto:?subject=MySubject&body=TheBody 

URL thoát là cần thiết để thay dấu cách bằng %20.

Cập nhật Trên Windows, bạn phải chơi tất cả các loại trò chơi để nhận start để chạy chính xác. Đây là câu thích hợp Java thích hợp:

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

Trả lời

10

Trong Java 1.6, bạn có một cách để mở trình gửi thư mặc định của nền tảng: the Desktop.mail(URI) method. URI có thể được sử dụng để đặt tất cả các trường của thư (người gửi, người nhận, nội dung, chủ đề). Bạn có thể kiểm tra một ví dụ đầy đủ tích hợp máy tính để bàn trong Java 1.6 trên Using the Desktop API in Java SE 6

2

Mailto không phải là tuyến đường xấu. Nhưng như bạn đã đề cập, bạn sẽ cần phải chắc chắn rằng nó được mã hóa chính xác.

Vấn đề chính khi sử dụng mailto là với các đường đứt đoạn. Sử dụng% 0A để trả về vận chuyển,% 20 cho khoảng trống.

Ngoài ra, hãy nhớ rằng mailto được coi giống như một URL các loại và do đó sẽ có cùng giới hạn về độ dài. Xem http://support.microsoft.com/kb/208427, lưu ý độ dài URL tối đa 2083 ký tự. Điều này được xác nhận cho mailto cũng như trong bài viết này: http://support.microsoft.com/kb/279460/en-us. Ngoài ra, một số ứng dụng thư cũng có thể có giới hạn (tôi tin rằng các phiên bản cũ hơn của Outlook Express có giới hạn nhỏ hơn 483 ký tự hoặc thứ gì đó. Nếu bạn mong đợi có chuỗi dài hơn thì bạn sẽ cần phải xem xét các lựa chọn thay thế

BTW, bạn không cần phải sử dụng kịch bản để làm điều đó miễn là bạn có thể đưa ra một lệnh từ Java (tôi không biết liệu bạn có thể làm được vì tôi không làm Java) .

4

1. Thêm một dòng tiêu đề thư

Bạn có thể điền trước dòng tiêu đề trong email bằng cách thêm chủ đề trước bởi '? subject = 'sau địa chỉ email.

Vì vậy, các liên kết lúc này là:

<a href="mailto:[email protected]?subject=Mail from Our Site">Email Us</a> 

2. Send to Nhiều người nhận

Mail có thể được gửi đến người nhận bổ sung hoặc là bản sao carbon (cc) hoặc bản sao blind carbon (bcc) .

Điều này được thực hiện theo cách tương tự, bằng cách đặt '[email protected]' sau địa chỉ ban đầu.

Vì vậy, các liên kết trông như thế này:

<a href="mailto:[email protected][email protected]">Email Us</a> 

cc chỉ có thể được thay thế bằng bcc nếu bạn muốn gửi bản sao carbon mù.

Điều này có thể rất hữu ích nếu bạn có liên kết trên các trang có chủ đề khác nhau. Bạn có thể có email trên mỗi trang đi đến người thích hợp trong một công ty nhưng với một bản sao của tất cả các thư được gửi đến một địa chỉ trung tâm cũng có.

Bạn có thể chỉ định nhiều hơn một người nhận bổ sung, chỉ cần tách danh sách người nhận bằng dấu phẩy.

<a href="mailto:[email protected][email protected], [email protected], [email protected]">Email Us</a> 

Mua từ Getting More From 'mailto' hiện là 404s. Tôi lấy nội dung từ waybackmachine.

3. Kết hợp Mã

Bạn có thể kết hợp các bit khác nhau của mã trên bằng cách cho thêm một '&' giữa mỗi.

Như vậy thêm

[email protected]?subject=Hello&[email protected]&[email protected] 

sẽ gửi một email với chủ đề 'Hello' với tôi, bạn và cô ấy.

4. Viết Email

Bạn cũng có thể điền trước cơ thể của email với sự bắt đầu của một tin nhắn, hoặc viết toàn bộ tin nhắn nếu bạn muốn! Để thêm một số thứ vào phần thân của email, nó lại đơn giản như trên - '? Body =' sau địa chỉ email. Tuy nhiên định dạng email đó có thể hơi phức tạp một chút. Để tạo khoảng trắng giữa các từ, bạn sẽ phải sử dụng mã hex - ví dụ '% 20' giữa mỗi từ và để tạo các dòng mới sẽ có nghĩa là thêm '% 0D'. Các biểu tượng tương tự như các dấu hiệu $ sẽ cần phải được viết bằng mã hex.

Nếu bạn cũng muốn thêm dòng tiêu đề và gửi bản sao cho nhiều người nhận, điều này có thể khiến bạn viết mã rất dài và khó viết.

Nó sẽ gửi một tin nhắn cho ba người, với chủ đề và tin nhắn được điền vào, tất cả những gì bạn cần làm là thêm tên của bạn.

Chỉ cần nhìn vào mã!

<a href="mailto:[email protected][email protected] 
&BCC=t[email protected]&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> 

Lưu ý: URL nguồn gốc nơi tôi tìm thấy này hiện 404ing vì vậy tôi grabbed to content from waybackmachine và đăng nó ở đây vì vậy nó không bị lạc. Ngoài ra, OP nói rằng nó không phải cho một trang web, đó là những gì các ví dụ này, nhưng một số các kỹ thuật này vẫn có thể hữu ích.

0

Tôi đã triển khai tính năng này và hoạt động tốt trên OS X. (Đề cập của Ryan về độ dài URL tối đa chưa được mã hóa.)

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

Tôi đã phải triển khai lại URL mã bởi vì Java sẽ sử dụng + cho không gian và Mail đã thực hiện theo nghĩa đen. Chưa thử nghiệm trên Windows.

3

Tôi đã phải triển khai lại URL mã vì Java sẽ sử dụng + cho không gian và Mail đã thực hiện theo nghĩa đen.

Tôi không biết nếu Java có một số được xây dựng trong phương pháp cho urlencoding chuỗi, nhưng liên kết này http://www.permadi.com/tutorial/urlEncoding/ cho thấy một số ký tự phổ biến nhất để mã hóa:

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

start hoạt động tốt trong Windows (xem bên dưới). Tôi sẽ sử dụng UrlEscape được tích hợp sẵn của Java, sau đó chỉ chạy một thay thế thứ hai cho các ký tự '+'.

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

Tôi không biết nếu Java có một số được xây dựng trong phương pháp cho urlencoding chuỗi, nhưng liên kết này http://www.permadi.com/tutorial/urlEncoding/ cho thấy một số ký tự phổ biến nhất để mã hóa:

Đối với tỷ trọng mã hóa tên và hvalues ​​mailto URI, tôi sử dụng các quy tắc tại http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#encoding. Dưới http://shadow2531.com/opera/testcases/mailto/modern_mailto_uri_scheme.html#implementations, có một ví dụ Java có thể hữu ích.

Về cơ bản, tôi sử dụng:

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

Chuỗi đó là thông qua năm phải là một chuỗi với \ r \ n, và hoang \ r đã bình thường hóa \ n. Cũng cần lưu ý rằng chỉ cần trả về chuỗi gốc trên một ngoại lệ như trên chỉ an toàn nếu đối số mailto URI mà bạn truyền trên dòng lệnh được thoát và trích dẫn đúng cách.

Trên cửa sổ đó có nghĩa là:

  1. Trích lập luận.
  2. Thoát bất kỳ "bên trong dấu ngoặc kép với \.
  3. Thoát bất kỳ \ nào đứng trước" hoặc kết thúc chuỗi bằng \.

Ngoài ra, trên cửa sổ, nếu bạn đang xử lý các chuỗi UTF-16 như trong Java, bạn có thể muốn sử dụng ShellExecuteW để "mở" mailto URI. Nếu bạn không và trả về một ngoại lệ (trong đó một số hvalue không hoàn toàn được mã hóa phần trăm, bạn có thể sẽ thu hẹp một số ký tự rộng và mất thông tin. Nhưng không phải tất cả các ứng dụng thư đều chấp nhận các đối số unicode, vì vậy, lý tưởng là bạn muốn để vượt qua một cuộc tranh luận ascii đúng trăm mã hóa-utf8 với ShellExecute.

Giống như 'start', ShellExecute với "mở" nên mở mailto URI trong client mặc định.

Không chắc về hệ điều hành khác.

3

Không bao giờ sử dụng Runtime.exec(String) trên Mac OS X hoặc bất kỳ hệ điều hành nào khác.Nếu bạn làm điều đó, bạn sẽ phải tìm ra cách báo giá đúng tất cả các chuỗi đối số, v.v., đó là một nỗi đau và rất dễ bị lỗi.

Thay vào đó, hãy sử dụng Runtime.exec(String[]) để lấy một mảng các đối số đã được phân tách. Điều này phù hợp hơn cho hầu hết mọi công dụng.

1

Bạn có thể sử dụng này ...

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

Ngoài ra để định dạng đọc A simple way of sending emails in Java: mail-to links

Các vấn đề liên quan