Java 启动用户';s带有预附加附件的标准邮件客户端
我正在寻找一种方法,我的应用程序可以调用用户的标准邮件应用程序(例如Outlook、Thunderbird等)。并给它一个收件人地址,电子邮件文本和附件 因此,基本上,标准的电子邮件应用程序应该弹出,为我准备好电子邮件(包括收件人、文本和附件),剩下要为我做的就是在我的outlook、thunderbird等中按“发送” 我在谷歌上搜索了一段时间,但找不到真正的解决办法 我一直在研究mapi,但它似乎是1。这是不推荐的和2。它主要是为outlook而构建的 非常感谢任何帮助/建议/解决方案 编辑:我看到了这个问题,但是没有提供有效的答案,而且这个问题已经有3年多的历史了 编辑:其他语言也可以。必须在Windows XP、Vista、7、8(32位和64位)上工作 更新:这似乎比我想象的要困难。Java 启动用户';s带有预附加附件的标准邮件客户端,java,c#,c++,email,email-attachments,Java,C#,C++,Email,Email Attachments,我正在寻找一种方法,我的应用程序可以调用用户的标准邮件应用程序(例如Outlook、Thunderbird等)。并给它一个收件人地址,电子邮件文本和附件 因此,基本上,标准的电子邮件应用程序应该弹出,为我准备好电子邮件(包括收件人、文本和附件),剩下要为我做的就是在我的outlook、thunderbird等中按“发送” 我在谷歌上搜索了一段时间,但找不到真正的解决办法 我一直在研究mapi,但它似乎是1。这是不推荐的和2。它主要是为outlook而构建的 非常感谢任何帮助/建议/解决方案 编辑
我一直在研究,它显然只适用于32位系统。
我也在codeproject.org(and)上看到了这些解决方案,但不知何故,我无法让它们发挥作用。
现在我尝试使用命令行执行此操作:
1.读取用户的默认邮件客户端
2.根据电子邮件客户端调用批处理文件。(是的,您必须为每个普通邮件客户端编写批处理文件。
outlook示例:
"outlook.exe" /a "F:\test.png" /m "test.test@test.test&cc=test@test.test&subject=subject123&body=Hello, how are you%%3F%%0D%%0Anew line"
-->有关该方法的更多信息,请参阅我提供的答案您可以使用C#:或java:
编辑
您可以使用ssl并通过smtp发送电子邮件。您可以使用C#:或java:
编辑
您可以使用ssl并通过smtp发送电子邮件。您可以使用C#:或java:
编辑
您可以使用ssl并通过smtp发送电子邮件。您可以使用C#:或java:
编辑
您可以使用ssl并通过smtp发送电子邮件,因此
经过几天的研究,我放弃了寻找一个普遍的解决方案。
我提出了一个至少适用于两个最常见客户(Thunderbird&Outlook)的解决方案
我的解决方案基本上是从命令行调用应用程序
对于那些感兴趣的人,这里是我的解决方案:(我还没有跨平台测试过它——不过可以在我的旧XP笔记本电脑上使用)
这是Windows注册表类:(从中获取)
所以
经过几天的研究,我放弃了寻找一个普遍的解决方案。
我提出了一个至少适用于两个最常见客户(Thunderbird&Outlook)的解决方案
我的解决方案基本上是从命令行调用应用程序
对于那些感兴趣的人,这里是我的解决方案:(我还没有跨平台测试过它——不过可以在我的旧XP笔记本电脑上使用)
这是Windows注册表类:(从中获取)
所以
经过几天的研究,我放弃了寻找一个普遍的解决方案。
我提出了一个至少适用于两个最常见客户(Thunderbird&Outlook)的解决方案
我的解决方案基本上是从命令行调用应用程序
对于那些感兴趣的人,这里是我的解决方案:(我还没有跨平台测试过它——不过可以在我的旧XP笔记本电脑上使用)
这是Windows注册表类:(从中获取)
所以
经过几天的研究,我放弃了寻找一个普遍的解决方案。
我提出了一个至少适用于两个最常见客户(Thunderbird&Outlook)的解决方案
我的解决方案基本上是从命令行调用应用程序
对于那些感兴趣的人,这里是我的解决方案:(我还没有跨平台测试过它——不过可以在我的旧XP笔记本电脑上使用)
这是Windows注册表类:(从中获取)
此处阅读:@sina72已阅读完毕,似乎对这个问题没有给出真正的解决方案(答案在64位系统上不起作用)还有一个问题是3年前的事了——有很多时间可以找到新的解决方案。预先附加附件有多重要?因为
mailto:
处理程序应该可以做其他任何事情。@stripybadger是的,我也研究过这个问题。但对我来说,预先附加附件是非常重要的。如果你能做到的话了解如何从批处理文件启动它,您可以使用运行时启动它,如:Runtime.getRuntime().exec(“cmd.exe/c start”);此处阅读:@sina72已完成阅读,似乎没有给出此问题的真正解决方案(答案在64位系统上不起作用)还有一个问题是3年前的事了——有很多时间可以找到新的解决方案。预先附加附件有多重要?因为mailto:
处理程序应该可以做其他任何事情。@stripybadger是的,我也研究过这个问题。但对我来说,预先附加附件是非常重要的。如果你能做到的话了解如何从批处理文件启动它,您可以使用运行时启动它,如:Runtime.getRuntime().exec(“cmd.exe/c start”);此处阅读:@sina72已完成阅读,似乎没有给出此问题的真正解决方案(答案在64位系统上不起作用)还有一个问题是3年前的事了——有很多时间可以找到新的解决方案。预先附加附件有多重要?因为mailto:
处理程序应该可以做其他任何事情。@stripybadger是的,我也研究过这个问题。但对我来说,预先附加附件是非常重要的。如果你能做到的话了解如何从批处理文件启动它,您可以使用运行时启动它,如:Runtime.getRuntime().exec(“cmd.exe/c start”);此处阅读:@sina72已完成阅读,似乎没有给出此问题的真正解决方案(答案在64位系统上不起作用)还有一个问题是3年前的事了——新的解决方案出现的时间很多。预先附加附件有多重要?因为mailto:
处理程序应该能够
import java.io.IOException;
/*
:: Punctuation Hexadecimal equivalent
:: ----------------------------------------------
:: Space ( ) %20
:: Comma (,) %2C
:: Question mark (?) %3F
:: Period (.) %2E
:: Exclamation point (!) %21
:: Colon (:) %3A
:: Semicolon (;) %3B
:: Line feed %0A --> New line %0D%0A
:: Line break (ENTER key) %0D --> New line %0D%0A
*/
public class Main {
static String test = "hi";
private static String attachment;
private static String to;
private static String cc;
private static String subject;
private static String body;
public static void main (String[] args){
attachment = "F:\\pietquest.png";
to = "test@test.de";
cc = "a.b@c.de";
subject = "TestSubject 123";
body = "Hi, what\'s going on%0D%0Anew line";
body = replace(body);
subject = replace(subject);
String[] value = WindowsRegistry.readRegistry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Clients\\Mail", "");
if (value[10].contains("Thunderbird")){
System.out.println("Thunderbird");
String[] pfad = WindowsRegistry.readRegistry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Clients\\Mail\\Mozilla Thunderbird\\shell\\open\\command", "");
String Pfad = pfad[10] + " " + pfad[11];
String argument = Pfad + " /compose \"to=" + to + ",cc=" + cc + ",subject=" + subject + ",body=" + body + ",attachment=" + attachment + "\"";
// System.out.println(argument);
try {
Runtime.getRuntime().exec(argument);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else if (value[10].contains("Outlook")){
System.out.println("Outlook");
String[] pfad = WindowsRegistry.readRegistry(
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Clients\\Mail\\Microsoft Outlook\\shell\\open\\command", "");
String Pfad = pfad[10];
String argument = Pfad + " /a " + attachment + " /m \"" + to
+ "&cc=" + cc + "&subject=" + subject + "&body=" + body + "\"";
// System.out.println(argument);
try {
Runtime.getRuntime().exec(argument);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static String replace(String toReplace){
toReplace = toReplace.replace(" ", "%20");
toReplace = toReplace.replace(",", "%2C");
toReplace = toReplace.replace("?", "%3F");
toReplace = toReplace.replace(".", "%2E");
toReplace = toReplace.replace("!", "%21");
toReplace = toReplace.replace(":", "%3A");
toReplace = toReplace.replace(";", "%3B");
return toReplace;
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
public class WindowsRegistry {
/**
*
* @param location path in the registry
* @param key registry key
* @return registry value or null if not found
*/
public static final String[] readRegistry(String location, String key){
try {
// Run reg query, then read output with StreamReader (internal class)
Process process = Runtime.getRuntime().exec("reg query " +
'"'+ location);
StreamReader reader = new StreamReader(process.getInputStream());
reader.start();
process.waitFor();
reader.join();
// Parse out the value
String[] parsed = reader.getResult().split("\\s+");
if (parsed.length > 1) {
return parsed;
}
} catch (Exception e) {}
return null;
}
static class StreamReader extends Thread {
private InputStream is;
private StringWriter sw= new StringWriter();
public StreamReader(InputStream is) {
this.is = is;
}
public void run() {
try {
int c;
while ((c = is.read()) != -1)
sw.write(c);
} catch (IOException e) {
}
}
public String getResult() {
return sw.toString();
}
}