将邮件发送到保存在数据库中的用户的电子邮

时间:2016-05-08 14:14:36

标签: java oracle

我可以发送特定电子邮件ID的电子邮件,但现在我想从数据库中检索多个用户的电子邮件ID并向他们发送消息。我尝试了几种方法,但我无法得到理想的结果。

这是我的原始代码:

NS ns1.myhost.arvixevps.com    
NS ns2.myhost.arvixevps.com    
A <ipaddress>    
* A <ipaddress>    
www A <ipaddress>    
mail A <ipaddress>    
mail2 A <ipaddress>    
MX [10], mail.mywebsite.com    
MX [21], mail2.mywebsite.com    
TXT globalsign-domain-verification=SKFHKSJHDLKUERIJKDCFJLKF_234KJFDJK 

1 个答案:

答案 0 :(得分:0)

有3个问题:

  1. 首先,您的i永远不会增加。您需要在循环结束时添加i++;。您现在的方式是循环查看数据库查询的所有结果,但始终保存在id[0]

  2. 此外,将rs.getString(1)替换为rs.getString(0)。这是因为email是数据库查询结果的第0列,而不是1。

  3. 最后,在您的代码中,当您最后收集电子邮件地址时,您只捕获一个,因为您不会在i上循环。您应该循环访问id数组,并为每封电子邮件创建一个InternetAddress对象。

  4. 总的来说,您需要做的是通过以下方式替换您的while循环:

    while(rs.next())
    {
       id[i] = rs.getString(0);
       i++;
    }
    

    并将InternetAddress[] address = {new InternetAddress(id[i])};替换为:

    InternetAddress[] address = new InternetAddress[id.length];
    for(int i=0; i<id.length; i++){
       address[i] = new InternetAddress[id[i]];
    }
    


    那说,它应该工作。现在,关于您的代码的一些评论:

    • 为什么要将长度为100的id初始化?如果您这样做,您将无法处理超过100个电子邮件地址的案例。您可能需要使用ArrayList而不是数组。请参阅here
    • 无论如何,有一个更简单的解决方案,将ResultSet转移到数组,只需使用ResultSet的{​​{3}}
    • 您无需像这样添加任何%><%

      %>
      <%
      

      这没用了

    • 一些缩进可以让您和您的读者更清楚,更容易理解您的代码。
    • 无需声明hostuserpass为空,只是为了稍后填写几行

    总的来说,如果您实施这些注释和重要更改,您的代码将如下所示:

    <%@page import="oracle.net.aso.i"%>
    <%@ page import="java.io.*,java.util.*,javax.mail.*,java.sql.*"%>
    <%@ page import="javax.mail.internet.*,javax.activation.*"%>
    <%@ page import="javax.servlet.http.*,javax.servlet.*" %>
    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
    <%!
    Connection con;
    Statement st;
    ResultSet rs;
    
    Class.forName("oracle.jdbc.OracleDriver");
    con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE", "rahul", "odeya");
    st = con.createStatement();
    rs = st.executeQuery("select email from register");
    
    String[] id = rs.getArray("email");
    
    String host ="smtp.gmail.com"; 
    String user ="ocrsindore@gmail.com"; 
    String pass ="odeya";
    
    String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
    
    String from ="ocrsindore@gmail.com"; 
    
    String subject = request.getParameter("subject");
    
    String messageText = request.getParameter("message");
    
    boolean sessionDebug = true;
    
    Properties props = System.getProperties();
    props.put("mail.host", host);
    props.put("mail.transport.protocol.", "smtp");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.", "true");
    props.put("mail.smtp.port", "465");
    props.put("mail.smtp.socketFactory.fallback", "false");
    props.put("mail.smtp.socketFactory.class", SSL_FACTORY);
    
    Session mailSession = Session.getDefaultInstance(props, null);
    mailSession.setDebug(sessionDebug);
    Message msg = new MimeMessage(mailSession);
    msg.setFrom(new InternetAddress(from));
    
    InternetAddress[] address = new InternetAddress[id.length];
    for(int i=0; i<id.length; i++){
       address[i] = new InternetAddress[id[i]];
    }
    
    msg.setRecipients(Message.RecipientType.TO, address);
    msg.setSubject(subject);
    msg.setContent(messageText, "text/html"); 
    
    Transport transport = mailSession.getTransport("smtp");
    transport.connect(host, from, pass);
    try {
       transport.sendMessage(msg, msg.getAllRecipients());
       out.println("message successfully sent"); 
    }
    catch (Exception err) {
       out.println("message send failed"); 
    }
    transport.close();
    %>
    <jsp:include page="adminis.html"/>