JAVA中发送电子邮件的方法

  JAVA中发送邮件的方法不复杂,使用sun的JavaMail的架包就可以实现。

一、下载JavaMail的架包,并导入项目中,如下:

二、附上代码例子,如下:

1、在main函数中对各项参数进行赋值(参数说明已进行备注),即可通过send函数进行发送邮件操作。

 1 public class TestEmail {
 2
 3     private final static String TIMEOUT_MS = "20000";
 4
 5     public static void main(String[] args) {
 6         String host = "smtp.exmail.qq.com";
 7         String user = "[email protected]";
 8         String password = "xxxxxx";
 9         String recipients = "[email protected]";
10         String cc = "";
11         String subject = "邮件发送测试";
12         String content = "邮件正文:<br>你好!";
13         //方式1:通过URL获取附件
14 //        byte[] attachment = FileUtil.getFileByUrl("http://127.0.0.1/project/test.pdf");
15         //方式2:通过本地路径获取附件
16         byte[] attachment = FileUtil.getFileByPath("c://fujian.pdf");
17
18         String attachmentName = "";
19         try {
20             attachmentName = MimeUtility.encodeWord("这是附件.pdf");
21             send(host, user, password, recipients, cc, subject, content, attachment, attachmentName);
22         } catch (Exception e) {
23             e.printStackTrace();
24         }
25     }
26
27     /**
28      * @param host 邮件服务器主机名
29      * @param user 用户名
30      * @param password 密码
31      * @param recipients 收件人
32      * @param cc 抄送人
33      * @param subject 主题
34      * @param content 内容
35      * @param attachment 附件 [没有传 null]
36      * @param attachmentName 附件名称 [没有传 null]
37      * @throws Exception
38      */
39     public static void send(final String host, final String user, final String password,
40                      final String recipients, final String cc, final String subject, final String content,
41                      final byte[] attachment,final String attachmentName) throws Exception {
42         Properties props = new Properties();
43         props.put("mail.smtp.host", host);
44         props.put("mail.smtp.auth", "true");
45         props.put("mail.smtp.timeout", TIMEOUT_MS);
46
47         Authenticator auth = new Authenticator() {
48             @Override
49             protected PasswordAuthentication getPasswordAuthentication() {
50                 return new PasswordAuthentication(user, password);
51             }
52         };
53         Session session = Session.getInstance(props, auth);
54         MimeMessage msg = new MimeMessage(session);
55         msg.setFrom(new InternetAddress(user));
56         msg.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));
57         if (cc != null && cc.length() > 0) {
58             msg.setRecipients(Message.RecipientType.CC, cc);
59         }
60         msg.setSubject(subject);
61         // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
62         Multipart multipart = new MimeMultipart();
63         // 添加邮件正文
64         BodyPart contentPart = new MimeBodyPart();
65         contentPart.setContent(content, "text/html;charset=UTF-8");
66         multipart.addBodyPart(contentPart);
67         // 添加附件的内容
68         if (attachment!=null) {
69             BodyPart attachmentBodyPart = new MimeBodyPart();
70             DataSource source = new ByteArrayDataSource(attachment,"application/octet-stream");
71             attachmentBodyPart.setDataHandler(new DataHandler(source));
72             //MimeUtility.encodeWord可以避免文件名乱码
73             attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachmentName));
74             multipart.addBodyPart(attachmentBodyPart);
75         }
76         // 将multipart对象放到message中
77         msg.setContent(multipart);
78         // 保存邮件
79         msg.saveChanges();
80         Transport.send(msg, msg.getAllRecipients());
81     }
82 }

2、上面的例子中,如果有附件,可对附件进行设置。附件的获取这里举2个例子,方式1通过网址获取,方式2通过本地获取。附上获取附件文件的方法,如下:

 1 public class FileUtil {
 2
 3     public static byte[] getFileByUrl(String urlStr){
 4         try {
 5             URL url = new URL(urlStr);
 6             HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 7             InputStream is = conn.getInputStream();
 8             BufferedInputStream bis = new BufferedInputStream(is);
 9             ByteArrayOutputStream baos = new ByteArrayOutputStream();
10             final int BUFFER_SIZE = 2048;
11             final int EOF = -1;
12             int c;
13             byte[] buf = new byte[BUFFER_SIZE];
14             while (true) {
15                 c = bis.read(buf);
16                 if (c == EOF)
17                     break;
18                 baos.write(buf, 0, c);
19             }
20             conn.disconnect();
21             is.close();
22
23             byte[] data = baos.toByteArray();
24             baos.flush();
25             return data;
26
27         } catch (Exception e) {
28             e.printStackTrace();
29         }
30         return null;
31     }
32
33     public static byte[] getFileByPath(String pathStr){
34         File file = new File(pathStr);
35         try {
36             FileInputStream fis = new FileInputStream(file);
37             ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
38             byte[] b = new byte[1000];
39             int n;
40             while ((n = fis.read(b)) != -1) {
41                 bos.write(b, 0, n);
42             }
43             fis.close();
44             byte[] data = bos.toByteArray();
45             bos.close();
46             return data;
47         } catch (Exception e) {
48             e.printStackTrace();
49         }
50         return null;
51     }
52 }
时间: 2024-10-12 18:32:36

JAVA中发送电子邮件的方法的相关文章

java中的jdbc连接数据库方法及应用

jdbc连接数据库的口诀:猪脸特直观 import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Demo03 { public static void main(String[] args) thr

Java中vector的使用方法

Vector的使用 vector类底层数组结构的,它包含可以使用整数索引进行访问的组件.不过,vector的大小可以根据需要增大或缩小,以适应创建vector后进行添加或移除项的操作,因此不需要考虑元素是否越界或者会不会浪费内存的问题. 由vector的iterator和listIterator方法所返回的迭代器是快速失败的:也即是它不能并发执行操作.如果在迭代器创建后的任意时间从结构上修改了向量(通过迭代器自身的remove或add方法之外的任何其他方式),则迭代器将抛出ConcurrentM

Java中Integer类的方法

字段摘要 static int MAX_VALUE              保持 int 类型的最大值的常量可取的值为 231-1. static int MIN_VALUE              保持 int 类型的最小值的常量可取的值为 -231. static int SIZE              以二进制补码形式表示 int 值的位数. static Class<Integer> TYPE              表示基本类型 int 的 Class 实例. 构造方法摘要

java中substring的使用方法

str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str: str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex開始至endIndex结束时的字符串,并将其赋值给str; 下面是一段演示程序: public class StringDemo{ public static void main(String agrs[]){ Str

转- 关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("现在时间

Java中循环声明变量方法

Java循环声明变量 之前想这样做,但是网上一直搜索不到,下面是我的方式 项目中 // 得到需要查询外表的数量,然后分别创建缓存,插入数据多的时候如果编码在缓存里面,就不需要再去查询数据库了.key:code/value:pk // 根据"数据来源"有多少非空的 就创建几个,使用 "数据来源字段"+Cache 当cacheMap的key Map<String, Map<String, String>> cacheMap =new HashMa

关于时间,日期,星期,月份的算法(Java中Calendar的使用方法)(一)

package cn.outofmemory.codes.Date; import java.util.Calendar; import java.util.Date; public class CalendarDemo { public static void main(String[] args) { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); System.out.println("现在时间

java中字符串切割的方法总结

StringTokenizer最快 ,基本已经不用了,除非在某些需要效率的场合.Scanner最慢. String和Pattern速度差不多.Pattern稍快些. String和Pattern的split 方法效率相当,常用 public   static   void  main(String [] args){ long  start = System.currentTimeMillis(); for ( int  i= 0 ;i< 100000 ;i++){ test1(); } lon

Java中StringBuffer类append方法的使用

Java中StringBuffer类append方法的使用 append方法的作用是在一个StringBuffer对象后面追加字符串. 例如StringBuffer s = new StringBuffer("Hello");s.append("World");则s的内容是HelloWorld