java emailhelper 发送短信

package com.lian.asearch.report.commons;

import com.lian.asearch.queue.MemoryQueue4Sink;
import com.lian.asearch.queue.MessageQueue4Sink;
import com.google.common.base.Throwables;
import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe;
import com.google.inject.Singleton;
import com.google.inject.name.Named;
import jodd.mail.Email;
import jodd.mail.SendMailSession;
import jodd.mail.SmtpServer;
import org.omg.CORBA.TIMEOUT;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Inject;
import java.net.SocketTimeoutException;
import java.util.Arrays;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

/**
 * TODO::Document me
 *
 * @author Lian
 * @version V1
 * @since 2015-09-24 17:58
 */
@Singleton
public class EmailHelper {
    private final String useName;
    private final String password;
    private final String host;
    private static final Logger log = LoggerFactory.getLogger(EmailHelper.class);
    private static final MessageQueue4Sink<Email> emailQueue = new MemoryQueue4Sink<>(100);
    private static AtomicBoolean isRunning = new AtomicBoolean(true);

    @Inject
    public EmailHelper(@Named("Email.userName") String useName,
                       @Named("Email.password") String password,
                       @Named("Email.smtpHostName") String host) {
        this.useName = useName;
        this.password = password;
        this.host = host;
        initMailSession();
        new SendThread().start();
    }

    public String getUseName() {
        return useName;
    }


    public void sendEmail(Email email) {
        emailQueue.offer(email);
    }


    public SendMailSession initMailSession() {
        SmtpServer smtpServer = SmtpServer
                .create(this.host, 25)
                .property("mail.smtp.auth", "true")
                .authenticateWith(this.useName, this.password);
        SendMailSession session = smtpServer.createSession();
        session.open();
        return session;
    }


    private String _retryingSendMail(SendMailSession session, Email email, int numTries, int tryNum) {
        if (tryNum > numTries) {
            log.error("send email {},after trying :{} times, error,forget it", Arrays.toString(email.getTo()), tryNum);
            return null;
        }
        try {
            return session.sendMail(email);
        } catch (IllegalStateException e) {
            log.info("send email {},after trying :{} times,error:{} ", Arrays.toString(email.getTo()), tryNum, Throwables.getStackTraceAsString(e));
            session = reConnect();
            return _retryingSendMail(session, email, numTries, tryNum + 1);
        } catch (Exception e) {
            log.error("send mail :{} , error:{}", Arrays.toString(email.getTo()), e.getMessage());
            return null;
        }
    }

    private SendMailSession reConnect() {
        SendMailSession session = initMailSession();
        log.info("reconnect smtp server....done");
        return session;
    }


    public void close() {
        isRunning.set(false);
    }

    private class SendThread extends Thread {
        @Override
        public void run() {
            while (isRunning.get()) {
                Email email = null;
                try {
                    email = emailQueue.poll(10, TimeUnit.HOURS);
                    if (email != null) {
                        log.debug("Get email :{}", email);
                        SendMailSession session = null;
                        try {
                            session = initMailSession();
                            String messageId = _retryingSendMail(session, email, 2, 1);
                            log.info("send email :{} success with messageId: {}", Arrays.toString(email.getTo()), messageId);
                            TimeUnit.SECONDS.sleep(2);
                        } finally {
                            if (session != null) {
                                session.close();
                            }
                        }
                    }
                } catch (Throwable e) {
                    if (email != null) {
                        if (e instanceof SocketTimeoutException) {
                            emailQueue.offer(email);
                            log.info("send email error email:{}:message:{} enqueue again", Arrays.toString(email.getTo()), e.getMessage());
                        } else {
                            log.error("send email error email:{}:message:{}", Arrays.toString(email.getTo()), e.getMessage());
                        }

                    }

                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
//        EmailHelper helper = new EmailHelper("enterprise@lian.com", "123456", "smtp.qiye.163.com");
//        for (int i = 0; i < 10; i++) {
//            new Thread(() -> {
//                helper.sendEmail(Email.create().from(helper.getUseName()).to("huayi.chen@lian.com").subject("abc").addText("xxxxxxxxxxxxxxxxxxxx"));
//            }).start();
//        }
//        TimeUnit.SECONDS.sleep(50);
//        helper.close();


        EventBus eventBus = new EventBus("test");
        class EventListener {
            public int lastMessage = 0;

            @Subscribe
            public void listen(String event) {
                System.out.println("Message:" + event + "--->" + Thread.currentThread().getName());
            }

            public int getLastMessage() {
                return lastMessage;
            }

            ;
        }
        eventBus.register(new EventListener());
        eventBus.post("300");
    }


}

转载于:https://my.oschina.net/yangchunlian/blog/800598

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值