Java发送Mail总结
来源:互联网 发布:中世纪2优化9农业收入 编辑:程序博客网 时间:2024/06/05 06:57
让其折磨的够呛,何不彻底弄懂
一个简单的mail组成部分
import java.util.Properties;import javax.mail.Authenticator;import javax.mail.Message;import javax.mail.MessagingException;import javax.mail.PasswordAuthentication;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import junit.framework.TestCase;public class MailTest extends TestCase { public void test_Mail() { // 收件人电子邮箱 String to = "此处填收件人邮箱地址"; // 发件人电子邮箱 String from = "此处填写发件人邮箱地址"; Properties props = new Properties(); // 指定发送邮件的主机为 localhost props.put("mail.smtp.host", "此处填写邮箱服务器主机"); props.put("mail.smtp.auth", "true"); // 创建Session对象 Session session = Session.getDefaultInstance(props // 以匿名内部类的形式创建登录服务器的认证对象 , new Authenticator() { public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("你的邮箱用户名", "你的邮箱密码"); } }); try { // 创建默认的 MimeMessage 对象 MimeMessage message = new MimeMessage(session); // Set From: 头部头字段 message.setFrom(new InternetAddress(from)); // Set To: 头部头字段 message.addRecipient(Message.RecipientType.TO, new InternetAddress( to)); // Set Subject: 头部头字段 message.setSubject("This is the Subject Line!"); // 设置消息体 message.setText("This is actual message"); // 发送消息 Transport.send(message); System.out.println("Sent message successfully...."); } catch (MessagingException mex) { mex.printStackTrace(); } }}
测试成功:
现在来看看上面的邮件组成部分:
Properties
邮件属性设置,包括邮箱服务器的地址和认证。
Authenticator
存放用户名和密码
MimeMessage
邮件主体对象,可以设置邮件头部字段中收件人和发件人、邮件的标题、邮件的消息体。
其中如果想要发送多人,可以调用
addRecipients(Message.RecipientType type, Address[] addresses)
type代表后面的地址是密送还是抄送还是收件人的区别。
Transport
邮件交换机,可以发送邮件。
HTML邮件
html格式的邮件只需要在上面的基础上加一句话就可以发送了?
// 发送 HTML 消息, 可以插入html标签 message.setContent("<a href=\"http://www.baidu.com\">This is actual message</a>", "text/html");
将html文件的内容发送出去(非附件)
比如我们有一个html格式如下:
就是一个百度首页无图片版本。我想要把这些内容展示在邮件内容中,而不是发送附件,如何做到?
首先我们知道上面发送邮件内容的时候调用的是message.setContent
第一个参数就代表邮件内容,类型为String。那么我们把刚才的html文件转化为字符串是不是就可以显示了?所以我们用IO类来读写该html文件,找了一个方法如下:
public String readHTML(String spath) { InputStreamReader isReader = null; BufferedReader bufReader = null; StringBuffer buf = new StringBuffer(); try { File file = new File(spath); isReader = new InputStreamReader(new FileInputStream(file), "utf-8"); bufReader = new BufferedReader(isReader, 1); String data; while ((data = bufReader.readLine()) != null) { buf.append(data); } } catch (Exception e) { // TODO 处理异常 } finally { // TODO 关闭流 try { isReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { bufReader.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return buf.toString(); }
ok,现在我们将message.setContent更改如下:
// 发送 HTML 消息, 可以插入html标签 message.setContent(readHTML("/Users/wuxian/Downloads/百度一下,你就知道.html"), "text/html");
执行后,查看邮箱:
可以看到乱码了?所以我们先解决乱码
邮件内容乱码解决办法
只需要在messag.setContent第二个参数后更改为"text/html; charset=utf-8"
就ok啦。
我们html的内容展示在了邮件内容中,但是排版有点问题,这个问题以后再说吧。
HTML带图片
上图中虽然看不太清楚,但是隐约能看得见百度的标,跟之前没有图片的图一对比就能看得出来。那么我们如何将这个图片发送到邮件内容中呢?
图片连接到远程地址
首先我们可以将图片放到网上,通过url去读取。比如我们将刚才的图片上传到CSDN的服务器上,图片地址为http://img.blog.csdn.net/20150420170423953
,我们在html中引用这个地址。然后我们就可以在邮件的内容中看到这个图片:
附件形式
但是上面的缺陷是你必须连接网络,一旦断网了你就看不到了?据说可以用附件的形式去引用?但当然不是把将其当附件发送出去,效果还是要跟上面的一样,展示在邮件的内容中。如何做呢?为了做到这一点,我们将其分2块讲解
发送附件
要想发送附件,我们要将上面的代码改造一下,引入Multipart和MimeBodyPart的概念,这个两个类的引入是为了将邮件的主题部分分隔成多个小部分。Multipart含有多个MimeBodyPart对象。
将之前Message.setContent直接设置邮件内容的语句分割成如下代码:
Multipart mp = new MimeMultipart(); MimeBodyPart mbp = new MimeBodyPart(); mbp.setText(readHTML("/Users/wuxian/Downloads/百度一下,你就知道.html"), "utf-8", "html"); // 将BodyPart添加到MultiPart中 mp.addBodyPart(mbp); // 发送 HTML 消息, 可以插入html标签 message.setContent(mp);
这个时候要注意的是设置邮件内容格式为html话以及支持中文,是需要在MimeBodyPart.setText中加参数设置的。上面的改变对邮件内容没有任何变化。邮件内容是一样的,我就不再截图了。
添加附件
//添加附件 MimeBodyPart mbpAtt = new MimeBodyPart(); // 以文件名创建FileDataSource对象 FileDataSource fds = new FileDataSource("/Users/wuxian/Downloads/百度一下,你就知道_files/logo_white_ee663702.png"); // 处理附件 mbpAtt.setDataHandler(new DataHandler(fds)); mbpAtt.setFileName(fds.getName()); // 将BodyPart添加到MultiPart中 mp.addBodyPart(mbpAtt);
添加附件的时候我们新建了一个MimeBodyPart对象,然后将该对象添加到Multipart中,我们会在附件栏中看到添加的附件。
引用附件中的内容
ok,附件我们已经准备好了,如何在邮件的html文件中引用它呢?首先我们给添加附件的MimeBodyPart设置一个Content-id:
mbpAtt.setContentID("logo");
然后我们在html文件源码中引用图片的地方加引用content-id为logo的图片
<img id="s_lg_img" src="cid:logo" height="129" width="270">
然后我们发送的邮件里面就能引用到这个图片啦!
Done!
- Java发送Mail总结
- java发送mail
- java发送mail
- java 发送mail
- Java Mail 发送邮件
- JAVA MAIL发送邮件
- java 发送mail
- 发送电子邮件 java mail
- Java Mail 发送邮件
- Java mail发送邮件
- JAVA发送mail
- java mail 发送邮件
- Java Mail发送邮件
- java mail邮件发送
- java mail 发送邮件
- Java mail发送邮件
- java mail发送邮件
- Java mail 发送邮件
- Android Fragment 真正的完全解析(上)
- UVA题目分类索引
- Android检查是否已经连接到网络
- Scala讲座:面向对象和函数式的特点总结(1)
- CSS颜色渐变记录
- Java发送Mail总结
- android ExpandableListView BaseExpandableListAdapter
- hadoop1.1.2格式化出错:*is in an inconsistent state: storage directory does not exist or is not accessible
- java 验证码生成
- dsgfrdvgdewgedvfewg
- Linux下的OpenSSL编程
- Smarty3.1.18的配置和简单使用
- Java编程基础知识入门:变量与数据类型
- hdoj 1084 What Is Your Grade?