JavaMail和Mandril在GlassFish上的应用

4

以下是我的glassfish-resources.xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE resources PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//EN" "http://glassfish.org/dtds/glassfish-resources_1_5.dtd">
<resources>
    <mail-resource debug="true"
                   enabled="true"
                   from="foo@bar.com"
                   host="smtp.mandrillapp.com"
                   jndi-name="java:app/mail/mySession"
                   object-type="user"
                   store-protocol="imap"
                   store-protocol-class="com.sun.mail.imap.IMAPStore"
                   transport-protocol="smtp"
                   transport-protocol-class="com.sun.mail.smtp.SMTPTransport"
                   user="foo@bar.com">
        <description/>
        <property name="mail.user" value="foo@bar.com"/>
        <property name="mail.password" value="password"/>
        <property name="mail.host" value="smtp.mandrillapp.com"/>
        <property name="mail.port" value="587"/>
        <property name="mail.smtp.socketFactory.port" value="587"/>
        <property name="mail.smtp.socketFactory.fallback" value="false"/>
        <property name="mail.smtp.auth" value="true"/>
        <property name="mail.smtp.starttls.enable" value="true"/>
    </mail-resource>
</resources>

发送电子邮件的方法:

public static void sendEmail(final Session session,
                             final String from,
                             final String to,
                             final String subject,
                             final String htmlPart,
                             final String txtPart)
        throws AddressException,
               MessagingException
{
    MimeMessage message = new MimeMessage(session);
    message.setSender(new InternetAddress(from));
    InternetAddress toAddress = new InternetAddress(to);
    message.setRecipient(RecipientType.TO, toAddress);
    message.setSubject(subject);

    // Create a multipart message consisting of a HTML body with an alternate plain text version.
    MimeMultipart mp = new MimeMultipart("alternative");

    // Plain text part.
    MimeBodyPart textPlainPart = new MimeBodyPart();
    textPlainPart.setContent(txtPart, "text/plain");
    mp.addBodyPart(textPlainPart);

    // HTML part.
    MimeBodyPart textHtmlPart = new MimeBodyPart();
    textHtmlPart.setContent(htmlPart, "text/html");
    mp.addBodyPart(textHtmlPart);

    // Put it all together.
    message.setContent(mp);
    message.saveChanges();

    // Send the email.
    Transport tr = session.getTransport("smtp");

    String user = session.getProperty("mail.user");
    String smtpPassword = session.getProperty("mail.password");
    String smtpHost = session.getProperty("mail.host");
    int port = Integer.parseInt(session.getProperty("mail.port"));

    tr.connect(smtpHost, port, user, smtpPassword);
    tr.sendMessage(message, new Address[] { toAddress });
    tr.close();
}

当我调用上述方法时,似乎什么都没发生。它在不抛出异常的情况下到达了结尾,但我没有收到任何电子邮件。
显然,我已经配置错误,因为我已经能够使用电子邮件客户端通过Mandrill发送电子邮件。

JavaMail FAQ中提供了调试技巧 - Bill Shannon
是的,正如你所看到的,在配置文件中调试已经开启。但是信息并不是很有帮助。无论如何,我现在不再直接使用javamail了。但是我会保持这个问题处于开放状态,以防还有其他好的想法。 - Steve
无益的调试信息显示了什么?它们显示您的邮件服务器接受消息并返回成功吗?如果是这样的话,问题就出在您的邮件服务器上,而不是您的JavaMail代码上。检查您的邮件服务器日志文件。 - Bill Shannon
记不清了。正如我之前所说的,当与邮件客户端以及简单的javamail包装器一起使用时,Mandrill没有任何问题。这里的问题是如何配置和使用GlassFish中的javamail资源。 - Steve
1个回答

4
我已经成功使用JavaMail和Mandrill发送信息。我使用了一种略微不同的方法,暴露了JavaMail中的一个错误: 也许你也遇到了同样的错误? 下面的代码对我有效。
mailProperties.setProperty("mail.transport.protocol", "smtp");
mailProperties.setProperty("mail.smtp.host", host);
mailProperties.setProperty("mail.smtp.port", String.valueOf(port));
mailProperties.setProperty("mail.smtp.user", username);

final Session session = Session.getInstance(mailProperties, null);
session.setPasswordAuthentication(
        new URLName("smtp", host, -1, null, username, null),
        new PasswordAuthentication(username, password)
);

final MimeMessage msg = new MimeMessage(session);
// set required message properties

Transport.send(msg);

你可以阅读我关于smtp身份验证的博客文章,了解更多有关此漏洞的信息。


有趣。我可能会试一下,看看能否在glassfish-resources.xml中进行配置。 - Steve
这个 bug 是什么?对于我的情况,我似乎无法让它使用不同的端口。 - Archimedes Trajano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接