黑马程序员技术交流社区

标题: javamail的大量发送邮件的问题 [打印本页]

作者: 罗海清    时间: 2014-5-26 18:18
标题: javamail的大量发送邮件的问题
各位没入学的、已经毕业的朋友你们好,我是毕业了的,工作中遇到了问题,以为不会遇到,没想到帧的让我遇到了,想避也避不了

代码很简单,一个邮箱帐号,一天内发比较少的邮件是可以的,发送量大时,就会报错,如下:
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.163.com:25
        at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1138)
        at org.apache.commons.mail.Email.send(Email.java:1163)
        at com.ibtscm.utils.MailUtil.send(MailUtil.java:24)
        at com.ibtscm.mail.SimpleMailTest.main(SimpleMailTest.java:12)
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 550 RP:TRC smtp14,EsCowECJ3WhnEINTZ93LAA--.97S2 1401098345 http://mail.163.com/help/help_spam_16.htm?ip=113.88.173.141&hostid=smtp14&time=1401098345

        at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1668)
        at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1207)
        at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:735)
        at javax.mail.Transport.send0(Transport.java:191)
        at javax.mail.Transport.send(Transport.java:120)
        at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1128)
        ... 3 more

代码如下:
一个是MailUtil.java,就一个发送方法
一个是测试类,调用这个MailUtil.java

现在的问题是:有没有办法,使用同一个帐号,大量发送不同的信息,到不同的邮箱中去?
如果不能使用同一个帐号,有没有别的办法(除了申请多个账户,用多个账户发送),在今天内把这5000封不同内容的邮件,发送到5000个人的邮箱中?

MailUtil.java
package com.ibtscm.utils;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

public class MailUtil {
        private static SimpleEmail email;
        static {
                email = new SimpleEmail();
                email.setAuthentication("这里写账户名", "密码");
                email.setSubject("email.setSubject");
                email.setHostName("smtp.163.com");
                try {
                        email.setFrom("用户名@163.com", "aqy");
                } catch (EmailException e) {
                        e.printStackTrace();
                }
        }

        public static void send(String content, String to){
                try {
                        email.addTo(to, "qq");
                        email.setMsg(content);
                        email.send();
                } catch (EmailException e) {
                        e.printStackTrace();
                }
        }

}

测试类:SimpleMailTest
package com.ibtscm.mail;
import org.apache.commons.mail.EmailException;

import com.ibtscm.utils.MailUtil;

public class SimpleMailTest {

    public static void main(String[] args) throws EmailException {

            for(int i=0;i<5000;i++)
            MailUtil.send("neirong"+i, "目标qq@qq.com");
}


作者: 罗海清    时间: 2014-5-29 10:37
结论:经过测试gmail,
用了两个帐号,第一个帐号连续发送了330多封垃圾邮件后,报错,然后在try-catch块中切换帐号,这个帐号是今天第一次连接,结果也连不上了。
估计是谷歌把第一个帐号的ip也屏蔽掉了。
也就是说,想发垃圾邮件,还真的是要交钱
测试代码如下:
public void test2() {
                List<SoTrackingdetail> list = new ArrayList<SoTrackingdetail>();

                List<BsSalesaccountEmail> emailList = new ArrayList<BsSalesaccountEmail>();
                emailList.add(new BsSalesaccountEmail("nuyiwuxianqiang@gmail.com", "***"));
                emailList.add(new BsSalesaccountEmail("menghuleishengang@gmail.com", "***"));
//添加了两个帐号,密码故意去掉了
                boolean flag = emailList.size() > 0;
                SoTracking order = new SoTracking();
                order.setSendInd("0");
                order.setCustEmail("***@qq.com");//这里是发邮件的目标地址

                if ("1".equals(order.getSendInd())) {
                        flag = false;
                }

                while (flag) {
                        try {
                                BsSalesaccountEmail remove = emailList.remove(0);//取出一个帐号,帐号和密码封装在BsSalesaccountEmail 这个对象里面
                                for(int i=0;i<1000;i++){ //循环多遍,故意让抛出异常
                                        Session session = GmailUtil.getSession(remove.getEmail().substring(0, username.indexOf("@")), remove.getPassword());
                                        GmailUtil.send(session, remove, order, list);//自己封装的工具类,通过session,发送邮件
                                        System.out.println(remove.getEmail()+":"+i);
                                }
                                flag = false;
                        } catch (MessagingException e) {
                                System.out.println(e);
                                if (emailList.size() == 0) {//用完了两个帐号就结束循环
                                        System.out.println("over.........");
                                        flag = false;
                                }
                        }
                }
        }

如果有大神:
因为我觉得是谷歌屏蔽了IP,也屏蔽了账号,所以不知道有没有通过改变IP来创建javamail的session的办法?如果有我就能继续发垃圾邮件了。各位有资源的可以联系我,完成后我就会把代码贴出。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2