Wildfly javamail 和邮件会话注入 将 HELO 命令发送到 SMTP 服务器失败



所以我需要一些澄清。我正在尝试使用谷歌SMTP服务器发送电子邮件,使用我的谷歌应用程序计数,(免费的东西,而不是中继)。我使用的是野蝇 10 容器(和 JSF),所以我的项目中没有 javamail jar(正确吗?所以在我的无状态 EJB 中,我做了一个资源注入:

@Resource(name = "mail")
private javax.mail.Session mailSession;

在我的独立.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
                }
        });  

这是正确的,还是也需要在独立.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 ERROR [stderr] (default task-5) at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.sendHelo(SMTPTransport.java:1914)

23:

23:23,215 错误 [stderr] (默认任务-5) at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.sendHandshake(SMTPTransport.java:1829)

23:

23:23,216 错误 [stderr] (默认任务-5) at org.apache.geronimo.javamail.transport.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:393)

好吧,我认为我的道具中缺少SSL套接字工厂,但是我现在改用TLS,它可以工作!这是一个链接: http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/真的,我只是把它复杂化了。

最新更新