java发送带附件的qq邮件

由于腾讯公司给QQ邮箱多加了一个授权码的密码保护,导致之前很多网上的代码都不能运行,今天刚好项目有做到,就敲了一个demo。

jar:javax.mail.jar

demo:

  1 package xhw;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.BufferedWriter;
  5 import java.io.File;
  6 import java.io.FileNotFoundException;
  7 import java.io.FileOutputStream;
  8 import java.io.OutputStream;
  9 import java.io.OutputStreamWriter;
 10 import java.io.UnsupportedEncodingException;
 11 import java.util.Properties;
 12 
 13 import javax.activation.DataHandler;
 14 import javax.activation.DataSource;
 15 import javax.activation.FileDataSource;
 16 import javax.mail.BodyPart;
 17 import javax.mail.Message;
 18 import javax.mail.Multipart;
 19 import javax.mail.Session;
 20 import javax.mail.Transport;
 21 import javax.mail.internet.InternetAddress;
 22 import javax.mail.internet.MimeBodyPart;
 23 import javax.mail.internet.MimeMessage;
 24 import javax.mail.internet.MimeMultipart;
 25 
 26 public class SendMail2 {
 27 
 28 private String host = ""; // smtp服务器
 29 private String from = ""; // 发件人地址
 30 private String to = ""; // 收件人地址
 31 private String affix = ""; // 附件地址
 32 private String affixName = ""; // 附件名称
 33 private String user = ""; // 用户名
 34 private String pwd = ""; // 密码
 35 private String subject = ""; // 邮件标题
 36 
 37 public void setAddress(String from, String to, String subject) {
 38 this.from = from;
 39 this.to = to;
 40 this.subject = subject;
 41 }
 42 
 43 public void setAffix(String affix, String affixName) {
 44 this.affix = affix;
 45 this.affixName = affixName;
 46 }
 47 
 48 public void send(String host, String user, String pwd) {
 49 this.host = host;
 50 this.user = user;
 51 this.pwd = pwd;
 52 
 53 Properties props = new Properties();
 54 
 55 // 设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
 56 props.put("mail.smtp.host", host);
 57 // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证
 58 props.put("mail.smtp.auth", "true");
 59 props.put("mail.smtp.port", 465);
 60 props.put("mail.smtp.ssl.enable", true);
 61 // 用刚刚设置好的props对象构建一个session
 62 Session session = Session.getDefaultInstance(props);
 63 
 64 // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
 65 // 用(你可以在控制台(console)上看到发送邮件的过程)
 66 session.setDebug(true);
 67 
 68 // 用session为参数定义消息对象
 69 MimeMessage message = new MimeMessage(session);
 70 try {
 71 // 加载发件人地址
 72 message.setFrom(new InternetAddress(from));
 73 // 加载收件人地址
 74 message.addRecipient(Message.RecipientType.TO, new InternetAddress(
 75 to));
 76 // 加载标题
 77 message.setSubject(subject);
 78 
 79 // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
 80 Multipart multipart = new MimeMultipart();
 81 
 82 // 设置邮件的文本内容
 83 BodyPart contentPart = new MimeBodyPart();
 84 contentPart.setText("第二种方法···");
 85 multipart.addBodyPart(contentPart);
 86 // 添加附件
 87 BodyPart messageBodyPart = new MimeBodyPart();
 88 DataSource source = new FileDataSource(affix);
 89 // 添加附件的内容
 90 messageBodyPart.setDataHandler(new DataHandler(source));
 91 // 添加附件的标题
 92 // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
 93 sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
 94 messageBodyPart.setFileName("=?GBK?B?"
 95 + enc.encode(affixName.getBytes()) + "?=");
 96 multipart.addBodyPart(messageBodyPart);
 97 
 98 // 将multipart对象放到message中
 99 message.setContent(multipart);
100 // 保存邮件
101 message.saveChanges();
102 // 发送邮件
103 Transport transport = session.getTransport("smtp");
104 // 连接服务器的邮箱
105 transport.connect(host, user, pwd);
106 // 把邮件发送出去
107 transport.sendMessage(message, message.getAllRecipients());
108 transport.close();
109 } catch (Exception e) {
110 e.printStackTrace();
111 }
112 }
113 
114 public static void main(String[] args) {
115 
116 File file = new File("D:\\content.csv");
117 try {
118 OutputStream os = new FileOutputStream(file);
119 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os,
120 "utf-8"));
121 bw.write("hello");
122 bw.close();
123 os.close();
124 } catch (Exception e) {
125 // TODO Auto-generated catch block
126 e.printStackTrace();
127 }
128 
129 
130 SendMail2 cn = new SendMail2();
131 // 设置发件人地址、收件人地址和邮件标题
132 cn.setAddress("发件人地址", "收件人地址", "一个带附件的JavaMail邮件(标题)");
133 // 设置要发送附件的位置和标题
134 cn.setAffix("文件路径", "文件名称");
135 // 设置smtp服务器以及邮箱的帐号和密码
136 cn.send("smtp.qq.com", "账号", "密码(QQ授权码)");
137 }
138 }

在密码这个地方要特别注意,因为多了QQ授权码的保护,所以要到qq邮箱去设置,具体地址:http://service.mail.qq.com/cgi-bin/help?id=28

posted @ 2016-04-11 20:22  逍遥卫子  阅读(410)  评论(0)    收藏  举报