My favorites | 中文(简体) | Sign in

使用 JavaMail

邮件服务 Java API 支持用于发送电子邮件的 JavaMail (javax.mail) 接口。

有关详细信息,请参阅 Sun 的 JavaMail API 参考

发送电子邮件

为了发送电子邮件,应用程序将准备一个 MimeMessage 对象,然后用 Transport 类上的 send() 方法发送该对象。使用 JavaMail Session 对象创建消息。无需任何其他配置,Session 和 Transport 即可用于 App Engine 邮件服务。

import java.util.Properties;
import javax.mail.AddressException;
import javax.mail.InternetAddress;
import javax.mail.MessagingException;
import javax.mail.MimeMessage;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;

// ...
        Properties props = new Properties();
        Session session = Session.getDefaultInstance(props, null);

        String msgBody = "...";

        try {
            Message msg = new MimeMessage(session);
            msg.setFrom(new InternetAddress("admin@example.com"));
            msg.addRecipient(Message.RecipientType.TO,
                             new InternetAddress("user@example.com"));
            msg.setSubject("Your Example.com account has been activated");
            msg.setText(msgBody);
            Transport.send(msg);

        } catch (AddressException e) {
            // ...
        } catch (MessagingException e) {
            // ...
        }

对邮件服务的调用是异步的,且立即返回。邮件服务对联系收件人邮件服务器和传递消息的进程进行管理。如果在将消息发送到任意收件人时发生问题,或者如果收件人的邮件服务器返回“退回”消息,那么发件人将收到错误消息。

发件人和收件人

使用 InternetAddress 类的实例,在 JavaMail 中将显示发件人和收件人电子邮件地址。构造函数取字符串形式的电子邮件地址,并在该地址未表示为有效电子邮件地址时引发 AddressException。

为了设置发件人地址,应用程序将调用 MimeMessage 对象上的 setFrom() 方法。发件人必须为应用程序的注册开发人员地址,或通过 Google 帐户登录的当前请求的用户地址。

MimeMessage 对象上的几种方法确立了收件人。addRecipient() 方法取收件人类型和地址,并将其添加到该类型的收件人列表。收件人类型可以是 Message.RecipientType.TOMessage.RecipientType.CCMessage.RecipientType.BCC 中的任意一种。

您可以使用 setReplyTo() 方法设置“回复”地址。

消息和标头

通过调用 MimeMessage 对象上的方法来确立消息的内容。setSubject() 方法设置主题,而 setText() 方法设置(纯文本)正文内容。

出于安全方面的考虑,邮件服务不允许在传出电子邮件上使用任意标头。邮件服务将覆盖某些标头,如消息发送日期。添加到传出消息的其他标头将被去除。

多部分消息

您可以使用多部分消息来发送带文件附件的消息,或除了纯文本消息正文外还带有 HTML 消息正文的消息。创建一个要包含各部分的 MimeMultipart 对象,然后为每个附件或备用消息正文创建一个 MimeBodyPart 对象,并将其添加到容器。最后,将该容器分配到 MimeMessage 的内容。

import javax.mail.MimeBodyPart;
import javax.mail.MimeMultipart;
import javax.mail.Multipart;
import javax.activation.DataHandler;

// ...
        String htmlBody;        // ...
        byte[] attachmentData;  // ...

        Multipart mp = new MimeMultipart();

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

        MimeBodyPart attachment = new MimeBodyPart();
        attachment.setFileName("manual.pdf");
        attachment.setContent(attachmentData, "application/pdf");
        mp.addBodyPart(attachment);

        message.setContent(mp);

出于安全方面的考虑,消息部分和附件必须是几种允许类型之一,而且附件文件名的结尾必须是允许类型认可的文件扩展名。有关允许类型和文件扩展名的列表,请参阅概述:附件

不支持 JavaMail 功能

应用程序无法接收电子邮件。

应用程序无法使用 JavaMail 接口连接到用于发送或接收电子邮件的其他电子邮件服务。忽略添加到 Transport 或 Session 的 SMTP 配置。

低级 API 的功能

低级邮件服务 API 的所有功能在 JavaMail 接口中都可用。

低级 API 包括向所有应用程序管理员发送邮件的便利方法。要在 JavaMail 完成此操作,请使用 admin@.(“admin”、@ 符号和句号)作为收件人。