您的位置:首页 > 编程语言 > Java开发

JavaMail创建邮件和发送邮件

2016-01-05 15:18 351 查看

一、RFC882文档简单说明

  RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔。

  邮件头包含的内容有:

from字段   –用于指明发件人
to字段    –用于指明收件人
subject字段 –用于说明邮件主题
cc字段    – 抄送,将邮件发送给收件人的同时抄送给另一个收件人,收件人可以看到邮件抄送给了谁
bcc字段    – 密送,将邮件发送给收件人的同时将邮件秘密发送给另一个收件人,收件人无法看到邮件密送给了谁

  邮件体指的就是邮件的具体内容。

二、MIME协议简单介绍

  在我们的实际开发当中,一封邮件既可能包含图片,又可能包含有附件,在这样的情况下,RFC882文档规定的邮件格式就无法满足要求了。

  MIME协议是对RFC822文档的升级和补充,它描述了如何生产一封复杂的邮件。通常我们把MIME协议描述的邮件称之为MIME邮件。MIME协议描述的数据称之为MIME消息。

  

  对于一封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使用分隔线对多段数据进行分隔,并使用Content-Type头字段对数据的类型、以及多个数据之间的关系进行描述。

三、使用JavaMail创建邮件和发送邮件

  JavaMail创建的邮件是基于MIME协议的。因此可以使用JavaMail创建出包含图片,包含附件的复杂邮件。

3.1、JavaMail API的简单介绍

  


  


  


3.2、创建邮件发送测试项目

  


3.3、发送一封只包含文本的简单邮件

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.main;

<span class="hljs-keyword">import</span> java.util.Properties;
<span class="hljs-keyword">import</span> javax.mail.Message;
<span class="hljs-keyword">import</span> javax.mail.Session;
<span class="hljs-keyword">import</span> javax.mail.Transport;
<span class="hljs-keyword">import</span> javax.mail.internet.InternetAddress;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMessage;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: Sendmail
*<span class="hljs-javadoctag"> @Description</span>: 发送Email
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2015-1-12 下午9:42:56
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Sendmail</span> {</span>

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @param</span> args
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) <span class="hljs-keyword">throws</span> Exception {

Properties prop = <span class="hljs-keyword">new</span> Properties();
prop.setProperty(<span class="hljs-string">"mail.host"</span>, <span class="hljs-string">"smtp.sohu.com"</span>);
prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);
<span class="hljs-comment">//使用JavaMail发送邮件的5个步骤</span>
<span class="hljs-comment">//1、创建session</span>
Session session = Session.getInstance(prop);
<span class="hljs-comment">//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2、通过session得到transport对象</span>
Transport ts = session.getTransport();
<span class="hljs-comment">//3、使用邮箱的用户名和密码连上邮件服务器,发送邮件时,发件人需要提交邮箱的用户名和密码给smtp服务器,用户名和密码都通过验证之后才能够正常发送邮件给收件人。</span>
ts.connect(<span class="hljs-string">"smtp.sohu.com"</span>, <span class="hljs-string">"gacl"</span>, <span class="hljs-string">"邮箱密码"</span>);
<span class="hljs-comment">//4、创建邮件</span>
Message message = createSimpleMail(session);
<span class="hljs-comment">//5、发送邮件</span>
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: createSimpleMail
*<span class="hljs-javadoctag"> @Description</span>: 创建一封只包含文本的邮件
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> session
*<span class="hljs-javadoctag"> @return</span>
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> MimeMessage <span class="hljs-title">createSimpleMail</span>(Session session)
<span class="hljs-keyword">throws</span> Exception {
<span class="hljs-comment">//创建邮件对象</span>
MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);
<span class="hljs-comment">//指明邮件的发件人</span>
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"gacl@sohu.com"</span>));
<span class="hljs-comment">//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发</span>
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"gacl@sohu.com"</span>));
<span class="hljs-comment">//邮件的标题</span>
message.setSubject(<span class="hljs-string">"只包含文本的简单邮件"</span>);
<span class="hljs-comment">//邮件的文本内容</span>
message.setContent(<span class="hljs-string">"你好啊!"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);
<span class="hljs-comment">//返回创建好的邮件对象</span>
<span class="hljs-keyword">return</span> message;
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li></ul>

3.4、发送包含内嵌图片的邮件

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.main;

<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.util.Properties;

<span class="hljs-keyword">import</span> javax.activation.DataHandler;
<span class="hljs-keyword">import</span> javax.activation.FileDataSource;
<span class="hljs-keyword">import</span> javax.mail.Message;
<span class="hljs-keyword">import</span> javax.mail.Session;
<span class="hljs-keyword">import</span> javax.mail.Transport;
<span class="hljs-keyword">import</span> javax.mail.internet.InternetAddress;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeBodyPart;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMessage;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMultipart;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: Sendmail
*<span class="hljs-javadoctag"> @Description</span>: 发送Email
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2015-1-12 下午9:42:56
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Sendmail</span> {</span>

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @param</span> args
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) <span class="hljs-keyword">throws</span> Exception {

Properties prop = <span class="hljs-keyword">new</span> Properties();
prop.setProperty(<span class="hljs-string">"mail.host"</span>, <span class="hljs-string">"smtp.sohu.com"</span>);
prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);
<span class="hljs-comment">//使用JavaMail发送邮件的5个步骤</span>
<span class="hljs-comment">//1、创建session</span>
Session session = Session.getInstance(prop);
<span class="hljs-comment">//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2、通过session得到transport对象</span>
Transport ts = session.getTransport();
<span class="hljs-comment">//3、连上邮件服务器,需要发件人提供邮箱的用户名和密码进行验证</span>
ts.connect(<span class="hljs-string">"smtp.sohu.com"</span>, <span class="hljs-string">"gacl"</span>, <span class="hljs-string">"邮箱密码"</span>);
<span class="hljs-comment">//4、创建邮件</span>
Message message = createImageMail(session);
<span class="hljs-comment">//5、发送邮件</span>
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: createImageMail
*<span class="hljs-javadoctag"> @Description</span>: 生成一封邮件正文带图片的邮件
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> session
*<span class="hljs-javadoctag"> @return</span>
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> MimeMessage <span class="hljs-title">createImageMail</span>(Session session) <span class="hljs-keyword">throws</span> Exception {
<span class="hljs-comment">//创建邮件</span>
MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);
<span class="hljs-comment">// 设置邮件的基本信息</span>
<span class="hljs-comment">//发件人</span>
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"gacl@sohu.com"</span>));
<span class="hljs-comment">//收件人</span>
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"xdp_gacl@sina.cn"</span>));
<span class="hljs-comment">//邮件标题</span>
message.setSubject(<span class="hljs-string">"带图片的邮件"</span>);

<span class="hljs-comment">// 准备邮件数据</span>
<span class="hljs-comment">// 准备邮件正文数据</span>
MimeBodyPart text = <span class="hljs-keyword">new</span> MimeBodyPart();
text.setContent(<span class="hljs-string">"这是一封邮件正文带图片<img src='cid:xxx.jpg'>的邮件"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);
<span class="hljs-comment">// 准备图片数据</span>
MimeBodyPart image = <span class="hljs-keyword">new</span> MimeBodyPart();
DataHandler dh = <span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src\\1.jpg"</span>));
image.setDataHandler(dh);
image.setContentID(<span class="hljs-string">"xxx.jpg"</span>);
<span class="hljs-comment">// 描述数据关系</span>
MimeMultipart mm = <span class="hljs-keyword">new</span> MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType(<span class="hljs-string">"related"</span>);

message.setContent(mm);
message.saveChanges();
<span class="hljs-comment">//将创建好的邮件写入到E盘以文件的形式进行保存</span>
message.writeTo(<span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"E:\\ImageMail.eml"</span>));
<span class="hljs-comment">//返回创建好的邮件</span>
<span class="hljs-keyword">return</span> message;
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li></ul>

3.5、发送包含附件的邮件

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.main;

<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.util.Properties;

<span class="hljs-keyword">import</span> javax.activation.DataHandler;
<span class="hljs-keyword">import</span> javax.activation.FileDataSource;
<span class="hljs-keyword">import</span> javax.mail.Message;
<span class="hljs-keyword">import</span> javax.mail.Session;
<span class="hljs-keyword">import</span> javax.mail.Transport;
<span class="hljs-keyword">import</span> javax.mail.internet.InternetAddress;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeBodyPart;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMessage;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMultipart;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: Sendmail
*<span class="hljs-javadoctag"> @Description</span>: 发送Email
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2015-1-12 下午9:42:56
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Sendmail</span> {</span>

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @param</span> args
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) <span class="hljs-keyword">throws</span> Exception {

Properties prop = <span class="hljs-keyword">new</span> Properties();
prop.setProperty(<span class="hljs-string">"mail.host"</span>, <span class="hljs-string">"smtp.sohu.com"</span>);
prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);
<span class="hljs-comment">//使用JavaMail发送邮件的5个步骤</span>
<span class="hljs-comment">//1、创建session</span>
Session session = Session.getInstance(prop);
<span class="hljs-comment">//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2、通过session得到transport对象</span>
Transport ts = session.getTransport();
<span class="hljs-comment">//3、连上邮件服务器</span>
ts.connect(<span class="hljs-string">"smtp.sohu.com"</span>, <span class="hljs-string">"gacl"</span>, <span class="hljs-string">"邮箱密码"</span>);
<span class="hljs-comment">//4、创建邮件</span>
Message message = createAttachMail(session);
<span class="hljs-comment">//5、发送邮件</span>
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: createAttachMail
*<span class="hljs-javadoctag"> @Description</span>: 创建一封带附件的邮件
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> session
*<span class="hljs-javadoctag"> @return</span>
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> MimeMessage <span class="hljs-title">createAttachMail</span>(Session session) <span class="hljs-keyword">throws</span> Exception{
MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);

<span class="hljs-comment">//设置邮件的基本信息</span>
<span class="hljs-comment">//发件人</span>
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"gacl@sohu.com"</span>));
<span class="hljs-comment">//收件人</span>
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"xdp_gacl@sina.cn"</span>));
<span class="hljs-comment">//邮件标题</span>
message.setSubject(<span class="hljs-string">"JavaMail邮件发送测试"</span>);

<span class="hljs-comment">//创建邮件正文,为了避免邮件正文中文乱码问题,需要使用charset=UTF-8指明字符编码</span>
MimeBodyPart text = <span class="hljs-keyword">new</span> MimeBodyPart();
text.setContent(<span class="hljs-string">"使用JavaMail创建的带附件的邮件"</span>, <span class="hljs-string">"text/html;charset=UTF-8"</span>);

<span class="hljs-comment">//创建邮件附件</span>
MimeBodyPart attach = <span class="hljs-keyword">new</span> MimeBodyPart();
DataHandler dh = <span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src\\2.jpg"</span>));
attach.setDataHandler(dh);
attach.setFileName(dh.getName());  <span class="hljs-comment">//</span>

<span class="hljs-comment">//创建容器描述数据关系</span>
MimeMultipart mp = <span class="hljs-keyword">new</span> MimeMultipart();
mp.addBodyPart(text);
mp.addBodyPart(attach);
mp.setSubType(<span class="hljs-string">"mixed"</span>);

message.setContent(mp);
message.saveChanges();
<span class="hljs-comment">//将创建的Email写入到E盘存储</span>
message.writeTo(<span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"E:\\attachMail.eml"</span>));
<span class="hljs-comment">//返回生成的邮件</span>
<span class="hljs-keyword">return</span> message;
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li></ul>

3.6、发送包含内嵌图片和附件的复杂邮件

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.main;

<span class="hljs-keyword">import</span> java.io.FileOutputStream;
<span class="hljs-keyword">import</span> java.util.Properties;
<span class="hljs-keyword">import</span> javax.activation.DataHandler;
<span class="hljs-keyword">import</span> javax.activation.FileDataSource;
<span class="hljs-keyword">import</span> javax.mail.Message;
<span class="hljs-keyword">import</span> javax.mail.Session;
<span class="hljs-keyword">import</span> javax.mail.Transport;
<span class="hljs-keyword">import</span> javax.mail.internet.InternetAddress;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeBodyPart;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMessage;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMultipart;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeUtility;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: Sendmail
*<span class="hljs-javadoctag"> @Description</span>: 发送Email
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2015-1-12 下午9:42:56
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Sendmail</span> {</span>

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @param</span> args
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) <span class="hljs-keyword">throws</span> Exception {

Properties prop = <span class="hljs-keyword">new</span> Properties();
prop.setProperty(<span class="hljs-string">"mail.host"</span>, <span class="hljs-string">"smtp.sohu.com"</span>);
prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);
<span class="hljs-comment">//使用JavaMail发送邮件的5个步骤</span>
<span class="hljs-comment">//1、创建session</span>
Session session = Session.getInstance(prop);
<span class="hljs-comment">//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态</span>
session.setDebug(<span class="hljs-keyword">true</span>);
<span class="hljs-comment">//2、通过session得到transport对象</span>
Transport ts = session.getTransport();
<span class="hljs-comment">//3、连上邮件服务器</span>
ts.connect(<span class="hljs-string">"smtp.sohu.com"</span>, <span class="hljs-string">"gacl"</span>, <span class="hljs-string">"邮箱密码"</span>);
<span class="hljs-comment">//4、创建邮件</span>
Message message = createMixedMail(session);
<span class="hljs-comment">//5、发送邮件</span>
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: createMixedMail
*<span class="hljs-javadoctag"> @Description</span>: 生成一封带附件和带图片的邮件
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> session
*<span class="hljs-javadoctag"> @return</span>
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> MimeMessage <span class="hljs-title">createMixedMail</span>(Session session) <span class="hljs-keyword">throws</span> Exception {
<span class="hljs-comment">//创建邮件</span>
MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);

<span class="hljs-comment">//设置邮件的基本信息</span>
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"gacl@sohu.com"</span>));
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(<span class="hljs-string">"xdp_gacl@sina.cn"</span>));
message.setSubject(<span class="hljs-string">"带附件和带图片的的邮件"</span>);

<span class="hljs-comment">//正文</span>
MimeBodyPart text = <span class="hljs-keyword">new</span> MimeBodyPart();
text.setContent(<span class="hljs-string">"xxx这是女的xxxx<br/><img src='cid:aaa.jpg'>"</span>,<span class="hljs-string">"text/html;charset=UTF-8"</span>);

<span class="hljs-comment">//图片</span>
MimeBodyPart image = <span class="hljs-keyword">new</span> MimeBodyPart();
image.setDataHandler(<span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src\\3.jpg"</span>)));
image.setContentID(<span class="hljs-string">"aaa.jpg"</span>);

<span class="hljs-comment">//附件1</span>
MimeBodyPart attach = <span class="hljs-keyword">new</span> MimeBodyPart();
DataHandler dh = <span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src\\4.zip"</span>));
attach.setDataHandler(dh);
attach.setFileName(dh.getName());

<span class="hljs-comment">//附件2</span>
MimeBodyPart attach2 = <span class="hljs-keyword">new</span> MimeBodyPart();
DataHandler dh2 = <span class="hljs-keyword">new</span> DataHandler(<span class="hljs-keyword">new</span> FileDataSource(<span class="hljs-string">"src\\波子.zip"</span>));
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText(dh2.getName()));

<span class="hljs-comment">//描述关系:正文和图片</span>
MimeMultipart mp1 = <span class="hljs-keyword">new</span> MimeMultipart();
mp1.addBodyPart(text);
mp1.addBodyPart(image);
mp1.setSubType(<span class="hljs-string">"related"</span>);

<span class="hljs-comment">//描述关系:正文和附件</span>
MimeMultipart mp2 = <span class="hljs-keyword">new</span> MimeMultipart();
mp2.addBodyPart(attach);
mp2.addBodyPart(attach2);

<span class="hljs-comment">//代表正文的bodypart</span>
MimeBodyPart content = <span class="hljs-keyword">new</span> MimeBodyPart();
content.setContent(mp1);
mp2.addBodyPart(content);
mp2.setSubType(<span class="hljs-string">"mixed"</span>);

message.setContent(mp2);
message.saveChanges();

message.writeTo(<span class="hljs-keyword">new</span> FileOutputStream(<span class="hljs-string">"E:\\MixedMail.eml"</span>));
<span class="hljs-comment">//返回创建好的的邮件</span>
<span class="hljs-keyword">return</span> message;
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li></ul>

  以上就是使用JavaMail的API创建邮件和发送邮件的全部内容。

现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

四、搭建开发环境

4.1、创建Web项目

  


4.2、用户注册的Jsp页面

register.jsp

<code class="hljs xml has-numbering"><span class="vbscript"><%@ page language=<span class="hljs-string">"java"</span> pageEncoding=<span class="hljs-string">"UTF-8"</span>%></span>
<span class="hljs-doctype"><!DOCTYPE HTML></span>
<span class="hljs-tag"><<span class="hljs-title">html</span>></span>
<span class="hljs-tag"><<span class="hljs-title">head</span>></span>
<span class="hljs-tag"><<span class="hljs-title">title</span>></span>注册页面<span class="hljs-tag"></<span class="hljs-title">title</span>></span>
<span class="hljs-tag"></<span class="hljs-title">head</span>></span>

<span class="hljs-tag"><<span class="hljs-title">body</span>></span>
<span class="hljs-tag"><<span class="hljs-title">form</span> <span class="hljs-attribute">action</span>=<span class="hljs-value">"${pageContext.request.contextPath}/servlet/RegisterServlet"</span> <span class="hljs-attribute">method</span>=<span class="hljs-value">"post"</span>></span>
用户名:<span class="hljs-tag"><<span class="hljs-title">input</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"username"</span>></span><span class="hljs-tag"><<span class="hljs-title">br</span>/></span>
密码:<span class="hljs-tag"><<span class="hljs-title">input</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"password"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"password"</span>></span><span class="hljs-tag"><<span class="hljs-title">br</span>/></span>
邮箱:<span class="hljs-tag"><<span class="hljs-title">input</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text"</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"email"</span>></span><span class="hljs-tag"><<span class="hljs-title">br</span>/></span>
<span class="hljs-tag"><<span class="hljs-title">input</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"submit"</span> <span class="hljs-attribute">value</span>=<span class="hljs-value">"注册"</span>></span>
<span class="hljs-tag"></<span class="hljs-title">form</span>></span>
<span class="hljs-tag"></<span class="hljs-title">body</span>></span>
<span class="hljs-tag"></<span class="hljs-title">html</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li></ul>

4.3、消息提示页面

message.jsp

<code class="hljs xml has-numbering"><span class="vbscript"><%@ page language=<span class="hljs-string">"java"</span> pageEncoding=<span class="hljs-string">"UTF-8"</span>%></span>
<span class="hljs-doctype"><!DOCTYPE HTML></span>
<span class="hljs-tag"><<span class="hljs-title">html</span>></span>
<span class="hljs-tag"><<span class="hljs-title">head</span>></span>
<span class="hljs-tag"><<span class="hljs-title">title</span>></span>消息提示页面<span class="hljs-tag"></<span class="hljs-title">title</span>></span>
<span class="hljs-tag"></<span class="hljs-title">head</span>></span>

<span class="hljs-tag"><<span class="hljs-title">body</span>></span>
${message}
<span class="hljs-tag"></<span class="hljs-title">body</span>></span>
<span class="hljs-tag"></<span class="hljs-title">html</span>></span></code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li></ul>

五、编写处理用户注册处理程序

5.1、开发封装用户注册信息的domain

User.java

<code class="hljs cs has-numbering">package me.gacl.domain;

<span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> User {
<span class="hljs-keyword">private</span> String username;
<span class="hljs-keyword">private</span> String password;
<span class="hljs-keyword">private</span> String email;
<span class="hljs-keyword">public</span> String <span class="hljs-title">getUsername</span>() {
<span class="hljs-keyword">return</span> username;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setUsername</span>(String username) {
<span class="hljs-keyword">this</span>.username = username;
}
<span class="hljs-keyword">public</span> String <span class="hljs-title">getPassword</span>() {
<span class="hljs-keyword">return</span> password;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setPassword</span>(String password) {
<span class="hljs-keyword">this</span>.password = password;
}
<span class="hljs-keyword">public</span> String <span class="hljs-title">getEmail</span>() {
<span class="hljs-keyword">return</span> email;
}
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">setEmail</span>(String email) {
<span class="hljs-keyword">this</span>.email = email;
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul>

5.2、编写邮件发送功能

  发送邮件是一件非常耗时的事情,因此这里设计一个线程类来发送邮件

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.controller;

<span class="hljs-keyword">import</span> java.util.Properties;
<span class="hljs-keyword">import</span> javax.mail.Message;
<span class="hljs-keyword">import</span> javax.mail.Session;
<span class="hljs-keyword">import</span> javax.mail.Transport;
<span class="hljs-keyword">import</span> javax.mail.internet.InternetAddress;
<span class="hljs-keyword">import</span> javax.mail.internet.MimeMessage;
<span class="hljs-keyword">import</span> me.gacl.domain.User;

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @ClassName</span>: Sendmail
*<span class="hljs-javadoctag"> @Description</span>: Sendmail类继承Thread,因此Sendmail就是一个线程类,这个线程类用于给指定的用户发送Email
*<span class="hljs-javadoctag"> @author</span>: 孤傲苍狼
*<span class="hljs-javadoctag"> @date</span>: 2015-1-12 下午10:43:48
*
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Sendmail</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Thread</span> {</span>
<span class="hljs-comment">//用于给用户发送邮件的邮箱</span>
<span class="hljs-keyword">private</span> String from = <span class="hljs-string">"gacl@sohu.com"</span>;
<span class="hljs-comment">//邮箱的用户名</span>
<span class="hljs-keyword">private</span> String username = <span class="hljs-string">"gacl"</span>;
<span class="hljs-comment">//邮箱的密码</span>
<span class="hljs-keyword">private</span> String password = <span class="hljs-string">"邮箱密码"</span>;
<span class="hljs-comment">//发送邮件的服务器地址</span>
<span class="hljs-keyword">private</span> String host = <span class="hljs-string">"smtp.sohu.com"</span>;

<span class="hljs-keyword">private</span> User user;
<span class="hljs-keyword">public</span> <span class="hljs-title">Sendmail</span>(User user){
<span class="hljs-keyword">this</span>.user = user;
}

<span class="hljs-comment">/* 重写run方法的实现,在run方法中发送邮件给指定的用户
* @see java.lang.Thread#run()
*/</span>
<span class="hljs-annotation">@Override</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">run</span>() {
<span class="hljs-keyword">try</span>{
Properties prop = <span class="hljs-keyword">new</span> Properties();
prop.setProperty(<span class="hljs-string">"mail.host"</span>, host);
prop.setProperty(<span class="hljs-string">"mail.transport.protocol"</span>, <span class="hljs-string">"smtp"</span>);
prop.setProperty(<span class="hljs-string">"mail.smtp.auth"</span>, <span class="hljs-string">"true"</span>);
Session session = Session.getInstance(prop);
session.setDebug(<span class="hljs-keyword">true</span>);
Transport ts = session.getTransport();
ts.connect(host, username, password);
Message message = createEmail(session,user);
ts.sendMessage(message, message.getAllRecipients());
ts.close();
}<span class="hljs-keyword">catch</span> (Exception e) {
<span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> RuntimeException(e);
}
}

<span class="hljs-javadoc">/**
*<span class="hljs-javadoctag"> @Method</span>: createEmail
*<span class="hljs-javadoctag"> @Description</span>: 创建要发送的邮件
*<span class="hljs-javadoctag"> @Anthor</span>:孤傲苍狼
*
*<span class="hljs-javadoctag"> @param</span> session
*<span class="hljs-javadoctag"> @param</span> user
*<span class="hljs-javadoctag"> @return</span>
*<span class="hljs-javadoctag"> @throws</span> Exception
*/</span>
<span class="hljs-keyword">public</span> Message <span class="hljs-title">createEmail</span>(Session session,User user) <span class="hljs-keyword">throws</span> Exception{

MimeMessage message = <span class="hljs-keyword">new</span> MimeMessage(session);
message.setFrom(<span class="hljs-keyword">new</span> InternetAddress(from));
message.setRecipient(Message.RecipientType.TO, <span class="hljs-keyword">new</span> InternetAddress(user.getEmail()));
message.setSubject(<span class="hljs-string">"用户注册邮件"</span>);

String info = <span class="hljs-string">"恭喜您注册成功,您的用户名:"</span> + user.getUsername() + <span class="hljs-string">",您的密码:"</span> + user.getPassword() + <span class="hljs-string">",请妥善保管,如有问题请联系网站客服!!"</span>;
message.setContent(info, <span class="hljs-string">"text/html;charset=UTF-8"</span>);
message.saveChanges();
<span class="hljs-keyword">return</span> message;
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li></ul>

5.3、编写处理用户注册的Servlet

<code class="hljs java has-numbering"><span class="hljs-keyword">package</span> me.gacl.web.controller;

<span class="hljs-keyword">import</span> java.io.IOException;
<span class="hljs-keyword">import</span> javax.servlet.ServletException;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServlet;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletRequest;
<span class="hljs-keyword">import</span> javax.servlet.http.HttpServletResponse;
<span class="hljs-keyword">import</span> me.gacl.domain.User;
<span class="hljs-keyword">import</span> me.gacl.service.UserService;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">RegisterServlet</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">HttpServlet</span> {</span>

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doGet</span>(HttpServletRequest request, HttpServletResponse response)
<span class="hljs-keyword">throws</span> ServletException, IOException {
<span class="hljs-keyword">try</span>{
String username = request.getParameter(<span class="hljs-string">"username"</span>);
String password = request.getParameter(<span class="hljs-string">"password"</span>);
String email = request.getParameter(<span class="hljs-string">"email"</span>);
User user = <span class="hljs-keyword">new</span> User();
user.setEmail(email);
user.setPassword(password);
user.setUsername(username);

System.out.println(<span class="hljs-string">"把用户信息注册到数据库中"</span>);
<span class="hljs-comment">//用户注册成功之后就使用用户注册时的邮箱给用户发送一封Email</span>
<span class="hljs-comment">//发送邮件是一件非常耗时的事情,因此这里开辟了另一个线程来专门发送邮件</span>
Sendmail send = <span class="hljs-keyword">new</span> Sendmail(user);
<span class="hljs-comment">//启动线程,线程启动之后就会执行run方法来发送邮件</span>
send.start();

<span class="hljs-comment">//注册用户</span>
<span class="hljs-comment">//new UserService().registerUser(user);</span>
request.setAttribute(<span class="hljs-string">"message"</span>, <span class="hljs-string">"恭喜您,注册成功,我们已经发了一封带了注册信息的电子邮件,请查收,如果没有收到,可能是网络原因,过一会儿就收到了!!"</span>);
request.getRequestDispatcher(<span class="hljs-string">"/message.jsp"</span>).forward(request, response);
}<span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
request.setAttribute(<span class="hljs-string">"message"</span>, <span class="hljs-string">"注册失败!!"</span>);
request.getRequestDispatcher(<span class="hljs-string">"/message.jsp"</span>).forward(request, response);
}
}

<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">doPost</span>(HttpServletRequest request, HttpServletResponse response)
<span class="hljs-keyword">throws</span> ServletException, IOException {
doGet(request, response);
}
}</code><ul style="display: block;" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li></ul>

  程序运行效果如下:

  


  现在很多网站都有这样的功能,用户注册完成之后,网站根据我们注册时填写的邮箱给我们一封Email,然后点击Email中的超链接去激活我们的用户。这种功能就是这样实现的。

  在总结使用JavaMail发送邮件时发现,将邮件发送到sina或者sohu的邮箱时,不一定能够马上收取得到邮件,总是有延迟,有时甚至会延迟很长的时间,甚至会被当成垃圾邮件来处理掉,或者干脆就拒绝接收,有时候为了看到邮件发送成功的效果,要等半天,实属无奈啊。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: