使用JavaMail发送邮件时判断发送结…

本文介绍如何使用JavaMail正确发送邮件并获取发送结果,包括通过监听器判断邮件发送状态,以及如何设置合理的连接超时和读取超时时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    1、获取邮件发送结果
    网上看大多数例子,都是调用Transport类的sendMessage方法后就收工了。但 sendMessage方法没有返回值的,而且是一个异步的方法(也就是函数调用结束的时候邮件的发送过程并未结束)。我们可以通过 Transport的addTransportListener方法增加邮件发送结果的Listener,Listener 接口有三个方法:
void messageDelivered(TransportEvent arg0);                 // 邮件发送成功
void messageNotDelivered(TransportEvent arg0);           // 邮件发送失败
void messagePartiallyDelivere d(TransportEvent arg0);   // 邮件部分发送成功
    注意,由于 sendMessage是异步方法,我们不能简单的:  addTransportListener ->  sendMessage -> 判断发送是否成功,因为这时候邮件发送的过程可能还没有结束。我们可以通过多线程Future模式来将异步的调用转为阻塞的同步调用,Future相关的代码:
private enum DeliveredState {
        INITIAL, MESSAGE_DELIVERED, MESSAGE_NOT_DELIVERED, MESSAGE_PARTIALLY_DELIVERED,
  }
  private static class DeliveredStateFuture {
        private DeliveredState state = DeliveredState.INITIAL;
        synchronized void waitForReady() throws InterruptedException {
            if (state == DeliveredState.INITIAL) {
                wait();
            }
        }
        synchronized DeliveredState getState() {
            return state;
        }
        synchronized void setState(DeliveredState newState) {
            state = newState;
            notifyAll();
        }
}
    发送邮件的代码:
final DeliveredStateFuture future = new DeliveredStateFuture();
transport.addTransportListener(new TransportListener() {
    public void messageDelivered(TransportEvent arg0) {
        future.setState(DeliveredState.MESSAGE_DELIVERED);
    }
    public void messageNotDelivered(TransportEvent arg0) {
        future.setState(DeliveredState.MESSAGE_NOT_DELIVERED);
    }
    public void messagePartiallyDelivere d(TransportEvent arg0) {
        future.setState(DeliveredState.MESSAGE_PARTIALLY_DELIVERED);
    }
});
transport.connect();
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
future.waitForReady();
    2、设置连接超时和读超时
    使用JavaMail用SMTP发送邮件,可以通过 mail.smtp.connectiontimeout和 mail.smtp.timeout这两个属性分别设置连接超时和读超时。That's all,才怪。因为我这么做可耻地失败了,还是需要等待5分钟才抛出异常。我不生产答案,我是stackoverflow的搬运工: 《Why JavaMail connection timeout is too long》。简单说:那是因为使用的javamail版本太低(开头使用的是1.4),下载最新版(1.5)的javamail jar替换后就可以了。所以如果发现那两个属性设置没有效果,检查一下使用的javamail版本。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值