使用java程序模拟本地发送邮件+案例:服务器自动发送生日祝福

首先,我们需要准备一些工作,在本地安装邮件服务器跟客户端
这里我安装的是foxmail的客户端、易游的邮件服务器
使用的发送与接收协议与市场上的邮箱相同,分别是:
接受邮件的协议:POP3 IMAP
发送邮件的协议:SMTP


image.png

接着我们在易游的邮件服务器上建立两个新的用户:


image.png

再在foxmail上添加这两个用户:
image.png

现在我们就可以在本地模拟手动发送邮件了,但是我们是要用程序代码完成发送操作:
因为实现邮件发送操作的相关接口在外部的jar包里,我们先工程里导入相关jar包:


image.png

再编写相关类文件代码:

package com.zys.mail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;

public class MailUtils {

    //email:邮件发给谁 subject:主题 emailMsg:邮件的内容
    public static void sendMail(String email, String subject, String emailMsg)
            throws AddressException, MessagingException {
        
        // 1.创建一个程序与邮件服务器会话对象 Session
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "SMTP");//发邮件的协议
        props.setProperty("mail.host", "localhost");//发邮件的服务器地址
        props.setProperty("mail.smtp.auth", "true");// 指定验证为true

        // 创建验证器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("[email protected]", "12345");//发邮件的账号验证
            }
        };

        Session session = Session.getInstance(props, auth);

        // 2.创建一个Message,它相当于是邮件内容
        Message message = new MimeMessage(session);

        message.setFrom(new InternetAddress("[email protected]")); // 设置发送者

        message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者

        message.setSubject(subject);//邮件的主题

        message.setContent(emailMsg, "text/html;charset=utf-8");

        // 3.创建 Transport用于将邮件发送

        Transport.send(message);
    }
}

最后在主函数中编写运行代码,就可以实现邮件发送了:

package com.zys.mail;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;

public class SendMailTest {
    
    public static void main(String[] args) throws AddressException, MessagingException {
        
        MailUtils.sendMail("[email protected]", "测试代码发送邮件", "好的,现在我们成功实现通过代码发送邮件!");
        
    }
}

案例:服务器自动发送生日祝福

通过配置监听器ServletContextListener,在服务器启动时就初始化
实现代码如下:

package com.zys.birthday;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ColumnListHandler;

import com.zys.domain.User;
import com.zys.mail.MailUtils;

public class BirthdayListaner implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO 自动生成的方法存根
        
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        // 当web应用启动 开启任务调动---功能在用户的生日当天发送邮件
        //开启一个定时器
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            
            @Override
            public void run() {
                // 为当天生日的用户发邮件
                //1、获得今天过生日的人
                //获得今天的日期
                SimpleDateFormat format = new SimpleDateFormat("MM-dd");
                String currentDate = format.format(new Date());
                //根据当前时间从数据库中擦寻今天过生日的人
                QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
                String sql="select * from user where birthday like ?";
                List userList = null;
                try {
                    userList = runner.query(sql, new BeanListHandler(User.class), "%"+currentDate+"%");
                } catch (SQLException e) {
                    // TODO 自动生成的 catch 块
                    e.printStackTrace();
                }//01-26
                //2、发邮件
                if(userList!=null&&userList.size()>0){
                    for(User user : userList){
                        String emailMsg = "亲爱的:"+user.getName()+",今天是您的生日,祝您生日快乐哦!";
                        try {
                            MailUtils.sendMail(user.getEmail(), "生日祝福", emailMsg);
                            System.out.println(user.getName()+"邮件发送完毕!");
                        } catch (AddressException e) {
                            // TODO 自动生成的 catch 块
                            e.printStackTrace();
                        } catch (MessagingException e) {
                            // TODO 自动生成的 catch 块
                            e.printStackTrace();
                        }
                    }
                }
            }
        }, new Date(), 1000*60);
        //实际开发中起始时间是一个固定的时间
        //实际开发中间隔时间是1天,每天给过生日的用户发送
        
    }
    
    
    
}

你可能感兴趣的:(使用java程序模拟本地发送邮件+案例:服务器自动发送生日祝福)