Sending multiple mails with apache common mail

2019-08-21 05:13发布

public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    Connection con=null;
    Statement st=null;
    try{
    Class.forName("com.mysql.jdbc.Driver").newInstance();
    String useq="root";
    String paq="manager";
    String url="jdbc:mysql://localhost:3306/jayna";
    con=DriverManager.getConnection(url,useq,paq);
    st=con.createStatement();


    String q="Select * from appointment where date=curdate()";
    ResultSet rs= st.executeQuery(q);
    String smtpServer="smtp.gmail.com";
    String from="";
    String userName="username";
    String password="password";

    String sub="Appointment Remainder";
    String mailText="This is a remainder message from Jayna Dental Center. Please attend your appointment with us today at your prescribed clinic. Thank you.";

    out.println(mailText); 
               from = userName;
               while(rs.next())
               { 

                   String to="";
                  String pid=rs.getString("pid");
                   String q1="select * from patient where patient_no='"+pid+"'";
                   ResultSet rs1=st.executeQuery(q1);
                   out.println("inside while");
                   if(rs1.next())
                   { 

                   to=rs1.getString("email_id");
                   out.println("inside if");


                        Properties props = System.getProperties();
                        props.put( "mail.smtp.host", smtpServer ) ;
                        out.println("a");
                        //SMTP server authentication is set to false, by default. Setting it to true as shown below
                        props.put( "mail.smtp.auth", "true" ) ;
                        out.println("a");
                        Session session = Session.getDefaultInstance(props, null);
                        MimeMessage message = new MimeMessage(session);
                        out.println("a");
                        //Setting the 'from', 'to', 'cc' addresses and the 'subject'
                        message.setFrom(new InternetAddress(from));
                        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                        message.setSubject(sub);
                        out.println("a");
                        //Making the mail body as inline and of html type
                        MimeMultipart mp = new MimeMultipart();
                        MimeBodyPart text = new MimeBodyPart();
                        text.setDisposition(Part.INLINE);
                        text.setContent(mailText, "text/html");
                        out.println("a");
                        mp.addBodyPart(text);
                        message.setContent(mp);
                        out.println("a");
                        //SMTP authentication
                        Transport transport = session.getTransport ("smtp") ;
                        transport.connect (smtpServer, userName, password) ;
                        message.saveChanges();
                        out.println("a");
                        transport.sendMessage(message, message.getAllRecipients());
                            transport.close();                          
                        out.println("a");
                        out.println("Your mail has been sent. Please close this window");

                   }  
                   else{
                       out.println("No such pid");
                   }}
               } catch (Exception e){
                        System.err.println("Email could not be sent due to error: "+e);
                        e.printStackTrace();  
                        out.println("ex");
                }

}

/**
 * Initialization of the servlet. <br>
 *
 * @throws ServletException if an error occurs
 */
public void init() throws ServletException {
    // Put your code here
}

Hi i have been trying to use the above code for sending mails to all those people whose appointment date is today. I am getting an error in Transport transport = session.getTransport ("smtp") ; transport.connect (smtpServer, userName, password) ;

Please tell me What is wrong in this code..:( I have used many out.println just to test till where my code is working.

Stack trace 
    Email could not be sent due to error: com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. u6sm22896pbh.0

com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. u6sm22896pbh.0

    at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2057)
    at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1580)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1097)
    at mail.Sendmail.doPost(Sendmail.java:134)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

3条回答
祖国的老花朵
2楼-- · 2019-08-21 05:31

How I predicted: The exception occurs because you need to authenticate your connection with gmail through TLS.

Add the following lines to you properties:

props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");

Then open your session and transport like this:

Session session = Session.getInstance(props);
Transport transport = session.getTransport("smtp");
transport.connect(D_HOST, D_PORT, D_USER, D_PASS);

Obviously using your own accountname, password etc. :)

Hope this helps!

查看更多
时光不老,我们不散
3楼-- · 2019-08-21 05:41

the port of gmail smtp server is 465, so you should:

1, add

props.put("mail.smtp.port", "465");

2, update

transport.connect (smtpServer, 465, userName, password);

查看更多
beautiful°
4楼-- · 2019-08-21 05:45

I can see two issues here.

  1. In the issue title you've put apache commons email, however your code is using standard JavaMail. I would suggest using Commons Email if you can.
  2. GMail uses TLS, i.e. a secure connection. You can't connect to it in the standard way.

In other words, I don't think there's anything wrong with your code, however you should not really be connecting to GMail in order to send mail. If your company has an SMTP server I would use that instead.

Failing that you may be able to use the Java Email Server.

If you really must use GMail's SMTP, or more generally SMTP over a secure (TLS) connection, this article explains how to do it.

查看更多
登录 后发表回答