【问题标题】:How to send an email from jsp/servlet?如何从 jsp/servlet 发送电子邮件?
【发布时间】:2011-04-15 00:29:22
【问题描述】:

如何从 JSP/servlet 发送电子邮件?是否需要下载一些 jars 或者您可以在没有任何 jars 的情况下从 JSP/servlets 发送电子邮件?

  • 我的 Java 代码会是什么样子?

  • 我的 HTML 代码是什么样的(如果有的话)?

  • 是否需要多个类,还是只能使用一个类?

【问题讨论】:

  • 在发布到 SO 之前,请用谷歌搜索这些琐碎的问题。下面的链接是前十个结果。
  • Google 必然会搜索热门搜索结果。人们使用 StackOverflow 来获得实际的人们意见,而不是山景算法。这就是 StackOverflow 恕我直言的重点。
  • 获取元数据,这就是积分系统的重点。好的 q/a 获得更多积分,在搜索中出现更多,等等......但是,是的,更好的结果(希望如此)。与页面排名类似的想法。
  • @NitheshChandra Google 把我带到这里 ;)
  • @crm 事情在 4 年内发生了变化。 Stackoverflow 成为大多数编程问题的权威来源,所以我认为我之前的评论仍然适用。

标签: java jsp servlets


【解决方案1】:

我正在使用 javamail 包,它工作得非常好。上面显示的示例很好,但正如我所见,它们没有在推荐的外部文件(例如 web.xml)中定义参数......

假设您想更改您的电子邮件地址或 SMTP 主机。编辑 web.xml 文件比使用邮件功能的 10 个 servlet 容易得多。例如在 web.xml 中添加下一行

<context-param>
<param-name>smtp_server</param-name>
<param-value>smtp.blabla.com</param-value></context-param>

然后您可以使用 servlet 访问这些参数

// 1 - init
    Properties props = new Properties();
    //props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.host", smtp_server);
    props.put("mail.smtp.port", smtp_port); 

【讨论】:

    【解决方案2】:

    邮件逻辑应该放在它自己的独立类中,你可以在任何地方重复使用。 JSP 文件应该只包含表示逻辑和标记。 Servlet 类应该以适当的方式处理请求并调用 mailer 类。以下是您需要采取的步骤:

    1. 首先决定您要使用哪个SMTP server,以便能够发送电子邮件。您的 ISP 之一? Gmail 的那个?雅虎?网站托管服务提供商?自己维护的?无论如何,请计算此 SMTP 服务器的主机名、端口、用户名和密码。您将需要这些信息。


    2. 创建一个普通的 Java 类,它使用JavaMail API 发送邮件消息。 JavaMail API 带有出色的tutorialFAQ。将类命名为 Mailer 并给它一个 send() 方法(或任何你想要的)。使用带有main() 方法的一些测试器类对其进行测试,如下所示:

      public class TestMail {
          public static void main(String... args) throws Exception {
              // Create mailer.
              String hostname = "smtp.example.com";
              int port = 2525;
              String username = "nobody";
              String password = "idonttellyou";
              Mailer mailer = new Mailer(hostname, port, username, password);
      
              // Send mail.
              String from = "john.doe@example.com";
              String to = "jane.doe@example.com";
              String subject = "Interesting news";
              String message = "I've got JavaMail to work!";
              mailer.send(from, to, subject, message);
          }
      }
      

      您可以根据需要使其变得简单或高级。没关系,只要你有一个类可以发送这样的邮件。


    3. 现在是 JSP 部分,尚不完全清楚您为什么提到 JSP,但由于 JSP 是 supposed 仅代表 HTML,我敢打赌您希望在 JSP 中有类似联系表单的东西。这是一个启动示例:

      <form action="contact" method="post">
          <p>Your email address: <input name="email"></p>
          <p>Mail subject: <input name="subject"></p>
          <p>Mail message: <textarea name="message"></textarea></p>
          <p><input type="submit"><span class="message">${message}</span></p>
      </form>
      

      是的,很简单,只需按照您想要的方式标记/样式即可。


    4. 现在,创建一个 Servlet 类,它侦听 /contacturl-pattern(与表单提交的相同)并实现 doPost() 方法(与表单使用的方法相同),如下所示:

      public class ContactServlet extends HttpServlet {
          private Mailer mailer;
          private String to;
      
          public void init() {
              // Create mailer. You could eventually obtain the settings as
              // web.xml init parameters or from some properties file.
              String hostname = "smtp.example.com";
              int port = 2525;
              String username = "nobody";
              String password = "forgetit";
              this.mailer = new Mailer(hostname, port, username, password);
              this.to = "you@example.com";
          }
      
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              String email = request.getParameter("email");
              String subject = request.getParameter("subject");
              String message = request.getParameter("message");
              // Do some validations and then send mail:
      
              try {
                  mailer.send(email, to, subject, message);
                  request.setAttribute("message", "Mail succesfully sent!");
                  request.getRequestDispatcher("/WEB-INF/contact.jsp").forward(request, response);
              } catch (MailException e) {
                  throw new ServletException("Mailer failed", e);
              }
          }
      }
      

      就是这样。保持简单和干净。每件事都有其明确的职责。

    【讨论】:

    • JavaMail API 充满了静态方法调用,这会使您的代码难以测试。如果您可以选择使用 Spring,请查看 MailSender API (static.springsource.org/spring/docs/3.0.x/…)。
    • 看起来你的 send(from, to, subject, message) 和 oracle.com/webfolder/technetwork/tutorials/obe/java/javamail/… (sendMail 方法) 有点不同。
    • 您的 Mailer 的 send() 方法是什么样的?
    • 邮件是从我们自己的邮件服务器发送的?就像,我去我的GMail,写一封信然后寄给我自己……这是等价的。对吗,@BalusC?
    【解决方案3】:

    JSP 页面:

    <form action="mail.do" method="POST">
    <table>
        <tr>
        <td>To Email-id :<input type="text" name="email" /></td> <!--enter the email whom to send mail --> 
        <td><input type="submit" value="send"></input></td>
        </tr>
    </table>
    </form>
    

    这是 Servlet 代码:

    String uri=req.getRequestURI();
    
    if(uri.equals("/mail.do"))
            {
                SendEmail sa=new SendEmail();
                            String to_mail=request.getParameter("email");
                            String body="<html><body><table width=100%><tr><td>Hi this is Test mail</td></tr></table></body></html>";
                sa.SendingEmail(to_email,body);
    
            }
    

    还有 SendEmail 类:

     package Email;
    
    import java.util.Properties;
    
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.Session;
    import javax.mail.Transport;
    import javax.mail.internet.AddressException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    
    public class SendEmail {
    
        public void SendingEmail(String Email,String Body) throws AddressException, MessagingException
        {
    
                 String host ="smtp.gmail.com";
                 String from ="yourMailId";  //Your mail id
                 String pass ="yourPassword";   // Your Password
                 Properties props = System.getProperties();
                 props.put("mail.smtp.starttls.enable", "true"); // added this line
                 props.put("mail.smtp.host", host);
                 props.put("mail.smtp.user", from);
                 props.put("mail.smtp.password", pass);
                 props.put("mail.smtp.port", "25");
                 props.put("mail.smtp.auth", "true");
                 String[] to = {Email}; // To Email address
                 Session session = Session.getDefaultInstance(props, null);
                 MimeMessage message = new MimeMessage(session);
                 message.setFrom(new InternetAddress(from));
                 InternetAddress[] toAddress = new InternetAddress[to.length];        
                 // To get the array of addresses
                  for( int i=0; i < to.length; i++ )
                  { // changed from a while loop
                      toAddress[i] = new InternetAddress(to[i]);
                  }
                 System.out.println(Message.RecipientType.TO);
                 for( int j=0; j < toAddress.length; j++)
                 { // changed from a while loop
                 message.addRecipient(Message.RecipientType.TO, toAddress[j]);
                 }
                 message.setSubject("Email from SciArchives");
    
                 message.setContent(Body,"text/html");
                 Transport transport = session.getTransport("smtp");
                 transport.connect(host, from, pass);
                 transport.sendMessage(message, message.getAllRecipients());
                     transport.close();
            }
        }
    

    【讨论】:

      【解决方案4】:

      您可以从 jsp 或 servlet 发送邮件,就像我们使用 java 邮件 api 从类文件发送邮件一样。 这是可以帮助您的链接:

      http://www.java-samples.com/showtutorial.php?tutorialid=675

      【讨论】:

        猜你喜欢
        • 2014-01-28
        • 2010-12-19
        • 1970-01-01
        • 2011-11-20
        • 2017-01-16
        • 2011-03-25
        • 1970-01-01
        • 2011-11-14
        • 2016-12-12
        相关资源
        最近更新 更多