<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>JavaMail | 酷 壳 - CoolShell</title>
	<atom:link href="https://coolshell.cn/tag/javamail/feed" rel="self" type="application/rss+xml" />
	<link>https://coolshell.cn</link>
	<description>享受编程和技术所带来的快乐 - Coding Your Ambition</description>
	<lastBuildDate>Sun, 10 Apr 2011 13:57:38 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2</generator>
	<item>
		<title>JavaMail使用</title>
		<link>https://coolshell.cn/articles/4261.html</link>
					<comments>https://coolshell.cn/articles/4261.html#comments</comments>
		
		<dc:creator><![CDATA[jjzhx_1211]]></dc:creator>
		<pubDate>Wed, 06 Apr 2011 15:05:39 +0000</pubDate>
				<category><![CDATA[Java语言]]></category>
		<category><![CDATA[Web开发]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaMail]]></category>
		<guid isPermaLink="false">http://coolshell.cn/?p=4261</guid>

					<description><![CDATA[<p>（本文由网友jjzhx_1211投递，感谢!） 使用JavaMail需要两个包：activation-1.1.jar和mail-1.4.2.jar（当然现在最新...</p>
<p class="read-more"><a class="btn btn-default" href="https://coolshell.cn/articles/4261.html"> Read More<span class="screen-reader-text">  Read More</span></a></p>
The post <a href="https://coolshell.cn/articles/4261.html">JavaMail使用</a> first appeared on <a href="https://coolshell.cn">酷 壳 - CoolShell</a>.]]></description>
										<content:encoded><![CDATA[<p><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3415450859608158"
     crossorigin="anonymous"></script>（<strong>本文由网友jjzhx_1211投递，感谢!</strong>）</p>
<p>使用JavaMail需要两个包：activation-1.1.jar和mail-1.4.2.jar（当然现在最新的版本已经不止了），也可以直接包含Java SE 6的j2ee.jar，自带了前面的两个包。我把邮件功能写成了一个服务，发送邮件的数据都通过Map&lt;String, String&gt;类型的参数封装了起来。<strong>代码见文章最后</strong>。</p>
<h4>Session</h4>
<p>Session 定义了一个基本的邮件会话，任何工作都是基于这个Session的。Session 对象需要一个 java.util.Properties 对象来得到类似 邮件服务器，用户名，密码这样的信息。Session 的构造函数是私有的，可以通过 getDefaultInstance() 方法来取得一个单一的可以被共享的默认session 如：</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Properties props = new Properties();
Session session = Session.getDefaultInstance(props,null);</pre>
<p>或者，可以使用 getInstance() 方法来创建一个唯一的 session如：</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Properties props = new Properties();
Session session = Session.getInstance(props,null);</pre>
<p>在这两种方法中 其中的 null 参数是一个 Authenticator 对象，在这里没有被使用的，所以就是null。在大多数案例中，使用一个共享session 已经做够了。</p>
<p><span id="more-4261"></span></p>
<h4>Message</h4>
<p>一旦你创建了Session对象，那么下面要做的就是创建message来发送。Message是一个抽象类，在大部分应用中你可以使用它的子类javax.mail.internet.MimeMessage 。MimeMessage 是一个理解在不同RFCs中定义的MIME类型以及headers的e-mail message。Message headers 必须使用 US-ASCII 字符集。可以用如下的方法创建一个Message</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">MimeMessage message = new MimeMessage(session);</code></p>
<p>我们注意到，这里需要用session对象作为构造函数的参数。当然，还有其它的构造函数，比如从用RFC822格式化过的输入流来创建message。</p>
<p>一旦你得到了 message ,你就可以来设置它的各个部分（parts）。设置内容（content）的基本的机制是使用setContent() 方法。</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">message.setContent(&quot;Email Content. &quot;,&quot;text/plain&quot;);</code></p>
<p>如果，你能够明确你的使用MimeMessage来创建message 并且只是使用普通的文本（plain text） 那么你也可以使用 setText() 方法，setTest()方法只需要设置具体的内容，它默认的MIME类型是 text/plain</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">message.setText(&quot;Email Content. &quot;);</code></p>
<p>对于普通文本类型的邮件，有一种机制是首选（ message.setText(&#8220;Email Content. &#8220;)）的设置内容的方法。如果要创建其它类型的message ，比如　HTML类型的message   那么还是需要使用前者　（　message.setContent(&#8220;Email Content. &#8220;,&#8221;text/html&#8221;);　）<br />
设置主题（subject ），使用setSubject() 方法</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">message.setSubject(&quot; Subject &quot;);</code></p>
<h4>Address</h4>
<p>当你已经创建Session 以及 Message，并且已经为message 填充了内容，那么接下来要做的就是给你的邮件添加一个地址（Address）。　就像Message一样，Address也是一个抽象类，我们可以使用它的一个子</p>
<p>javax.mail.internet.InternetAddress</p>
<p>创建一个地址非常简单</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">Address address = new InternetAddress(&quot;&lt;a href=&quot;mailto:suixin@asiainfo.com&quot;&gt;suixin@asiainfo.com&lt;/a&gt;&quot;);</code></p>
<p>如果，你希望在出现邮件地址的地方出现一个名称，那么你只需要再多传递一个参数。</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">Address address = new InternetAddress(&quot;&lt;a href=&quot;mailto:suixin@asiainfo.com&amp;quot;,&amp;quot;Steve&quot;&gt;suixin@asiainfo.com&quot;,&quot;Steve&lt;/a&gt;&quot;);</code></p>
<p>你需要为 message 的from以及 to 字段创建address对象。为了识别发送者，你需要使用setFrom() 和 setReplyTo() 方法。</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">messge.setFrom(address);</code></p>
<p>如果你的message 需要显示多个 from 地址，可以使用 addFrom() 方法</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Address address[] = {....};
message.addFrom(address);</pre>
<p>为了辨识message 的收件人，你需要使用 setRecipient() 方法。这个方法除了address参数之外，还需要一</p>
<p>Message.RecipientType 。<br />
message.addRecipient(type,address);<br />
Message.RecipientType有几个预先定义好的类型<br />
Message.RecipientType.TO　　收件人<br />
Message.RecipientType.CC　　抄送<br />
Message.RecipientType.BCC　 暗送</p>
<p>如果你的一封邮件，需要发送给你的老师，并还要给你的几个同学，那么你可以这样</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Address toAddress = new InternetAddress(&quot;&lt;a href=&quot;mailto:teacher@17288.com&quot;&gt;teacher@17288.com&lt;/a&gt;&quot;);
Address[] ccAddress = {new InternetAddress(&quot;&lt;a href=&quot;mailto:schoolmate1@17288.com&amp;quot;),new&quot;&gt;schoolmate1@17288.com&quot;),new&lt;/a&gt; InternetAddress(&quot;&lt;a href=&quot;mailto:schoolmate2@17288.com&quot;&gt;schoolmate2@17288.com&lt;/a&gt;&quot;)};
message.addRecipient(Message.RecipientType.To, toAddress);
message.addRecipient(Message.RecipientType.CC, ccAddress);</pre>
<p>JavaMail 没有提供电子邮件地址有效性的检测。这些超越了JavaMail API的范围。</p>
<h4>Authenticator</h4>
<p>通过Authenticator设置用户名、密码，来访问受保护的资源，这里的资源一般指的是邮件服务器。</p>
<p>Authenticator也是一个抽象类，你需要自己编写子类已备应用。你需要实现getPasswordAuthentication()方法，并返回一个PasswordAuthentication实例。你必须在 session被创建时， 注册你的 Authenticator。这样，当需要进行认证是，你的Authenticator就可以被得到。</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Properties props = new Properties();
//设置属性
Authenticator auth = new YourAuthenticator();
Session session = Session.getDefaultInstance(props, auth);</pre>
<h4>Transport</h4>
<p>发送消息最后的一步就是使用Transport类，你可以通过两种方法来进行发送。<br />
Transport 是一个抽象类，你可以调用它静态的send() 方法来发送</p>
<p><code data-enlighter-language="java" class="EnlighterJSRAW">Transport.send(message);</code></p>
<p>或者，你可以为你使用的协议从session中取得一个指定的实例，</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Transport transport = session.getTransport(&quot;smtp&quot;);
transport.sendMessage(message, message.getAllRecipients());
transport.close();</pre>
<h4>Store and Folder</h4>
<p>这两个类重要用于取得信息。在创建了Session之后，需要连接到一个 Store ，你需要告诉Store你使用的是什么协议。</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">// Store store = session.getStore(&quot;imap&quot;);
Store store = session.getStore(&quot;pop3&quot;);
store.connect(host, username, password);</pre>
<p>在连接到一个 Store 后，你可以得到一个 Folder，当然，这个Floder必须是打开的。</p>
<pre data-enlighter-language="java" class="EnlighterJSRAW">Folder folder = store.getFolder(&quot;INBOX&quot;);
folder.open(Folder.READ_ONLY);
Message message[] = folder.getMessages();</pre>
<p>如果使用POP3那么，INDEX是唯一可用的文件夹。如果使用的是IMAP，你就可以使用其它的文件夹。</p>
<h4>代码</h4>
<pre data-enlighter-language="java" class="EnlighterJSRAW">public boolean sendEmail(Map&lt;String, String&gt; data) {
    // 创建Properties 对象
    Properties props = System.getProperties();
    props.put(&quot;mail.smtp.host&quot;, Constants.HOST); // 全局变量
    props.put(&quot;mail.smtp.auth&quot;, &quot;true&quot;);

    // 创建邮件会话
    Session session = Session.getDefaultInstance(props,
    new Authenticator() { // 验账账户
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(Constants.USERNAME,
                                              Constants.PASSWORD);
        }
    });

    try {
        // 定义邮件信息
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(Constants.FROM));
        message.addRecipient(
            Message.RecipientType.TO,
            new InternetAddress(
                // 这里可以添加多个目的用户
                data.get(Constants.EMAIL_TO)
            )
        );
        // 添加邮件发送时间（不知道体现在哪儿）
        message.setSentDate(new Date());
        // 要编码，否则中文会出乱码，貌似这个方法是对数据进行了
        //(&quot;=?GB2312?B?&quot;+enc.encode(subject.getBytes())+&quot;?=&quot;)形势的包装
        message.setSubject(MimeUtility.encodeText(data.get(Constants.EMAIL_SUBJECT), &quot;gbk&quot;, &quot;B&quot;));

        MimeMultipart mmp = new MimeMultipart();
        MimeBodyPart mbp_text = new MimeBodyPart();
        // &quot;text/plain&quot;是文本型，没有样式，
        //&quot;text/html&quot;是html样式，可以解析html标签
        mbp_text.setContent(data.get(Constants.EMAIL_TEXT),
                            &quot;text/html;charset=gbk&quot;);
        mmp.addBodyPart(mbp_text); // 加入邮件正文

        // 处理附件，可以添加多个附件
        if (data.get(Constants.EMAIL_ATTACHMENT) != null) {
            String[] files = data.get(Constants.EMAIL_ATTACHMENT).split(&quot;,&quot;);
            if (files.length != 0) {
                for (String file : files) {
                    MimeBodyPart mbp_file = new MimeBodyPart();
                    FileDataSource fds = new FileDataSource(file);
                    mbp_file.setDataHandler(new DataHandler(fds));
                    mbp_file.setFileName(MimeUtility.encodeText(fds.getName(), &quot;gbk&quot;, &quot;B&quot;));
                    mmp.addBodyPart(mbp_file);
                }
            }
        }
        message.setContent(mmp);
        // message.setText(data.get(Constants.EMAIL_TEXT));

        // 发送消息
        // session.getTransport(&quot;smtp&quot;).send(message); //也可以这样创建Transport对象
        Transport.send(message);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}
</pre>
<p>（全文完）<!--



<p align="center"><a href= target=_blank><img decoding="async" src=""></a></p>





<p align="center"><img decoding="async" src="https://coolshell.cn/wp-content/uploads/2020/03/coolshell.weixin.jpg"> <img decoding="async" loading="lazy" src="https://coolshell.cn/wp-content/uploads/2020/03/coolshell.mini_.jpg" width="300" height="300"> <br />关注CoolShell微信公众账号和微信小程序</p>

 

--></p>
<div style="margin-top: 15px; font-size: 16px;color: #cc0000;">
<p align="center"><strong>（转载本站文章请注明作者和出处 <a href="https://coolshell.cn/">酷 壳 &#8211; CoolShell</a> ，请勿用于任何商业用途）</strong></p>
</div>

<div class="wp_rp_wrap  wp_rp_vertical_m" id="wp_rp_first"><div class="wp_rp_content"><h3 class="related_post_title">相关文章</h3><ul class="related_post wp_rp"><li ><a href="https://coolshell.cn/articles/20845.html" class="wp_rp_thumbnail"><img src="https://coolshell.cn/wp-content/uploads/2020/03/rust-social-wide-150x150.jpg" alt="Rust语言的编程范式" width="150" height="150" /></a><a href="https://coolshell.cn/articles/20845.html" class="wp_rp_title">Rust语言的编程范式</a></li><li ><a href="https://coolshell.cn/articles/18360.html" class="wp_rp_thumbnail"><img src="https://coolshell.cn/wp-content/uploads/2018/05/300x262-150x150.jpg" alt="程序员练级攻略（2018)  与我的专栏" width="150" height="150" /></a><a href="https://coolshell.cn/articles/18360.html" class="wp_rp_title">程序员练级攻略（2018)  与我的专栏</a></li><li ><a href="https://coolshell.cn/articles/11541.html" class="wp_rp_thumbnail"><img src="https://coolshell.cn/wp-content/plugins/wordpress-23-related-posts-plugin/static/thumbs/24.jpg" alt="面向GC的Java编程" width="150" height="150" /></a><a href="https://coolshell.cn/articles/11541.html" class="wp_rp_title">面向GC的Java编程</a></li><li ><a href="https://coolshell.cn/articles/11454.html" class="wp_rp_thumbnail"><img src="https://coolshell.cn/wp-content/plugins/wordpress-23-related-posts-plugin/static/thumbs/17.jpg" alt="从LongAdder看更高效的无锁实现" width="150" height="150" /></a><a href="https://coolshell.cn/articles/11454.html" class="wp_rp_title">从LongAdder看更高效的无锁实现</a></li><li ><a href="https://coolshell.cn/articles/11175.html" class="wp_rp_thumbnail"><img src="https://coolshell.cn/wp-content/uploads/2014/03/cow-copy-150x150.jpg" alt="Java中的CopyOnWrite容器" width="150" height="150" /></a><a href="https://coolshell.cn/articles/11175.html" class="wp_rp_title">Java中的CopyOnWrite容器</a></li><li ><a href="https://coolshell.cn/articles/9703.html" class="wp_rp_thumbnail"><img src="https://coolshell.cn/wp-content/uploads/2013/05/图1-3-150x150.jpg" alt="无锁HashMap的原理与实现" width="150" height="150" /></a><a href="https://coolshell.cn/articles/9703.html" class="wp_rp_title">无锁HashMap的原理与实现</a></li></ul></div></div>The post <a href="https://coolshell.cn/articles/4261.html">JavaMail使用</a> first appeared on <a href="https://coolshell.cn">酷 壳 - CoolShell</a>.]]></content:encoded>
					
					<wfw:commentRss>https://coolshell.cn/articles/4261.html/feed</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
			</item>
	</channel>
</rss>
