java 代码发邮件怎么添加附件

java 代码发邮件怎么添加附件,第1张

实现java发送邮件的过程大体有以下几步:

准备一个properties文件,该文件中存放SMTP服务器地址等参数。

利用properties创建一个Session对象

利用Session创建Message对象,然后设置邮件主题和正文

利用Transport对象发送邮件

需要的jar有2个:activation.jar和mail.jar发送附件,需要用到Multipart对象。

import java.io.File

import java.io.IOException

import java.io.InputStream

import java.util.Properties

import javax.activation.DataHandler

import javax.activation.DataSource

import javax.activation.FileDataSource

import javax.mail.BodyPart

import javax.mail.Message

import javax.mail.MessagingException

import javax.mail.Multipart

import javax.mail.Session

import javax.mail.Transport

import javax.mail.internet.InternetAddress

import javax.mail.internet.MimeBodyPart

import javax.mail.internet.MimeMessage

import javax.mail.internet.MimeMultipart

import javax.mail.internet.MimeUtility

public class JavaMailWithAttachment {

    private MimeMessage message

    private Session session

    private Transport transport

    private String mailHost = ""

    private String sender_username = ""

    private String sender_password = ""

    private Properties properties = new Properties()

    /*

     * 初始化方法

     */

    public JavaMailWithAttachment(boolean debug) {

        InputStream in = JavaMailWithAttachment.class.getResourceAsStream("MailServer.properties")

        try {

            properties.load(in)

            this.mailHost = properties.getProperty("mail.smtp.host")

            this.sender_username = properties.getProperty("mail.sender.username")

            this.sender_password = properties.getProperty("mail.sender.password")

        } catch (IOException e) {

            e.printStackTrace()

        }

        session = Session.getInstance(properties)

        session.setDebug(debug)// 开启后有调试信息

        message = new MimeMessage(session)

    }

    /**

     * 发送邮件

     * 

     * @param subject

     *            邮件主题

     * @param sendHtml

     *            邮件内容

     * @param receiveUser

     *            收件人地址

     * @param attachment

     *            附件

     */

    public void doSendHtmlEmail(String subject, String sendHtml, String receiveUser, File attachment) {

        try {

            // 发件人

            InternetAddress from = new InternetAddress(sender_username)

            message.setFrom(from)

            // 收件人

            InternetAddress to = new InternetAddress(receiveUser)

            message.setRecipient(Message.RecipientType.TO, to)

            // 邮件主题

            message.setSubject(subject)

            // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件

            Multipart multipart = new MimeMultipart()

            

            // 添加邮件正文

            BodyPart contentPart = new MimeBodyPart()

            contentPart.setContent(sendHtml, "text/htmlcharset=UTF-8")

            multipart.addBodyPart(contentPart)

            

            // 添加附件的内容

            if (attachment != null) {

                BodyPart attachmentBodyPart = new MimeBodyPart()

                DataSource source = new FileDataSource(attachment)

                attachmentBodyPart.setDataHandler(new DataHandler(source))

                

                // 网上流传的解决文件名乱码的方法,其实用MimeUtility.encodeWord就可以很方便的搞定

                // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码

                //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder()

                //messageBodyPart.setFileName("=?GBK?B?" + enc.encode(attachment.getName().getBytes()) + "?=")

                

                //MimeUtility.encodeWord可以避免文件名乱码

                attachmentBodyPart.setFileName(MimeUtility.encodeWord(attachment.getName()))

                multipart.addBodyPart(attachmentBodyPart)

            }

            

            // 将multipart对象放到message中

            message.setContent(multipart)

            // 保存邮件

            message.saveChanges()

            transport = session.getTransport("smtp")

            // smtp验证,就是你用来发邮件的邮箱用户名密码

            transport.connect(mailHost, sender_username, sender_password)

            // 发送

            transport.sendMessage(message, message.getAllRecipients())

            System.out.println("send success!")

        } catch (Exception e) {

            e.printStackTrace()

        } finally {

            if (transport != null) {

                try {

                    transport.close()

                } catch (MessagingException e) {

                    e.printStackTrace()

                }

            }

        }

    }

    public static void main(String[] args) {

        JavaMailWithAttachment se = new JavaMailWithAttachment(true)

        File affix = new File("c:\\测试-test.txt")

        se.doSendHtmlEmail("邮件主题", "邮件内容", "xxx@XXX.com", affix)//

    }

}

可以用Spire.Pdf for Java类库给PDF文档添加附件,下面的代码是插入Excel和Word附件给你参考:

import com.spire.pdf.annotations.*

import com.spire.pdf.attachments.PdfAttachment

import com.spire.pdf.graphics.*

import java.awt.*

import java.awt.geom.Dimension2D

import java.awt.geom.Rectangle2D

import java.io.File

import java.io.FileInputStream

import java.io.IOException

public class AttachFiles {

public static void main(String[] args) throws IOException {

//创建PdfDocument对象

PdfDocument doc = new PdfDocument()

//加载PDF文档

doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\sample.pdf")

//添加附件到PDF

PdfAttachment attachment = new PdfAttachment("C:\\Users\\Administrator\\Desktop\\使用说明书.docx")

doc.getAttachments().add(attachment)

//绘制标签

String label = "财务报表.xlsx"

PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("Arial Unicode MS",Font.PLAIN,12),true)

double x = 35

double y = doc.getPages().get(0).getActualSize().getHeight() - 200

doc.getPages().get(0).getCanvas().drawString(label, font, PdfBrushes.getOrange(), x, y)

//添加注释附件到PDF

String filePath = "C:\\Users\\Administrator\\Desktop\\财务报表.xlsx"

byte[] data = toByteArray(filePath)

Dimension2D size = font.measureString(label)

Rectangle2D bound = new Rectangle2D.Float((float) (x + size.getWidth() + 2), (float) y, 10, 15)

PdfAttachmentAnnotation annotation = new PdfAttachmentAnnotation(bound, filePath, data)

annotation.setColor(new PdfRGBColor(new Color(0, 128, 128)))

annotation.setFlags(PdfAnnotationFlags.Default)

annotation.setIcon(PdfAttachmentIcon.Graph)

annotation.setText("点击打开财务报表.xlsx")

doc.getPages().get(0).getAnnotationsWidget().add(annotation)

//保存文档

doc.saveToFile("Attachments.pdf")

}

//读取文件到byte数组

public static byte[] toByteArray(String filePath) throws IOException {

File file = new File(filePath)

long fileSize = file.length()

if (fileSize >Integer.MAX_VALUE) {

System.out.println("file too big...")

return null

}

FileInputStream fi = new FileInputStream(file)

byte[] buffer = new byte[(int) fileSize]

int offset = 0

int numRead = 0

while (offset <buffer.length &&(numRead = fi.read(buffer, offset, buffer.length - offset)) >= 0) {

offset += numRead

}

if (offset != buffer.length) {

throw new IOException("Could not completely read file "

+ file.getName())

}

fi.close()

return buffer

}

}

效果:


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11855152.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-19
下一篇2023-05-19

发表评论

登录后才能评论

评论列表(0条)

    保存