如何配置环境以使用 JavaMail?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1946032/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to configure environment to use JavaMail?
提问by Roman
I need to send simple html-message with JavaMail. And when I tried to find some nice examples with explanations in the Internet, each next example made me more angry and angry.
我需要使用 JavaMail 发送简单的 html 消息。而当我试图在互联网上找到一些很好的例子和解释时,接下来的每一个例子都让我更加生气和愤怒。
All those silly examples contain copied and pasted Java code which differs only in comments and a nice disclaimer that first you should config your smtp and pop3 server.
所有这些愚蠢的示例都包含复制和粘贴的 Java 代码,这些代码的区别仅在于注释和一个很好的免责声明,即首先您应该配置您的 smtp 和 pop3 服务器。
I understand that nobody wants to make an advertise for some concrete products but configuring the server is imho the hardest part. So, can anyone give me some really useful information (without java code) about configuring concrete server (Kerio, for example, or any other one)?
我知道没有人想为某些具体产品做广告,但恕我直言,配置服务器是最难的部分。那么,谁能给我一些关于配置具体服务器(例如,Kerio 或任何其他服务器)的非常有用的信息(没有 Java 代码)?
What I have now is the next exception:
我现在拥有的是下一个例外:
250 2.0.0 Reset state
javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Relaying to <[email protected]> denied (authentication required)
UPD. Simple reformulation of all previous text is: imagine that you have Windows, jdk, and nothing else. And you want to make java program and run it on your machine. And this program should send "Hello world!" to your gmail account. List your steps.
更新。对之前所有文本的简单重新表述是:假设您有 Windows、jdk,没有其他任何东西。并且您想制作java程序并在您的机器上运行它。这个程序应该发送“Hello world!” 到您的 Gmail 帐户。列出你的步骤。
UPD2. Here is the code:
UPD2。这是代码:
Properties props = new Properties ();
props.setProperty ("mail.transport.protocol", "smtp");
props.setProperty ("mail.host", "smtp.gmail.com");
props.setProperty ("mail.user", "[email protected]");
props.setProperty ("mail.password", "password_from_email_above");
Session mailSession = Session.getDefaultInstance (props, null);
mailSession.setDebug (true);
Transport transport = mailSession.getTransport ();
MimeMessage message = new MimeMessage (mailSession);
message.setSubject ("HTML mail with images");
message.setFrom (new InternetAddress ("[email protected]"));
message.setContent ("<h1>Hello world</h1>", "text/html");
message.addRecipient (Message.RecipientType.TO,
new InternetAddress ("[email protected]"));
transport.connect ();
transport.sendMessage (message,
message.getRecipients (Message.RecipientType.TO));
And exception is:
例外是:
RSET
250 2.1.5 Flushed 3sm23455365fge.10
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. 3sm23455365fge.10
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1829)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1368)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:886)
at com.teamdev.imgmail.MailSender.main(MailSender.java:33)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
...
采纳答案by sfussenegger
If you're looking for a tutorial to configure an SMTP server, you shouldn't be looking for JavaMail. Simply look for a tutorial on your server of choice (Kerio, for example ... or Exim, SendMail, Apache James, Postfix) or ask on Serverfault. Any SMTP-compliant server will play nicely with JavaMail.
如果您正在寻找配置 SMTP 服务器的教程,您不应该寻找 JavaMail。只需在您选择的服务器(例如Kerio或Exim、SendMail、Apache James、Postfix)上查找教程,或询问Serverfault。任何符合 SMTP 的服务器都可以很好地与 JavaMail 配合使用。
Alternatively, you may even use any "standard" mail provider's infrastructure. For example, I use a Google Appsaccount along with Google's SMTP infrastructure to send mail from our Java applications. Using a Gmail accountis a good starting point anyway if you don't want to setup your own SMTP server in order to simply testdrive JavaMail.
或者,您甚至可以使用任何“标准”邮件提供商的基础设施。例如,我使用Google Apps帐户和 Google 的 SMTP 基础设施从我们的 Java 应用程序发送邮件。如果您不想设置自己的 SMTP 服务器以简单地测试驱动 JavaMail,那么使用 Gmail 帐户是一个很好的起点。
As a last option, you might even lookup the MX Recordsfor a domain and deliver your mails directly to the SMTP server of the recipient. There are some common gotchas to workaround tough.
作为最后一个选项,您甚至可以查找域的MX 记录并将您的邮件直接发送到收件人的 SMTP 服务器。有一些常见的问题可以解决棘手的问题。
As a last point, you'll have to look into how to avoid that your mails be filtered as spam - which is a huge topic itself. Here it helps to rely on standard providers that will deal with some of the issues you might encounter when hosting your own server.
最后一点,您必须研究如何避免您的邮件被过滤为垃圾邮件——这本身就是一个巨大的话题。在这里,依靠标准提供商会有所帮助,这些提供商将处理您在托管自己的服务器时可能遇到的一些问题。
Btw: Regarding the error message you posted: the SMTP server is denying relaying of messages. This is if your SMTP server (thinks that it) is running on example.com and you're sending as [email protected] to [email protected], you're asking the SMTP server to act as a relay. This was common practice several years ago, until it was - you guessed it - abused by spammers. Since those days, postmasters are encouraged to deny relaying. You have two choices: authenticate before sending mail or send to accounts hosted at your server only (i.e. on example.com, e.g. [email protected]).
顺便说一句:关于您发布的错误消息:SMTP 服务器拒绝转发消息。这是如果您的 SMTP 服务器(认为它)在 example.com 上运行,并且您以 [email protected] 的身份发送到 [email protected],则您要求 SMTP 服务器充当中继。这是几年前的常见做法,直到 - 您猜对了 - 被垃圾邮件发送者滥用。从那时起,鼓励邮政局长拒绝转发。您有两种选择:在发送邮件之前进行身份验证或仅发送到托管在您服务器上的帐户(即在 example.com 上,例如 [email protected])。
Edit:
编辑:
Here is some code to get you started with authenticationg (works with Gmail accounts but should do for your own server as well)
这里有一些代码可以让您开始使用身份验证(适用于 Gmail 帐户,但也适用于您自己的服务器)
private Session createSmtpSession() {
final Properties props = new Properties();
props.setProperty("mail.smtp.host", "smtp.gmail.com");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.port", "" + 587);
props.setProperty("mail.smtp.starttls.enable", "true");
// props.setProperty("mail.debug", "true");
return Session.getDefaultInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("[email protected]", "mypassword");
}
});
}
回答by Carl Smotricz
I can see part of your problem. It's adequately explained in the error message.
我可以看到你的问题的一部分。它在错误消息中得到了充分的解释。
The SMTP server you are sending your mail to (i.e. one of the addresses you've configured in your JavaMail configuration) is refusing to forward mail to [email protected]
. Looks like a configuration issue in your SMTP server. As sfussenegger indicated, it has nothing to do with javamail.
您将邮件发送到的 SMTP 服务器(即您在 JavaMail 配置中配置的地址之一)拒绝将邮件转发到[email protected]
。看起来像是 SMTP 服务器中的配置问题。正如 sfussenegger 所指出的,它与 javamail 无关。
So you're not debugging on all fronts at the same time, it might be a good idea to try addressing your SMTP server from a known working SMTP client. Thunderbird would do fine, for example. If you can send mail through it from Thunderbird, there should be little problem from JavaMail.
因此,您不会同时在所有方面进行调试,尝试从已知的工作 SMTP 客户端寻址您的 SMTP 服务器可能是个好主意。例如,Thunderbird 会做得很好。如果你可以通过它从 Thunderbird 发送邮件,那么 JavaMail 应该没有什么问题。
Update:
更新:
The correct address for Google's SMTP server is: smtp.gmail.com
. Is this the server you have configured in JavaMail? Can you show us the matching error message?
Google 的 SMTP 服务器的正确地址是:smtp.gmail.com
。这是您在 JavaMail 中配置的服务器吗?你能告诉我们匹配的错误信息吗?
回答by Adriaan Koster
This should work:
这应该有效:
import java.text.MessageFormat;
import java.util.List;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Emailer {
public static void main(String[] args) {
String hostname = args[0];
final String userName = args[1];
final String passWord = args[2];
String toEmail = args[3];
String fromEmail = args[4];
String subject = args[5];
String body = "";
// add rest of args as one body text for convenience
for (int i = 6; i < args.length; i++) {
body += args[i] + " ";
}
Properties props = System.getProperties();
props.put("mail.smtp.host", hostname);
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, passWord);
}
});
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(fromEmail));
message.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));
message.setSubject(subject);
message.setText(body);
Transport.send(message);
} catch (MessagingException e) {
System.out.println("Cannot send email " + e);
}
}
}
You need to put the JavaMail mail.jar on your classpath for the javax.mail dependencies. I'm not sure if Google lets you send email like you want to. How about trying another email provider, like your ISP's?
您需要将 JavaMail mail.jar 放在 javax.mail 依赖项的类路径上。我不确定 Google 是否允许您按照自己的意愿发送电子邮件。尝试其他电子邮件提供商如何,例如您的 ISP?
回答by Adrien Be
A working example combining the above answers, using activation-1.1.jarand mail-1.4.1.jarand the SMTP host is Gmail.
结合上述答案的一个工作示例,使用activation-1.1.jar和mail-1.4.1.jar以及 SMTP 主机是Gmail。
Replace
[email protected]
anduser_pw
in linereturn new PasswordAuthentication("[email protected]", "user_pw");
Also, you want to replace
[email protected]
by the email address where you want to receive the email.package com.test.sendEmail; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class sendEmailTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub sendEmailTest emailer = new sendEmailTest(); //the domains of these email addresses should be valid, //or the example will fail: emailer.sendEmail(); } /** * Send a single email. */ public void sendEmail(){ Session mailSession = createSmtpSession(); mailSession.setDebug (true); try { Transport transport = mailSession.getTransport (); MimeMessage message = new MimeMessage (mailSession); message.setSubject ("HTML mail with images"); message.setFrom (new InternetAddress ("[email protected]")); message.setContent ("<h1>Hello world</h1>", "text/html"); message.addRecipient (Message.RecipientType.TO, new InternetAddress ("[email protected]")); transport.connect (); transport.sendMessage (message, message.getRecipients (Message.RecipientType.TO)); } catch (MessagingException e) { System.err.println("Cannot Send email"); e.printStackTrace(); } } private Session createSmtpSession() { final Properties props = new Properties(); props.setProperty ("mail.host", "smtp.gmail.com"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.port", "" + 587); props.setProperty("mail.smtp.starttls.enable", "true"); props.setProperty ("mail.transport.protocol", "smtp"); // props.setProperty("mail.debug", "true"); return Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]", "user_pw"); } }); } }
替换
[email protected]
并user_pw
对齐return new PasswordAuthentication("[email protected]", "user_pw");
此外,您希望替换
[email protected]
为您希望接收电子邮件的电子邮件地址。package com.test.sendEmail; import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class sendEmailTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub sendEmailTest emailer = new sendEmailTest(); //the domains of these email addresses should be valid, //or the example will fail: emailer.sendEmail(); } /** * Send a single email. */ public void sendEmail(){ Session mailSession = createSmtpSession(); mailSession.setDebug (true); try { Transport transport = mailSession.getTransport (); MimeMessage message = new MimeMessage (mailSession); message.setSubject ("HTML mail with images"); message.setFrom (new InternetAddress ("[email protected]")); message.setContent ("<h1>Hello world</h1>", "text/html"); message.addRecipient (Message.RecipientType.TO, new InternetAddress ("[email protected]")); transport.connect (); transport.sendMessage (message, message.getRecipients (Message.RecipientType.TO)); } catch (MessagingException e) { System.err.println("Cannot Send email"); e.printStackTrace(); } } private Session createSmtpSession() { final Properties props = new Properties(); props.setProperty ("mail.host", "smtp.gmail.com"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.smtp.port", "" + 587); props.setProperty("mail.smtp.starttls.enable", "true"); props.setProperty ("mail.transport.protocol", "smtp"); // props.setProperty("mail.debug", "true"); return Session.getDefaultInstance(props, new javax.mail.Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]", "user_pw"); } }); } }