10H 高级 WebDriver – 发送带有附件的电子邮件

原文: https://javabeginnerstutorial.com/selenium/10h-advanced-webdriver-sending-email-with-attachments/

嗨冠军! 现在我们已经有了 PDF 格式的 JUnit 报告,让我们将其附加到电子邮件中并发送给各个项目利益相关者。 因此,今天我们主要将仅使用 Java。 大家都来一杯咖啡(Java)!

我们将研究两个类。

  1. SendMail.java – 此类包含用于发送电子邮件的所有代码。
  2. InvokeMail.java – 通过提供从地址到地址,主题行和一些文本来调用SendMail.java

代码

SendMail.java

  1. package com.blog.utility;
  2. import java.util.Properties;
  3. import javax.activation.DataHandler;
  4. import javax.activation.DataSource;
  5. import javax.activation.FileDataSource;
  6. import javax.mail.BodyPart;
  7. import javax.mail.Message;
  8. import javax.mail.MessagingException;
  9. import javax.mail.Multipart;
  10. import javax.mail.PasswordAuthentication;
  11. import javax.mail.Session;
  12. import javax.mail.Transport;
  13. import javax.mail.internet.InternetAddress;
  14. import javax.mail.internet.MimeBodyPart;
  15. import javax.mail.internet.MimeMessage;
  16. import javax.mail.internet.MimeMultipart;
  17. /*
  18. * This class has the main code for sending mail
  19. */
  20. public class SendMail {
  21. public static void send(String from, String tos[], String subject,
  22. String text) throws MessagingException {
  23. // Get the session object
  24. Properties props = new Properties();
  25. props.put("mail.smtp.host", "smtp.gmail.com");
  26. props.put("mail.smtp.socketFactory.port", "465");
  27. props.put("mail.smtp.socketFactory.class",
  28. "javax.net.ssl.SSLSocketFactory");
  29. props.put("mail.smtp.auth", "true");
  30. props.put("mail.smtp.port", "465");
  31. Session session = Session.getDefaultInstance(props,
  32. new javax.mail.Authenticator() {
  33. protected PasswordAuthentication getPasswordAuthentication() {
  34. return new PasswordAuthentication(
  35. "[[email protected]](/cdn-cgi/l/email-protection)",
  36. "pass1234");// change accordingly
  37. }
  38. });
  39. // compose message
  40. try {
  41. MimeMessage message = new MimeMessage(session);
  42. message.setFrom(new InternetAddress(from));// change accordingly
  43. for (String to : tos) {
  44. message.addRecipient(Message.RecipientType.TO,
  45. new InternetAddress(to));
  46. }
  47. /*
  48. * for (String cc : ccs)
  49. * message.addRecipient(Message.RecipientType.CC,new
  50. * InternetAddress(cc));
  51. */
  52. message.setSubject(subject);
  53. // Option 1: To send normal text message
  54. // message.setText(text);
  55. // Option 2: Send the actual HTML message, as big as you like
  56. // message.setContent("<h1>This is actual message</h1></br></hr>" +
  57. // text, "text/html");
  58. // Set the attachment path
  59. String filename = "E:\\Selenium\\junit.pdf";
  60. BodyPart objMessageBodyPart = new MimeBodyPart();
  61. // Option 3: Send text along with attachment
  62. objMessageBodyPart.setContent(
  63. "<h1>Mail from Selenium Project!</h1></br>" + text, "text/html");
  64. Multipart multipart = new MimeMultipart();
  65. multipart.addBodyPart(objMessageBodyPart);
  66. objMessageBodyPart = new MimeBodyPart();
  67. DataSource source = new FileDataSource(filename);
  68. objMessageBodyPart.setDataHandler(new DataHandler(source));
  69. objMessageBodyPart.setFileName(filename);
  70. multipart.addBodyPart(objMessageBodyPart);
  71. message.setContent(multipart);
  72. // send message
  73. Transport.send(message);
  74. System.out.println("message sent successfully");
  75. } catch (MessagingException e) {
  76. throw new RuntimeException(e);
  77. }
  78. }// End of SEND method
  79. }

InvokeMail.java

  1. package com.blog.junitTests;
  2. import javax.mail.MessagingException;
  3. import com.blog.utility.SendMail;
  4. /*
  5. * Invokes SendMail.java
  6. */
  7. public class InvokeMail {
  8. public static void main(String[] args) throws MessagingException {
  9. //String to[] = {"[[email protected]](/cdn-cgi/l/email-protection)","[[email protected]](/cdn-cgi/l/email-protection)"};
  10. String to[] = {"[[email protected]](/cdn-cgi/l/email-protection)"};
  11. SendMail.send("[[email protected]](/cdn-cgi/l/email-protection)", to, "JUnit Report", "Check the PDF attachment.");
  12. }
  13. }

解释

直接看一下代码会使我们感到难以接受。 让我们一次了解一个摘要。

与往常一样,我们的第一步是下载几个 JAR。

  1. activation.jar
  2. javax.mail-1.6.1.jar

我还将它们都放在了我们的 GitHub 仓库中,以及作为本文一部分处理的所有其他代码文件中。

将这些 JAR 添加到我们的项目构建路径中。 我们之前已经多次看到此程序,因此我不再重复(有关详细说明,请参阅此文章的步骤 3)。

了解SendMail.java,

1.编写所有代码的方法,以便我们可以从任何类轻松地调用它。

  1. public static void send(String from, String tos[], String subject,
  2. String text) throws MessagingException {}

2.给定的属性仅适用于 Gmail。 如果您根据项目要求使用 Outlook 或任何其他服务,则应相应地进行更改。

  1. Properties props = new Properties();
  2. props.put("mail.smtp.host", "smtp.gmail.com");
  3. props.put("mail.smtp.socketFactory.port", "465");
  4. props.put("mail.smtp.socketFactory.class",
  5. "javax.net.ssl.SSLSocketFactory");
  6. props.put("mail.smtp.auth", "true");
  7. props.put("mail.smtp.port", "465");

3.获取会话对象并传递您的电子邮件帐户的凭据(您在地址中提到的凭据)。

  1. Session session = Session.getDefaultInstance(props,
  2. new javax.mail.Authenticator() {
  3. protected PasswordAuthentication getPasswordAuthentication() {
  4. return new PasswordAuthentication("[[email protected]](/cdn-cgi/l/email-protection)","pass1234");// change accordingly
  5. }
  6. });

4.现在是有趣的部分。 我们将指定“发件人”和“收件人”地址。

  1. message.setFrom(new InternetAddress(from));
  2. for (String to : tos) {
  3. message.addRecipient(Message.RecipientType.TO,
  4. new InternetAddress(to));
  5. }

如果您只想将此电子邮件发送给一个人,请更改以下代码,

  1. message.setFrom(new InternetAddress(from));
  2. message.addRecipient(Message.RecipientType.TO,
  3. new InternetAddress(to));

如果您希望将其发送给抄送给某些人的用户,请按以下所示更改代码,

  1. message.addRecipient(Message.RecipientType.CC,new InternetAddress(cc));

5.将主题行设置为message.setSubject(subject);

6.要发送,

  • 普通短信message.setText(text);
  • 实际的 HTML 消息尽可能多message.setContent("<h1>This is actual message</h1></br></hr>" + text, "text/html");
  • 文本和附件(这就是我们想要的),
  1. // Set the attachment path
  2. String filename = "E:\\Selenium\\junit.pdf";
  3. BodyPart objMessageBodyPart = new MimeBodyPart();
  4. objMessageBodyPart.setContent("<h1>Mail from Selenium Project!</h1></br>" + text, "text/html");
  5. Multipart multipart = new MimeMultipart();
  6. multipart.addBodyPart(objMessageBodyPart);
  7. objMessageBodyPart = new MimeBodyPart();
  8. DataSource source = new FileDataSource(filename);
  9. objMessageBodyPart.setDataHandler(new DataHandler(source));
  10. objMessageBodyPart.setFileName(filename);
  11. multipart.addBodyPart(objMessageBodyPart);
  12. message.setContent(multipart);

7.用简单的一行发送电子邮件,

  1. Transport.send(message);

了解InvokeMail.java,

此类很容易理解,因为我们只是通过提供所有必需的参数从SendMail.java调用“send”方法。

  1. String to[] = {"[[email protected]](/cdn-cgi/l/email-protection)"};
  2. SendMail.send("[[email protected]](/cdn-cgi/l/email-protection)", to, "JUnit Report", "Check the PDF attachment.");

在“运行方式-> Java 应用”下,Eclipse IDE 控制台的输出如下所示,

Email eclipse console output

该电子邮件将在收件人的收件箱中接收。

Email received in Inbox

显示生成的带有附件的电子邮件,以供您参考。

Generated email

注意: 当心! 您可能碰到“javax.mail.AuthenticationFailedException”。 发生此异常的主要原因是 Google 提供的安全性和保护功能。 一种简单的解决方法是,通过单击链接 https://www.google.com/settings/security/lesssecureapps 来打开“允许安全程度较低的应用”的访问以进行测试。

试试看,让我知道在拍摄电子邮件时是否遇到任何问题。

实验愉快! 祝你今天愉快!