用Java Mail发送带图片附件的要点

用Java Mail发送带图片附件的要点
1,读入图片的方式:
发现网上讲的很多读取图片的方式都不对,按下面提供的这个方法来读取,保证成功。
 1      private   byte [] getImageBytes(String file)  {
 2        byte[] myData = null;
 3        InputStream input = getClass().getClassLoader().getResourceAsStream(
 4                file);
 5        try {
 6            ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
 7            int ch = 0;
 8            while ((ch = input.read()) != -1{
 9                byteArray.write(ch);
10            }

11            // System.out.println(byteArray.size());
12            myData = byteArray.toByteArray();
13            // System.out.println(myData.length);
14        }
 catch (Exception e) {
15            e.printStackTrace();
16        }

17        return myData;
18    }

2,发送邮件的“机关”
 1         MimeMessage msg  =   new  MimeMessage(mailSession);
 2         msg.setFrom( new  InternetAddress( this .getSenderAddress()));
 3         msg.setSubject( this .getTitle());
 4         msg.setSentDate( new  Date());
 5         Address[] adds  =  InternetAddress.parse(getToAddress());
 6         msg.addRecipients(javax.mail.Message.RecipientType.TO, adds);
 7          //  新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
 8         MimeMultipart mm  =   new  MimeMultipart( " related " );
 9          //  新建一个存放信件内容的BodyPart对象
10         BodyPart mdp  =   new  MimeBodyPart();
11          //  给BodyPart对象设置内容和格式/编码方式
12         mdp.setContent( this .getContent(),  " text/html;charset=utf-8 " );
13          //  这句很重要,千万不要忘了
14         mm.addBodyPart(mdp);
15
16          //  ---------图片处理开始!!!!!!!!!!!!!!!!
17         mdp  =   new  MimeBodyPart();
18          byte  bbb[]  =   new   byte [ 1024   *   10 ];
19          this .getClass().getClassLoader().getResourceAsStream( " notice.jpg " )
20                 .read(bbb);
21         DataHandler dh  =   new  DataHandler( new  ByteArrayDataSource( this
22                 .getImageBytes( " notice.jpg " ),  " application/octet-stream " ));
23         mdp.setDataHandler(dh);
24          //  加上这句将作为附件发送,否则将作为信件的文本内容
25         mdp.setFileName( " 1.jpg " );
26         mdp.setHeader( " content-id " " <IMG1> " );
27          //  将含有附件的BodyPart加入到MimeMultipart对象中
28         mm.addBodyPart(mdp);
29          //  ---------图片处理结束!!!!!!!!!!!!!!!!
30
31          //  把mm作为消息对象的内容
32         msg.setContent(mm);
仔细看代码中的注释吧,相信大有帮助。

3,一个实际应用的完整代码
要求根据一个格式文件和模版,发一封漂亮的邮件,所以需要用到HTML格式来发送邮件。不多说了,看代码吧!

  1import java.io.ByteArrayOutputStream;
  2import java.io.File;
  3import java.io.FileReader;
  4import java.io.IOException;
  5import java.io.InputStream;
  6import java.util.Date;
  7import java.util.HashMap;
  8import java.util.Map;
  9import java.util.Properties;
 10
 11import javax.activation.DataHandler;
 12import javax.mail.Address;
 13import javax.mail.BodyPart;
 14import javax.mail.internet.InternetAddress;
 15import javax.mail.internet.MimeBodyPart;
 16import javax.mail.internet.MimeMessage;
 17import javax.mail.internet.MimeMultipart;
 18import javax.mail.util.ByteArrayDataSource;
 19
 20/** *//**
 21 * 
 22 * @author robin
 23 * @version $Revision: 1.4 $
 24 */

 25public class SendMailUtil {
 26
 27    /** *//**
 28     * Field mailServerAddress.
 29     */

 30    private String mailServerAddress;
 31
 32    /** *//**
 33     * Field user.
 34     */

 35    private String user;
 36
 37    /** *//**
 38     * Field password.
 39     */

 40    private String password;
 41
 42    /** *//**
 43     * Field toAddress.
 44     */

 45    private String toAddress;
 46
 47    /** *//**
 48     * Field ccAddress.
 49     */

 50    private String ccAddress;
 51
 52    /** *//**
 53     * Field title.
 54     */

 55    private String title;
 56
 57    /** *//**
 58     * Field content.
 59     */

 60    private String content;
 61
 62    /** *//**
 63     * Field isHtml.
 64     */

 65    private boolean isHtml = true;
 66
 67    /** *//**
 68     * Field attachmentFiles.
 69     */

 70    private Map attachmentFiles = null;
 71
 72    /** *//**
 73     * Field senereAddress.
 74     */

 75    private String senderAddress;
 76
 77    private byte[] getImageBytes(String file) {
 78        byte[] myData = null;
 79        InputStream input = getClass().getClassLoader().getResourceAsStream(
 80                file);
 81        try {
 82            ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
 83            int ch = 0;
 84            while ((ch = input.read()) != -1{
 85                byteArray.write(ch);
 86            }

 87            // System.out.println(byteArray.size());
 88            myData = byteArray.toByteArray();
 89            // System.out.println(myData.length);
 90        }
 catch (Exception e) {
 91            e.printStackTrace();
 92        }

 93        return myData;
 94    }

 95
 96    public void sendMail() throws Exception {
 97        Properties pos = new Properties();
 98        pos.put("mail.smtp.host""10.5.1.1");
 99        javax.mail.Session mailSession = javax.mail.Session.getInstance(pos,
100                null);
101        MimeMessage msg = new MimeMessage(mailSession);
102        msg.setFrom(new InternetAddress(this.getSenderAddress()));
103        msg.setSubject(this.getTitle());
104        msg.setSentDate(new Date());
105        Address[] adds = InternetAddress.parse(getToAddress());
106        msg.addRecipients(javax.mail.Message.RecipientType.TO, adds);
107        // 新建一个MimeMultipart对象用来存放BodyPart对象(事实上可以存放多个)
108        MimeMultipart mm = new MimeMultipart("related");
109        // 新建一个存放信件内容的BodyPart对象
110        BodyPart mdp = new MimeBodyPart();
111        // 给BodyPart对象设置内容和格式/编码方式
112        mdp.setContent(this.getContent(), "text/html;charset=utf-8");
113        // 这句很重要,千万不要忘了
114        mm.addBodyPart(mdp);
115
116        // ---------图片处理开始!!!!!!!!!!!!!!!!
117        mdp = new MimeBodyPart();
118        byte bbb[] = new byte[1024 * 10];
119        this.getClass().getClassLoader().getResourceAsStream("notice.jpg")
120                .read(bbb);
121        DataHandler dh = new DataHandler(new ByteArrayDataSource(this
122                .getImageBytes("notice.jpg"), "application/octet-stream"));
123        mdp.setDataHandler(dh);
124        // 加上这句将作为附件发送,否则将作为信件的文本内容
125        mdp.setFileName("1.jpg");
126        mdp.setHeader("content-id""<IMG1>");
127        // 将含有附件的BodyPart加入到MimeMultipart对象中
128        mm.addBodyPart(mdp);
129        // ---------图片处理结束!!!!!!!!!!!!!!!!
130
131        // 把mm作为消息对象的内容
132        msg.setContent(mm);
133        msg.saveChanges();
134        javax.mail.Transport transport = mailSession.getTransport("smtp");
135        transport.connect();
136        transport.sendMessage(msg, msg.getAllRecipients());
137        transport.close();
138
139    }

140
141    /** *//**
142     * Method getCcAddress.
143     * 
144     * @return String
145     */

146    public String getCcAddress() {
147        return ccAddress;
148    }

149
150    /** *//**
151     * Method getContent.
152     * 
153     * @return String
154     */

155    public String getContent() {
156        if (content == null{
157            return "";
158        }
 else {
159            return content;
160        }

161    }

162
163    /** *//**
164     * Method getMailServerAddress.
165     * 
166     * @return String
167     */

168    public String getMailServerAddress() {
169        return "10.5.1.1";
170    }

171
172    /** *//**
173     * Method getSenderId.
174     * 
175     * @return String
176     */

177    public String getUser() {
178        if (user == null || user.equals("")) {
179            user = "";
180        }

181        return user;
182    }

183
184    /** *//**
185     * Method getPassword.
186     * 
187     * @return String
188     */

189    public String getPassword() {
190        if (password == null || password.equals("")) {
191            password = "";
192        }

193        return password;
194    }

195
196    /** *//**
197     * Method getTitle.
198     * 
199     * @return String
200     */

201    public String getTitle() {
202        if (title == null{
203            return "";
204        }
 else {
205            return title;
206        }

207    }

208
209    /** *//**
210     * Method getToAddress.
211     * 
212     * @return String
213     */

214    public String getToAddress() {
215        return toAddress;
216    }

217
218    /** *//**
219     * Method isHtml.
220     * 
221     * @return boolean
222     */

223    public boolean isHtml() {
224        return isHtml;
225    }

226
227    /** *//**
228     * Method setCcAddress.
229     * 
230     * @param ccAddress
231     *            String
232     */

233    public void setCcAddress(String ccAddress) {
234        this.ccAddress = ccAddress;
235    }

236
237    /** *//**
238     * Method setContent.
239     * 
240     * @param content
241     *            String
242     */

243    public void setContent(String content) {
244        this.content = content;
245    }

246
247    /** *//**
248     * Method setMailServerAddress.
249     * 
250     * @param mailServerAddress
251     *            String
252     */

253    public void setMailServerAddress(String mailServerAddress) {
254        this.mailServerAddress = mailServerAddress;
255    }

256
257    /** *//**
258     * Method setUser.
259     * 
260     * @param user
261     *            String
262     */

263    public void setUser(String user) {
264        this.user = user;
265    }

266
267    /** *//**
268     * Method setSenderPassword.
269     * 
270     * @param password
271     *            String
272     */

273    public void setPassword(String password) {
274        this.password = password;
275    }

276
277    /** *//**
278     * Method setTitle.
279     * 
280     * @param title
281     *            String
282     */

283    public void setTitle(String title) {
284        this.title = title;
285    }

286
287    /** *//**
288     * Method setToAddress.
289     * 
290     * @param toAddress
291     *            String
292     */

293    public void setToAddress(String toAddress) {
294        this.toAddress = toAddress;
295    }

296
297    /** *//**
298     * Method setIsHtml.
299     * 
300     * @param isHtml
301     *            boolean
302     */

303    public void setIsHtml(boolean isHtml) {
304        this.isHtml = isHtml;
305    }

306
307    /** *//**
308     * Method setAttachmentFiles.
309     * 
310     * @param attachmentFiles
311     *            Map
312     */

313    public void setAttachmentFiles(Map attachmentFiles) {
314        this.attachmentFiles = attachmentFiles;
315    }

316
317    /** *//**
318     * Method getAttachmentFiles.
319     * 
320     * @return Map
321     */

322    public Map getAttachmentFiles() {
323        return attachmentFiles;
324    }

325
326    /** *//**
327     * Method setHtml.
328     * 
329     * @param isHtml
330     *            boolean
331     */

332    public void setHtml(boolean isHtml) {
333        this.isHtml = isHtml;
334    }

335
336    /** *//**
337     * Method getSenderAddress.
338     * 
339     * @return String
340     */

341    public String getSenderAddress() {
342        return senderAddress;
343    }

344
345    /** *//**
346     * Method setSenderAddress.
347     * 
348     * @param senderAddress
349     *            String
350     */

351    public void setSenderAddress(String senderAddress) {
352        this.senderAddress = senderAddress;
353    }

354
355    public String readMailTemplate(String year, String season)
356            throws IOException {
357        ClassLoader loder = this.getClass().getClassLoader();
358        InputStream is = loder.getResourceAsStream("t.html");
359        byte[] buf = new byte[1024 * 5];
360        is.read(buf);
361        String t = new String(buf, "utf-8");
362        t = t.replaceFirst("#year", year);
363        t = t.replaceFirst("#season", season);
364        // System.out.println(t);
365        return t;
366    }

367
368    public static void sendNoticeMail(String title, String year, String season,
369            String sender, File f) {
370        SendMailUtil logic = new SendMailUtil();
371        try {
372            logic.setTitle(title);
373            // logic.setMailServerAddress("10.5.1.1");
374            String temp = logic.readMailTemplate(year, season);
375            logic.setSenderAddress(sender);
376            FileReader fr = new FileReader(f);
377
378            char[] ch = new char[new Long(f.length()).intValue()];
379            fr.read(ch);
380            StringBuffer sb = new StringBuffer(new Long(f.length()).intValue());
381            for (int i = 0; i < ch.length; i++{
382                sb.append(ch[i]);
383            }

384            String[] all = sb.toString().split("\n");
385
386            // System.out.println(sb.toString());
387            for (int i = 0; i < all.length; i++{
388                if (all[i].equals("")) {
389                    continue;
390                }

391                String t = temp;
392                String[] item = all[i].split(",");
393                logic.setToAddress(item[2]);
394                // 处理内容
395                t = t.replaceFirst("#name", item[1+ "(" + item[0+ ")");
396                t = t.replaceAll("#total", item[3]);
397                t = t.replaceFirst("#tax", item[4]);
398                t = t.replaceFirst("#actualTotal", item[5]);
399                logic.setContent(t);
400                logic.sendMail();
401            }

402        }
 catch (Exception e) {
403            e.printStackTrace();
404        }

405    }

406}


4,小技巧
我第一次发送后,发现读取图片的程序不对,在Outlook 2003中打开邮件,发现没有出现图片,搞半天也不知道是什么原因,后来我用FoxMail打开邮件,发现图片附件上打了个叉叉,才知道是附件中的图片读取不对,如果你有这样的问题,不妨换个Mail客户端试试。

你可能感兴趣的:(用Java Mail发送带图片附件的要点)