Wildfly javamail 和 mailsession 注入 向 SMTP 服务器发送 HELO 命令失败
Wildfly javamail and mailsession injection Failure sending HELO command to SMTP server
所以我需要一些说明。我正在尝试使用 google SMTP 服务器发送电子邮件,使用我的 google 应用程序帐户(免费的东西,而不是中继)。我正在使用 wildfly 10 容器(和 JSF),所以我的项目中没有 javamail jar(正确吗?)。所以在我的无状态 EJB 中,我进行了资源注入:
@Resource(name = "mail")
private javax.mail.Session mailSession;
在我的 standalone.xml:
<subsystem xmlns="urn:jboss:domain:mail:2.0">
<mail-session name="mail" jndi-name="java:/mail"/>
</subsystem>
所以我假设我不必在独立版本中定义端口、用户名和密码,如果我只是添加这样的属性:
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", "XXXX@gmail.com");
props.put("mail.smtp.password", "XXXX");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");
mailSession = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"XXXX@gmail.com", "XXXX");// Specify the Username and the PassWord
}
});
这是否正确,或者是否还需要在 standalone.xml 中定义?
所以我得到错误:
javax.mail.MessagingException: 向 SMTP 服务器发送 HELO 命令失败
感谢任何有关如何实现此工作的帮助!
完整代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.faces.component.UIInput;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
//import view.Info;
@Stateless
public class EmailEJB implements EmailBeanInterface {
@Resource(name = "mail")
private javax.mail.Session mailSession;
@PersistenceContext(unitName = "EmailEJB")
EntityManager em;
String amountToDisplay = null;
List<Info> emailList;
public void setAmountToDisplay(String amountToDisplay) {
this.amountToDisplay = amountToDisplay;
}
@PostConstruct
public void defaultList() {
String sqlPrepareStmt = "SELECT e FROM Info e WHERE id <=" + amountToDisplay;
emailList = (List<Info>) em.createQuery(sqlPrepareStmt, Info.class).getResultList();
}
public List<Info> getEmailList() {
return emailList;
}
public void send(ArrayList<String> managedList) {
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "false");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", "XXXX@gmail.com");
props.put("mail.smtp.password", "XXXX");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");
//Session mailSession = Session.getDefaultInstance(props);
// mailSession= Session.getDefaultInstance(props);
mailSession = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"XXXX", "XXXX");// Specify the Username and the PassWord
}
});
try {
MimeMessage m = new MimeMessage(mailSession);
Address from = new InternetAddress("XXXX@gmail.com");
Address[] to;
to = new Address[managedList.size()];
for (int i = 0; i < managedList.size(); i++) {
String emailString = managedList.get(i);
if(emailString.isEmpty() == true){
System.out.println("emailString is empty");
}
else{
to[i] = new InternetAddress(java.net.IDN.toASCII(emailString));
}
}
m.setRecipients(Message.RecipientType.TO, to);
m.setSubject("Wildfly 10 - Checkbox test");
m.setSentDate(new java.util.Date());
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText("testing application managed javamail props");
// Create a multipart message
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
m.setContent(multipart);
Transport transport = mailSession.getTransport("smtp");
transport.connect(host, "XXXX@gmail.com", "XXXX");
transport.send(m);
transport.close();
System.out.println("Mail sent!");
} catch (javax.mail.MessagingException e) {
e.printStackTrace();
}
}
}
这也是堆栈跟踪的一部分,会不会是 geronimo 的问题?我可以改用 sun 吗?如果可以,我该怎么做?
23:23:23,215 错误 [stderr](默认任务 5)在 org.apache.geronimo.javamail.transport.smtp.SMTPTransport.sendHelo(SMTPTransport.java:1914)
23:23:23,215 错误 [stderr](默认任务 5)在 org.apache.geronimo.javamail.transport.smtp.SMTPTransport.sendHandshake(SMTPTransport.java:1829)
23:23:23,216 错误 [stderr](默认任务 5)在 org.apache.geronimo.javamail.transport.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:393)
好吧,我认为我的道具中缺少 SSL 套接字工厂,但我现在切换到使用 TLS 并且它有效!这是一个 link:http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/ 真的,我只是把它复杂化了。
所以我需要一些说明。我正在尝试使用 google SMTP 服务器发送电子邮件,使用我的 google 应用程序帐户(免费的东西,而不是中继)。我正在使用 wildfly 10 容器(和 JSF),所以我的项目中没有 javamail jar(正确吗?)。所以在我的无状态 EJB 中,我进行了资源注入:
@Resource(name = "mail")
private javax.mail.Session mailSession;
在我的 standalone.xml:
<subsystem xmlns="urn:jboss:domain:mail:2.0">
<mail-session name="mail" jndi-name="java:/mail"/>
</subsystem>
所以我假设我不必在独立版本中定义端口、用户名和密码,如果我只是添加这样的属性:
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", "XXXX@gmail.com");
props.put("mail.smtp.password", "XXXX");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");
mailSession = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"XXXX@gmail.com", "XXXX");// Specify the Username and the PassWord
}
});
这是否正确,或者是否还需要在 standalone.xml 中定义?
所以我得到错误: javax.mail.MessagingException: 向 SMTP 服务器发送 HELO 命令失败
感谢任何有关如何实现此工作的帮助!
完整代码如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.faces.component.UIInput;
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
//import view.Info;
@Stateless
public class EmailEJB implements EmailBeanInterface {
@Resource(name = "mail")
private javax.mail.Session mailSession;
@PersistenceContext(unitName = "EmailEJB")
EntityManager em;
String amountToDisplay = null;
List<Info> emailList;
public void setAmountToDisplay(String amountToDisplay) {
this.amountToDisplay = amountToDisplay;
}
@PostConstruct
public void defaultList() {
String sqlPrepareStmt = "SELECT e FROM Info e WHERE id <=" + amountToDisplay;
emailList = (List<Info>) em.createQuery(sqlPrepareStmt, Info.class).getResultList();
}
public List<Info> getEmailList() {
return emailList;
}
public void send(ArrayList<String> managedList) {
Properties props = System.getProperties();
String host = "smtp.gmail.com";
props.put("mail.smtp.starttls.enable", "false");
props.put("mail.smtp.host", host);
props.put("mail.smtp.user", "XXXX@gmail.com");
props.put("mail.smtp.password", "XXXX");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.auth", "true");
//Session mailSession = Session.getDefaultInstance(props);
// mailSession= Session.getDefaultInstance(props);
mailSession = Session.getDefaultInstance(props,
new javax.mail.Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
"XXXX", "XXXX");// Specify the Username and the PassWord
}
});
try {
MimeMessage m = new MimeMessage(mailSession);
Address from = new InternetAddress("XXXX@gmail.com");
Address[] to;
to = new Address[managedList.size()];
for (int i = 0; i < managedList.size(); i++) {
String emailString = managedList.get(i);
if(emailString.isEmpty() == true){
System.out.println("emailString is empty");
}
else{
to[i] = new InternetAddress(java.net.IDN.toASCII(emailString));
}
}
m.setRecipients(Message.RecipientType.TO, to);
m.setSubject("Wildfly 10 - Checkbox test");
m.setSentDate(new java.util.Date());
BodyPart messageBodyPart = new MimeBodyPart();
// Fill the message
messageBodyPart.setText("testing application managed javamail props");
// Create a multipart message
Multipart multipart = new MimeMultipart();
// Set text message part
multipart.addBodyPart(messageBodyPart);
m.setContent(multipart);
Transport transport = mailSession.getTransport("smtp");
transport.connect(host, "XXXX@gmail.com", "XXXX");
transport.send(m);
transport.close();
System.out.println("Mail sent!");
} catch (javax.mail.MessagingException e) {
e.printStackTrace();
}
}
}
这也是堆栈跟踪的一部分,会不会是 geronimo 的问题?我可以改用 sun 吗?如果可以,我该怎么做?
23:23:23,215 错误 [stderr](默认任务 5)在 org.apache.geronimo.javamail.transport.smtp.SMTPTransport.sendHelo(SMTPTransport.java:1914)
23:23:23,215 错误 [stderr](默认任务 5)在 org.apache.geronimo.javamail.transport.smtp.SMTPTransport.sendHandshake(SMTPTransport.java:1829)
23:23:23,216 错误 [stderr](默认任务 5)在 org.apache.geronimo.javamail.transport.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:393)
好吧,我认为我的道具中缺少 SSL 套接字工厂,但我现在切换到使用 TLS 并且它有效!这是一个 link:http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/ 真的,我只是把它复杂化了。