发邮件

 

package com.company;

import javax.mail.*;//导入的jar包mail.jar,sun官网有
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;

public class SendEmail{
    /*
    邮件软件称为MUA:Mail User Agent,意思是给用户服务的邮件代理,说白了就是你用的邮箱软件,qq邮箱呀,阿里云邮箱什么的
    邮件服务器则称为MTA:Mail Transfer Agent,意思是邮件中转的代理
    最终到达的邮件服务器称为MDA:Mail Delivery Agent,意思是邮件到达的代理
    发邮件就是用户在MUA上发送到MTA上,MTA转发到MDA服务器上硬盘存储,接收方通过浏览器或软件在MDA服务器上查看邮件
    1.常用的电子邮箱协议都属于TCP/IP协议,SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议
    2.SMTP:Simple Mail Transport Protocol的缩写,使用标准端口25,也可以使用加密端口465或587



     */

    public static void main(String[] args) throws MessagingException {
    // write your code here
        sendMail("不要抱怨,抱我,抱我");
    }


    /**
     * 发送邮件
     * @param message
     */
    private static String message;//存储发送的一条信息
    private static void sendMail(String message) throws MessagingException {
        SendEmail.message=message;
        /*
        1.想要发送邮件,首先需要下载一个mail.jar包
        2.mail.jar导入工程,可以使用里面的相关类了  src同级目录建立一个lib文件夹,然后File-Project Structure-Libraries-+号添加-apply
        3.发邮件的时候,需要做以下的配置
         */
        Properties properties=new Properties();//本质上就是一个map集合
        //设置协议
        properties.put("mail.transport.protocol","smtp");//必须
        //设置邮箱主机名
        properties.put("mail.smtp.host","smtp.qq.com");//必须,key固定,value:smtp.[qq.com][aliyun.com]..
        //设置发送邮件使用的端口号,如果不设默可能25,110,143
        properties.put("mail.smtp.port","25");
        //设置邮件发送时是否需要进行身份验证
        properties.put("mail.smtp.auth","true");

        //创建一个Session对象,类似于socket,作为连接的桥梁,传入邮箱配置信息
        Session session=Session.getDefaultInstance(properties);
        //创建一个Transport对象,类似于输出流,可以通过它发送
        Transport transport=session.getTransport();
        //通过具体用户连接到对应的邮箱服务器,并且还需要认证获取认证码,qq邮箱为例,登录后,设置,账户,开启服务
        transport.connect("123456@qq.com","授权码");//第二位输入密码没用,这里输入的应该是开启邮箱协议服务时生成的授权码-登录对应邮箱在开启服务时生成//以上就相当于连接到了qq邮箱的MUA,准备工作完成,接下来
        //创建一个邮件对象Message,映射邮箱里的真实邮件,完善邮件内容才发送撒
        //这里额外写个方法来构造Message对象
        MimeMessage mime=createMessage(session);
        //发送
        transport.sendMessage(mime,mime.getAllRecipients());
        //关闭流
        transport.close();
        System.out.println("发送完成。");




    }
    /**
     * 返回邮件对象
     * @param session 需要一个条件session连接
     */
    private static MimeMessage createMessage(Session session) throws MessagingException {
        //创建邮件对象
        MimeMessage mime=new MimeMessage(session);
        //目前这个邮件对象只携带基本协议相关的信息,还没有添加具体内容
        //设置邮件发送人,邮件从哪发出去
        mime.setFrom(new InternetAddress("123456@qq.com"));
        //设置邮件收件人
        InternetAddress[] in={new InternetAddress("111111111@qq.com"),new InternetAddress("222222222@qq.com")};
        //设置收件人接收方式 TO普通发送 CC添加抄送 BCC密送
        mime.setRecipients(Message.RecipientType.TO,in);
        //设置发送日期
        mime.setSentDate(new Date());
        //发送主题
        mime.setSubject("hello nihao");
        //发送正文
        mime.setText(message,"UTF-8");
        //该设置的设了,内容补全后,一定要保存,否则不生效
        mime.saveChanges();
        //返回
        return mime;

    }
}

运行 报错:

 

 检查这个事做没:开启对应邮箱服务器的协议服务 

可看这里https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28

 会生成一个授权码,放在代码里面用户密码参数那里,运行,发送成功!!

 

扩展:

新增:1.发送的内容用一个集合存储,多条 2.定时随机发送

注意事项:如果首次发送时间firstTime设定在当前系统日期之前比如今天是2021-2-23,你设定为1998-12-12,那么会立即开始执行run,如果设定的firstTime在当前系统时间之后才会根据设定,到那个时间点才开始运行

package com.company;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.net.BindException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class SendEmail{
    /*
    邮件软件称为MUA:Mail User Agent,意思是给用户服务的邮件代理,说白了就是你用的邮箱软件,qq邮箱呀,阿里云邮箱什么的
    邮件服务器则称为MTA:Mail Transfer Agent,意思是邮件中转的代理
    最终到达的邮件服务器称为MDA:Mail Delivery Agent,意思是邮件到达的代理
    发邮件就是用户在MUA上发送到MTA上,MTA转发到MDA服务器上硬盘存储,接收方通过浏览器或软件在MDA服务器上查看邮件
    1.常用的电子邮箱协议都属于TCP/IP协议,SMTP协议是一个建立在TCP之上的协议,任何程序发送邮件都必须遵守SMTP协议
    2.SMTP:Simple Mail Transport Protocol的缩写,使用标准端口25,也可以使用加密端口465或587

     */

    public static void main(String[] args) throws MessagingException, ParseException {
    // write your code here
        timeSend();

    }


    /**
     * 发送邮件
     * @param message
     */
    private static String message;//存储发送的一条信息
    private static void sendMail(String message) throws MessagingException {
        SendEmail.message=message;
        /*
        1.想要发送邮件,首先需要下载一个mail.jar包
        2.mail.jar导入工程,可以使用里面的相关类了  src同级目录建立一个lib文件夹,然后File-Project Structure-Libraries-+号添加-apply
        3.发邮件的时候,需要做以下的配置
         */
        Properties properties=new Properties();//本质上就是一个map集合
        //设置协议
        properties.put("mail.transport.protocol","smtp");//必须
        //设置邮箱主机名
        properties.put("mail.smtp.host","smtp.qq.com");//必须,key固定,value:smtp.[qq.com][aliyun.com]..
        //设置发送邮件使用的端口号,如果不设默可能25,110,143
        properties.put("mail.smtp.port","25");
        //设置邮件发送时是否需要进行身份验证
        properties.put("mail.smtp.auth","true");//这段不写也一样,邮箱服务器会强制校验身份,可以删了

        //创建一个Session对象,类似于socket,作为连接的桥梁,传入邮箱配置信息
        Session session=Session.getDefaultInstance(properties);
        //创建一个Transport对象,类似于输出流,可以通过它发送
        Transport transport=session.getTransport();
        //通过具体用户连接到对应的邮箱服务器,并且还需要认证获取认证码,qq邮箱为例,登录后,设置,账户,开启服务
        transport.connect("123456@qq.com","sdfesadfsfdsag");//开启服务时的授权码
        //以上就相当于连接到了qq邮箱的MUA,准备工作完成,接下来
        //创建一个邮件对象Message,映射邮箱里的真实邮件,完善邮件内容才发送撒
        //这里额外写个方法来构造Message对象
        MimeMessage mime=createMessage(session);
        //发送
        transport.sendMessage(mime,mime.getAllRecipients());
        //关闭流
        transport.close();
        System.out.println("发送完成。");




    }
    /**
     * 返回邮件对象
     * @param session 需要一个条件session连接
     */
    private static MimeMessage createMessage(Session session) throws MessagingException {
        //创建邮件对象
        MimeMessage mime=new MimeMessage(session);
        //目前这个邮件对象只携带基本协议相关的信息,还没有添加具体内容
        //设置邮件发送人,邮件从哪发出去
        mime.setFrom(new InternetAddress("123456@qq.com"));
        //设置邮件收件人
        InternetAddress[] in={new InternetAddress("111111@qq.com"),new InternetAddress("222222@aliyun.com")};
        //设置收件人接收方式 TO普通发送 CC添加抄送 BCC密送
        mime.setRecipients(Message.RecipientType.TO,in);
        //设置发送日期
        mime.setSentDate(new Date());
        //发送主题
        mime.setSubject("hello nihao");
        //发送正文
        mime.setText(message,"UTF-8");
        //该设置的设了,内容补全后,一定要保存,否则不生效
        mime.saveChanges();
        //返回
        return mime;

    }
    private static ArrayList<String> Messages=new ArrayList<>();
    static {//类加载时就给Messages存入所有值了
        Messages.add("人非要经历一番不同平时的劫难才能脱胎换骨,成为真正能解决问题的人");
        Messages.add("靠山山会倒,靠水水会流,靠自己永远不倒。");
        Messages.add("精诚所至,金石为开。");
        Messages.add("人生坎坎坷坷,跌跌撞撞那是在所难免。但是,不论跌了多少次,你都要坚强地再次站起来。任何时候,无论你面临着生命的何等困惑,抑或经受着多少挫折,无论道路如何的艰难,无论希望变得如何渺茫,请你不要绝望,再试一次,成功一定属于你!");
        Messages.add("我从来不把安逸和快乐看作是生活目的的本身。手指有长有短,知识有高有低。学无前后,达者为师。");
        Messages.add("任何不能打倒你的,将会使你更加坚强。");
        Messages.add("如果你想得到,你就会得到,你所需要付出的只是行动。");
        Messages.add("世界上最难的事情是坚持,世上最容易的事情也是坚持,不管怎么样只要坚持就能胜利。");
        Messages.add("因为没有指望,你只能变得更强大。");
        Messages.add("珍惜今天的美好就是为了让明天的回忆更美好。幸福不是每天都有,错过了就要等很久。贵在坚持,难在坚持,成在坚持。");
        Messages.add("见得天下皆是坏人,不如见得天下皆是好人。");
        Messages.add("人生的旅途,前途很远,也很暗。然而不要怕,不怕的人的面前才有路。如果你想拥有的更多,那希望就不应寄托在别人身上。");
        Messages.add("时间是宝贵的,抓住了时间就抓住了成功。只有孜孜不倦地求索,才有源源不断的收获。");
        Messages.add("前面的路还很远,你可能会哭,但是,一定要走下去,一定不能停。输不起的人,往往就是赢不了。");
        Messages.add("要做思想上的领跑者,要做行动上的领跑者。一个人有钱没钱不必须,但如果这个人没有了梦想 ,这个人穷定了。");
        Messages.add("人生是一场马拉松,中途什么事情都有可能发生,跑到最后的最远的才是胜利者。");
        Messages.add("扬起理想的风帆并为之奋斗,你会真正体会到人生的价值和乐趣。最大的敌人是自己,只要你战胜了自己,你就是真正的男子汉?");
        Messages.add("做人也要像蜡烛一样,在有限的一生中有一分热发一分光,给人以光明,给人以温暖。");
        Messages.add("受挫受辱之时,务须咬牙励志,蓄其气而长其智");

    }

    /**
     * 做定时发送,使用Timer类
     */
    private static void timeSend() throws ParseException {
        Timer timer=new Timer();//帮忙做计时的
        //设置时间格式
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date firstTime=sdf.parse("2021-2-23 17:19:00");//第一次发送时间
        System.out.println(sdf.format(new Date()));;
        //调schedule方法,三个参数,第一个参数是一个TimerTask对象,实际行是实现了Runnable接口,相当于一个线程类,实现run方法
        //第二个参数设置首次执行run的时间,第三个参数设置下次执行run的时间间隔
        timer.schedule(new TimerTask() {
            @Override
            public void run() {

                int index= (int) (Math.random()*10);
                String mess=Messages.get(index);

                try {
                    sendMail(mess);
                } catch (MessagingException e) {
                    e.printStackTrace();
                }
            }
        },firstTime,10000);



    }

}

 

posted on 2021-02-23 14:45  刀锋93  阅读(153)  评论(0编辑  收藏  举报

导航