使用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("victory@zys.com", "12345");//发邮件的账号验证
            }
        };

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

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

        message.setFrom(new InternetAddress("victory@zys.com")); // 设置发送者

        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("iverson@zys.com", "测试代码发送邮件", "好的,现在我们成功实现通过代码发送邮件!");
        
    }
}

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

通过配置监听器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<User> userList = null;
                try {
                    userList = runner.query(sql, new BeanListHandler<User>(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天,每天给过生日的用户发送
        
    }
    
    
    
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文包括:1、名词解释2、邮件收发过程3、JavaMail 知识概要4、发送一封符合 MIME 协议的 JavaM...
    廖少少阅读 4,085评论 2 13
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,370评论 11 349
  • 五、电子邮件 1.电子邮件概述 一个电子邮件系统应具有三个主要组成构件:用户代理、邮件服务器、邮件发送协议(如SM...
    dmmy大印阅读 1,037评论 0 1
  • 一、邮件开发涉及到的一些基本概念 邮件服务器和电子邮箱 邮件传输协议 电子邮件的发送和接收过程 1.1邮件服务器和...
    yjaal阅读 1,518评论 0 7
  • 漫长的岁月,忘不了的依旧忘不了。 漫长的岁月,不爱的依旧不爱。 在这漫长的岁月里,我几乎以为我已经忘记了你。 曾经...
    谢丹儒阅读 336评论 0 1