邮件附件base64解码的问题

1、附件的BASE64编码中可能含有空白字符(回车(2个字符),tab,空白),从而导致用length计算出来的不是实际的base串长度。如一段串,反复出错,原串是以=结束,最后是一个回车,

在word中,统计得到

而在调试中得到的值却是33027,刚好等于32221+403*2。

2、base串规定,只有A-Z,a-z,0-9,+/是合法字符,=是尾部填充字符,其余空白字符(Tab、空格、回车和换行)将被忽略。而允许的填充=只能是0,1,2。

3、显然原来的串的填充是有问题的,因而需要把原来串中的空白符和填充符去掉,重新计算。

4、不过,从web,foxmail,本程序中得到的附件文件居然都不一样,差几个字符!!!也不知道谁对?

代码为:

                    Dim i_add As Integer '补充的字符串的长度
                    Dim s_content As String
                    '过滤
                    s_content = buffer.Substring(start)
                    s_content = s_content.Replace(vbCrLf, "")
                    s_content = s_content.Replace(vbTab, "")
                    s_content = s_content.Replace(" ", "")
                    s_content = s_content.Replace("=", "")
                    '补充字符数
                    i_add = 4 - (s_content.Length Mod 4)
                    i_add = IIf(i_add = 4, 0, i_add)
                    '补齐
                    Dim s_add As String = New String("=", i_add)
                    s_content = s_content & s_add

                    Me.data = System.Convert.FromBase64String(s_content)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用Delphi2010 实现邮件附件收发功能 TIdPOP3组件简介 TIdPOP3 是用来接收邮件服务器的邮件信息到用户端的一个组件。它实现了RFC 1939协议。 在使用TIdPOP3组件时需设置它的几个成员属性。 Host :指定邮件服务器,一般为pop3邮件服务器的地址,如 pop3.126.com。 Username :用户名,也就是邮箱名,如[email protected]。 Password :邮箱密码,在进行收发邮件时组件需要凭密码进行登录。 其它成员属性 Connected:返回它与邮件服务器的连接状态,这true表示已经连接。 CheckMessages:邮件数,如果连接服务器成功,则可以获得服务器端的邮件数。 成员函数 procedure Connect(const ATimeout: Integer = IdTimeoutDefault); 与服务器连接函数。参数为无效连接时等待的毫秒数。 function RetrieveHeader(const MsgNum: Integer; AMsg: TIdMessage): Boolean; 接收邮件头信息,它有两个参数,MsgNum表示在接收第几个邮件,从1开始,AMsg为邮件消息组件实例。 function Retrieve(const MsgNum: Integer; AMsg: TIdMessage): Boolean; 接收邮件主体信息,它与 RetrieveHeader的参数是一样的。接收的邮件内容将保存在AMsg中。 function Delete(const MsgNum: Integer): Boolean; 删除邮件服务器中第几个邮件。从1开始。 procedure Disconnect; override; 关闭连接。 TIdMessage组件简介 TIdMessage用来支持邮件消息协议,如POP3,SMTP,NNTP等。TIdMessage支持多用途Internet邮件扩展(MIME)协议。 常用的TIdMessage的属性: Subject:邮件主题,这个字符串经过BASE64编码的。所以在使用时需对它进行解码。 MessageParts:这是TIdMessageParts类的一个实例,它用来存储邮件的信息。如邮件内容及附件信息。在进行解析时需要判断它是否为附件或文本,如果为附件时,其文件名是经过BASE64编码的。判断常量分别为TIdText , TIdAttachment。 Body:这是个字符串列表,包含构成该邮件的正文内容。 Form:发送邮件者的地址信息。 Recipients:收件人地址信息。 BccList:抄送地址列表。 CharSet:指示邮件信息中使用的字符集。 ContentType:指定MIME媒体数据类型,描述正文中包含的数据,使用户代理决定如何显示数据,常用的有text/html,text/xml。 TIdSMTP组件简介 TIdSMTP是TIdMessageClient派生出的一个简单邮件传输协议和SMTP客户端。 它的主要功能是发送邮件信息。 常用的属性: Host :SMTP邮件服务器的地址,如smtp.126.com。它与上面的POP3地址不一样。 AuthenticationType:服务器认证类型,它有atNone,atLogin两种,即不需要认证和需要凭用户名和密码进行认证。 Username:用户名,这里与TIdPOP3 有点不一样,即它不需要后缀,如billanking2002 Password:邮箱登录密码。如果AuthenticationType设置了atLongin则必须设置密码和用户名。
发送带有base64格式图片的HTML邮件,可以按照以下步骤进行: 1. 将base64格式的图片解码为字节数组。 2. 使用JavaMail API创建MimeMultipart对象。 3. 创建MimeBodyPart对象,并设置内容为HTML文本,同时将图片以附件形式添加到MimeBodyPart对象中。 4. 将MimeBodyPart对象添加到MimeMultipart对象中。 5. 使用JavaMail API发送邮件。 下面是一个示例代码,用于发送带有base64格式图片的HTML邮件: ```java import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Properties; public class MailSender { public static void main(String[] args) throws Exception { String host = "smtp.gmail.com"; String port = "587"; String username = "你的邮箱地址"; String password = "你的邮箱密码"; Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.port", port); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.starttls.enable", "true"); props.put("mail.smtp.ssl.trust", host); Session session = Session.getDefaultInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); String toEmail = "收件人邮箱地址"; String subject = "测试邮件"; String htmlContent = "<html><body><h1>这是一张图片</h1><br><img src='cid:image'/></body></html>"; String imageBase64 = "base64编码的图片"; MimeMultipart multipart = new MimeMultipart("related"); MimeBodyPart htmlPart = new MimeBodyPart(); htmlPart.setContent(htmlContent, "text/html;charset=UTF-8"); multipart.addBodyPart(htmlPart); byte[] imageData = decodeBase64(imageBase64); DataSource ds = new ByteArrayDataSource(imageData, "image/jpeg"); MimeBodyPart imagePart = new MimeBodyPart(); imagePart.setDataHandler(new DataHandler(ds)); imagePart.setHeader("Content-ID", "<image>"); multipart.addBodyPart(imagePart); Message message = new MimeMessage(session); message.setFrom(new InternetAddress(username)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toEmail)); message.setSubject(subject); message.setContent(multipart); Transport.send(message); } private static byte[] decodeBase64(String base64) { try { InputStream stream = new ByteArrayInputStream(base64.getBytes()); return javax.mail.util.Base64.decodeBase64(stream); } catch (IOException e) { throw new RuntimeException(e); } } private static class ByteArrayDataSource implements DataSource { private final byte[] data; private final String type; public ByteArrayDataSource(byte[] data, String type) { this.data = data; this.type = type; } public InputStream getInputStream() throws IOException { return new ByteArrayInputStream(data); } public OutputStream getOutputStream() throws IOException { throw new IOException("Not supported"); } public String getContentType() { return type; } public String getName() { return "ByteArrayDataSource"; } } } ``` 在上面的代码中,我们使用了JavaMail API发送邮件,并使用了MimeMultipart、MimeBodyPart等类来创建HTML邮件,并将base64格式的图片嵌入到HTML中。同时,我们还使用了javax.mail.util.Base64类对图片进行解码,并使用了ByteArrayDataSource类将字节数组包装成DataSource对象,以便将图片作为附件添加到邮件中。 如果HTML邮件中的中文出现乱码,可以尝试将邮件内容的编码方式设置为UTF-8,如下所示: ```java htmlPart.setContent(htmlContent, "text/html;charset=UTF-8"); ``` 同时,可以将邮箱客户端的编码方式设置为UTF-8,以便正确显示邮件内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值