一、目标
用java代码实现发送带附件email的功能
二、学习地址
http://wenku.baidu.com/view/0b5acc82e53a580216fcfe4e.html
http://redleaf.iteye.com/blog/78217
三、前期准备:
增加jar包:javamail1_4_5.zip
四、代码
public class SendMailService { private MailInformation mailInfor; private static SendMailService sendMailService; public void setMailInfor(MailInformation mailInfor) { this.mailInfor = mailInfor; } public static SendMailService getService() { if (sendMailService == null) { sendMailService = new SendMailService(); } return sendMailService; } /** * 此段代码用来发送普通带附件电子邮件 */ public void send() throws Exception { try { Properties props = new Properties(); // 获取系统环境 Authenticator auth = new Email_Autherticator(); // 进行邮件服务器用户认证 props.put("mail.smtp.host", mailInfor.getHost()); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props, auth); // 用于在console中显示执行过程信息 session.setDebug(true); // 设置session,和邮件服务器进行通讯。 MimeMessage message = new MimeMessage(session); message.setSubject(mailInfor.getMail_subject()); // 设置邮件标题 message.setSentDate(new Date()); // 设置邮件发送日期 Address address = new InternetAddress(mailInfor.getSendEmail(), mailInfor.getSendPassword()); message.setFrom(address); // 设置邮件发送者的地址 Address toAddress = new InternetAddress(mailInfor.getMail_to()); // 设置邮件接收方的地址 message.addRecipient(Message.RecipientType.TO, toAddress);// 加载收件人地址 message.setText(mailInfor.getMail_body()); // 设置邮件正文 // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件 Multipart multipart = new MimeMultipart(); // 设置邮件的文本内容 BodyPart contentPart = new MimeBodyPart(); contentPart.setText(mailInfor.getMail_body()); multipart.addBodyPart(contentPart); multipart.addBodyPart(contentPart); if (!mailInfor.getFile().isEmpty()) {// 有附件 Enumeration efile = mailInfor.getFile().elements(); while (efile.hasMoreElements()) { contentPart = new MimeBodyPart(); String filename = efile.nextElement().toString(); // 选择出每一个附件名 FileDataSource fds = new FileDataSource(filename); // 得到数据源 contentPart.setDataHandler(new DataHandler(fds)); // 得到附件本身并至入BodyPart // contentPart.setFileName(fds.getName()); // //得到文件名同样至入BodyPart,并解决中文名乱码问题 contentPart.setFileName(MimeUtility.encodeText(fds .getName())); multipart.addBodyPart(contentPart); } mailInfor.getFile().removeAllElements(); } // 将multipart对象放到message中 message.setContent(multipart, "text/html;charset=gb2312"); // Multipart加入到信件 // 保存邮件 message.saveChanges(); Transport.send(message); // 发送邮件 System.out.println("send ok!"); } catch (Exception ex) { ex.printStackTrace(); throw new Exception(ex.getMessage()); } } /** * 用来进行服务器对用户的认证 */ class Email_Autherticator extends Authenticator { public Email_Autherticator() { super(); } Email_Autherticator(String user, String pwd) { super(); mailInfor.setSendEmail(user); mailInfor.setSendPassword(pwd); } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(mailInfor.getSendEmail(), mailInfor.getSendPassword()); } } }
javaBean
public class MailInformation { // 发送邮件的邮箱地址服务器 private String host; // 这个是你的邮箱用户名以及邮件显示发送者邮箱 private String sendEmail ; // 你的邮箱密码 private String sendPassword ; //邮件发送者显示姓名 private String sendName ; //待接收的邮箱 private String mail_to ; //邮件标题 private String mail_subject; //邮件内容 private String mail_body ; //用于保存发送附件的文件名的集合 private Vector<String> file ; /** * 建立发邮件实体时传入发件人的email信息 * @param sendEmail email地址 * @param sendPassword email密码 * @param sendName 发送邮件中显示发件人姓名 */ public MailInformation(String sendEmail,String sendPassword,String sendName){ this.sendEmail = sendEmail; this.sendPassword = sendPassword; this.sendName = sendName; } /** * 163邮箱的host */ public void set163Host(){ host = "smtp.163.com"; } /** * 126邮箱的host */ public void set126Host(){ host = "smtp.126.com"; } /** * qq邮箱的host */ public void setQQHost(){ host = "smtp.qq.com"; } /** * 雅虎邮箱的host */ public void setYahooHost(){ host = "smtp.mail.yahoo.com.cn "; } /** * 获得发送邮件的邮箱地址服务器 * @return 地址服务器 */ public String getHost() { return host; } /** * 设置发送邮件的邮箱地址服务器 * @param host */ public void setHost(String host) { this.host = host; } /** * 设置发件人的email * @param sendEmail email */ public void setSendEmail(String sendEmail) { this.sendEmail = sendEmail; } /** * 得到发件人的email * @return sendEmail email */ public String getSendEmail() { return sendEmail ; } /** * 设置发件人的email密码 * @param sendPassword 密码 */ public void setSendPassword(String sendPassword) { this.sendPassword = sendPassword; } /** * 得到发件人的email密码 * @return sendPassword 密码 */ public String getSendPassword() { return sendPassword ; } /** * 得到邮件中显示的发件人姓名 * @return 发件人姓名 */ public String getSendName() { return sendName; } /** * 设置邮件中显示的发件人姓名 * @param sendName 发件人姓名 */ public void setSendName(String sendName) { this.sendName = sendName; } /** * 得到收件人email * @return 收件人email */ public String getMail_to() { return mail_to; } /** * 设置收件人email * @param mail_to 收件人email */ public void setMail_to(String mail_to) { this.mail_to = mail_to; } /** * 邮件标题 * @return 邮件标题 */ public String getMail_subject() { return mail_subject; } /** * 设置邮件标题 * @param mail_subject 邮件标题 */ public void setMail_subject(String mail_subject) { this.mail_subject = mail_subject; } /** * 得到邮件内容 * @return 邮件内容 */ public String getMail_body() { return mail_body; } /** * 设置邮件内容 * @param mail_body 邮件内容 */ public void setMail_body(String mail_body) { this.mail_body = mail_body; } /** * 得到附件所在的绝对路径 * @return 绝对路径 */ public Vector<String> getFile() { return file; } /** * 天剑附件所在的绝对路径 * @return 绝对路径 */ public void setFile(Vector<String> file) { this.file = file; } }
五、调用方式
public static void main(String[] args) { SendMailService sendmail = SendMailService.getService(); MailInformation mailInformation = new MailInformation( "发件人email", "发件人email密码", "发件人显示姓名"); mailInformation.set163Host(); mailInformation.setMail_subject("测试发送邮件"); mailInformation.setMail_body("这是一封测试是否能够发送带附件邮件的信"); mailInformation.setMail_to("收件人email"); Vector<String> fileStr = new Vector<String>(); fileStr.add("附件地址绝对路径"); mailInformation.setFile(fileStr); sendmail.setMailInfor(mailInformation); try { sendmail.send(); } catch (Exception ex) { ex.printStackTrace(); } }
六、问题解决
1、发送邮件的邮箱地址服务器
需要搜索得到发件人邮箱的 SMTP服务器地址,比如126的:http://help.163.com/09/0219/10/52GOPOND007536NI.html
2、中文名附件乱码解决
解决地址:http://ben-sin.iteye.com/blog/387536
方法:contentPart.setFileName(MimeUtility.encodeText (fds.getName()));