发邮件
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); } }