零零散散利用业余时间带着看了一阵子java,是时候用实际应用来练练手了。应一个朋友需求,想通过邮件群发方式推广自己的公众号,为啥用邮件推广嘛,大家都清楚:免费。现在找个媒体发广告,那可是要投入成本的,最终效果还不一定有效。邮件现在效果远不如以前,但毕竟免费。
一、需求分析与功能模块定位
首先要解决同一个发件人发很多邮件后被邮件服务器屏蔽的问题,思路就是准备一批发邮件账号,充分利用各个环节随机的做法来规避邮件服务器的屏蔽,每个发件人账号每天发送有限的几封邮件,把每天定时任务的发送起始时间随机化,每个账号发送上限数量内随机数量邮件,发送间隔随机产生,邮件标题随机从数据库读取,邮件内容随机从数据库读取,反正一切都是在预先设定的范围内随机。
这个思路定下来之后,要准备的工作有:1、先写个邮件发送的类,用于被调用;2、准备发件人邮箱账号,越多越好,存放在excel表中,规定格式;3、准备数据库,存放收件人目标邮箱账号,存放随机读取的邮件标题和邮件内容,目标邮箱如何产生嘛,以qq号为例,挨个排下去,自行理解。
二、分步实现之邮件发送类
1、引入mail.jar和activateon.jar两个jar包,idea开发环境中,使用maven管理,pom.xml依赖中添加:
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
2、SendMailSmtp类
/* * Class Name: SendMailSmtp * Description: 使用smtp协议发送邮件,依赖两个jar包:mail,activation;导入import javax.activation.,import javax.mail. * 四类发送方式,只发送文本,发送文本和图片,发送文本和附件,发送文本、图片、附件,附件只支持一个。 * 使用方法,先GetTransport()创建与邮件服务器连接,然后Sendxxxx()发送邮件,最后CloseTransport()关闭连接。 * Date: 2021-09-03 13:30 * Copyright: 秦坤明 */ package QinMing.Mail; import java.io.FileOutputStream; import java.util.Properties; import java.util.Random; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; public class SendMailSmtp { String MailSmtpServer; String MailUser; String MailPass; String MailSender; Session session; Transport ts; public String getMailSmtpServer() { return MailSmtpServer; } public void setMailSmtpServer(String mailSmtpServer) { MailSmtpServer = mailSmtpServer; } public String getMailUser() { return MailUser; } public void setMailUser(String mailUser) { MailUser = mailUser; } public String getMailPass() { return MailPass; } public void setMailPass(String mailPass) { MailPass = mailPass; } public String getMailSender() { return MailSender; } public void setMailSender(String mailSender) { MailSender = mailSender; } /* *连接smtp邮件服务器 */ public String GetTransport() { try { Properties ppt = new Properties(); ppt.setProperty("mail.host", MailSmtpServer); ppt.setProperty("mail.transport.protocol", "smtp"); ppt.setProperty("mail.smtp.auth", "true"); //1、创建session session = Session.getInstance(ppt); //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态 //session.setDebug(true); //2、通过session得到transport对象 ts = session.getTransport(); //3、连上邮件服务器 ts.connect(MailSmtpServer, MailUser, MailPass); return "success"; }catch (MessagingException e){ return e.toString(); } } /* *断开与smtp邮件服务器的连接 */ public String CloseTransport() { try { //5、断开与邮件服务器连接 ts.close(); return "success"; }catch (MessagingException e){ return e.toString(); } } /* *通过smtp邮件服务器发送文本/html格式邮件,不带图片和附件 * @MailReceiver 收件人 * @MailSubject 邮件主题 * @MailContent 邮件内容 */ public String SendText(String MailReceiver, String MailSubject, String MailContent){ try { //4、创建邮件对象并发送邮件 MimeMessage mm = new MimeMessage(session); //指明邮件的发件人 mm.setFrom(new InternetAddress(MailSender)); //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver)); //邮件的标题 mm.setSubject(MailSubject); //邮件的文本内容 mm.setContent(MailContent, "text/html;charset=UTF-8"); //发送邮件 ts.sendMessage(mm, mm.getAllRecipients()); //发送成功返回success return "success"; } catch(MessagingException e){ return e.toString(); } } /* *通过smtp邮件服务器发送文本/html格式邮件,带图片 * @MailReceiver 收件人 * @MailSubject 邮件主题 * @MailContent 邮件内容 * @ImageFile 图片文件 */ public String SendImage(String MailReceiver, String MailSubject, String MailContent, String ImageFile){ try { //4、创建邮件对象并发送邮件 MimeMessage mm = new MimeMessage(session); //指明邮件的发件人 mm.setFrom(new InternetAddress(MailSender)); //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver)); //邮件的标题 mm.setSubject(MailSubject); // 准备邮件相关 // 准备邮件正文数据,图片指定名称需和下面image.setContentID中命名的保持一致 MimeBodyPart text = new MimeBodyPart(); text.setContent(MailContent + "<img src='cid:welcome.jpg'>", "text/html;charset=UTF-8"); // 准备图片数据 MimeBodyPart image = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(ImageFile)); image.setDataHandler(dh); image.setContentID("welcome.jpg"); // 描述数据关系 MimeMultipart mmt = new MimeMultipart(); mmt.addBodyPart(text); mmt.addBodyPart(image); mmt.setSubType("related"); mm.setContent(mmt); mm.saveChanges(); //发送邮件 ts.sendMessage(mm, mm.getAllRecipients()); //发送成功返回success return "success"; } catch(MessagingException e){ return e.toString(); } } /* *通过smtp邮件服务器发送文本/html格式邮件,带附件 * @MailReceiver 收件人 * @MailSubject 邮件主题 * @MailContent 邮件内容 * @AttachFile 附件文件 */ public String SendAttach(String MailReceiver, String MailSubject, String MailContent, String AttachFile){ try { //4、创建邮件对象并发送邮件 MimeMessage mm = new MimeMessage(session); //指明邮件的发件人 mm.setFrom(new InternetAddress(MailSender)); //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver)); //邮件的标题 mm.setSubject(MailSubject); // 准备邮件相关 // 准备邮件正文数据,图片指定名称需和下面image.setContentID中命名的保持一致 MimeBodyPart text = new MimeBodyPart(); text.setContent(MailContent, "text/html;charset=UTF-8"); //创建邮件附件 MimeBodyPart attach = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(AttachFile)); attach.setDataHandler(dh); attach.setFileName(dh.getName()); // 描述数据关系 MimeMultipart mmt = new MimeMultipart(); mmt.addBodyPart(text); mmt.addBodyPart(attach); mmt.setSubType("mixed"); mm.setContent(mmt); mm.saveChanges(); //发送邮件 ts.sendMessage(mm, mm.getAllRecipients()); //发送成功返回success return "success"; } catch(MessagingException e){ return e.toString(); } } /* *通过smtp邮件服务器发送文本/html格式邮件,带附件 * @MailReceiver 收件人 * @MailSubject 邮件主题 * @MailContent 邮件内容 * @ImageFile 图片文件 * @AttachFile 附件文件 */ public String SendImageAndAttach(String MailReceiver, String MailSubject, String MailContent, String ImageFile, String AttachFile){ try { //4、创建邮件对象并发送邮件 MimeMessage mm = new MimeMessage(session); //指明邮件的发件人 mm.setFrom(new InternetAddress(MailSender)); //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发 mm.setRecipient(Message.RecipientType.TO, new InternetAddress(MailReceiver)); //邮件的标题 mm.setSubject(MailSubject); //准备邮件相关 //正文 MimeBodyPart text = new MimeBodyPart(); text.setContent(MailContent + "<img src='cid:welcome.jpg'>", "text/html;charset=UTF-8"); //图片 MimeBodyPart image = new MimeBodyPart(); image.setDataHandler(new DataHandler(new FileDataSource(ImageFile))); image.setContentID("welcome.jpg"); //附件 MimeBodyPart attach = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource(AttachFile)); attach.setDataHandler(dh); attach.setFileName(dh.getName()); //描述关系:正文和图片 MimeMultipart mmt1 = new MimeMultipart(); mmt1.addBodyPart(text); mmt1.addBodyPart(image); mmt1.setSubType("related"); //描述关系:正文和附件 MimeMultipart mmt2 = new MimeMultipart(); mmt2.addBodyPart(attach); //代表正文的body part MimeBodyPart content = new MimeBodyPart(); content.setContent(mmt1); mmt2.addBodyPart(content); mmt2.setSubType("mixed"); mm.setContent(mmt2); mm.saveChanges(); //发送邮件 ts.sendMessage(mm, mm.getAllRecipients()); //发送成功返回success return "success"; } catch(MessagingException e){ return e.toString(); } } }
3、使用上面的类发送测试邮件
(1)发送只包含文本的邮件
//发送一封文本测试邮件 SendMailSmtp sms = new SendMailSmtp(); sms.setMailSmtpServer("smtp.qq.com"); sms.setMailSender("xxxx@qq.com"); sms.setMailUser("xxxx"); sms.setMailPass("mail pass"); String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。" + "</br>下面列举几个优惠券供参考:</br></br>" + "<img src='http://url/test.jpg'/>"; if(sms.GetTransport() == "success"){ System.out.println(sms.SendText("xx@qq.com", "test mail", mailcontent)); sms.CloseTransport(); }
(2)发送包含文本及图片的邮件
//发送一封文本+图片测试邮件 SendMailSmtp sms = new SendMailSmtp(); sms.setMailSmtpServer("smtp.qq.com"); sms.setMailSender("xxxx@qq.com"); sms.setMailUser("xxxx"); sms.setMailPass("mail pass"); String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。" + "</br>下面列举几个优惠券供参考:</br></br>" + "<img src='http://url/test.jpg'/>"; if(sms.GetTransport() == "success"){ System.out.println(sms.SendImage("xx@qq.com", "test image mail", mailcontent, "f:/test.jpg")); sms.CloseTransport(); }
(3)发送包含文本和附件的邮件
//发送一封文本+附件测试邮件 SendMailSmtp sms = new SendMailSmtp(); sms.setMailSmtpServer("smtp.qq.com"); sms.setMailSender("xxxx@qq.com"); sms.setMailUser("xxxx"); sms.setMailPass("mail pass"); String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。" + "</br>下面列举几个优惠券供参考:</br></br>" + "<img src='http://url/test.jpg'/>"; if(sms.GetTransport() == "success"){ System.out.println(sms.SendAttach("xx@qq.com", "test attach mail", mailcontent, "f:/test.txt")); sms.CloseTransport(); }
(4)发送包含文本+图片+附件的邮件
//发送一封文本+图片+附件测试邮件 SendMailSmtp sms = new SendMailSmtp(); sms.setMailSmtpServer("smtp.qq.com"); sms.setMailSender("xxxx@qq.com"); sms.setMailUser("xxxx"); sms.setMailPass("mail pass"); String mailcontent = "</br>尊敬的xxx:</br>您好!</br>您的好友委托我们为您送来一份超值优惠券,吃喝玩乐全都有,最低只要一折起,微信扫码即可享受。" + "</br>下面列举几个优惠券供参考:</br></br>" + "<img src='http://url/test.jpg'/>"; if(sms.GetTransport() == "success"){ System.out.println(sms.SendImageAndAttach("xx@qq.com", "test image and attach mail", mailcontent, "f:/test.jpg", "f:/test.txt")); sms.CloseTransport(); }
好了,第一步发送邮件的基础已准备完备,下面的步骤就是如何制定定时任务开展群发,本篇就到这里,完整应用请看下一篇。顺带帮朋友的公众号推广一下,猿友们可以用微信扫码下面二维码关注公众号,吃喝玩乐优惠券什么都有,最低只要一折,真的是超级优惠。