gpt4 book ai didi

oracle - PL/SQL 发送带附件的电子邮件?

转载 作者:行者123 更新时间:2023-12-04 22:24:14 24 4
gpt4 key购买 nike

我们有一个文件保存为 BLOB 的表

我写了一个代码,将这些文件作为附件通过电子邮件发送!

到目前为止一切正常,但是程序无法读取文件(EXCEL,PDF,......什么的),只有文本文件和 excel 会打开,但在出现一些错误消息后,PDF 根本无法打开!

这是有问题的代码部分!

utl_smtp.write_data( l_connection, '--'|| l_boundary || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Type: application/octet-stream' || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Disposition: attachment; filename="' || V_NAME || '"' || utl_tcp.crlf);
utl_smtp.write_data( l_connection, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data( l_connection, utl_tcp.crlf );

v_length := dbms_lob.getlength(V_BLOB_CONTENT);

while v_offset < v_length loop
dbms_lob.read( V(i).BLOB_CONTENT, v_buffer_size, v_offset, v_raw );
utl_smtp.write_raw_data( l_connection, utl_encode.base64_encode(v_raw) );
utl_smtp.write_data( l_connection, utl_tcp.crlf );
v_offset := v_offset + v_buffer_size;
end loop while_loop;

utl_smtp.write_data( l_connection, utl_tcp.crlf );

有什么建议么?

最佳答案

这是我用来做的一个程序

  PROCEDURE StreamAttachmentToConn( p_conn       IN OUT utl_smtp.connection
,p_boundary IN raw
,p_FileName IN VARCHAR2
,p_FileData IN BLOB) PARALLEL_ENABLE
AS
l_len integer := 0 ;
l_idx integer := 1 ;
l_buff_size integer := 57 ;
l_raw raw(57) ;
BEGIN

-- Attachment
utl_smtp.write_data( p_conn, '--' || p_boundary || utl_tcp.crlf );
utl_smtp.write_data( p_conn, 'Content-Type: application/octet-stream' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, 'Content-Disposition: attachment; ' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, ' filename="' || p_FileName || '"' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, 'Content-Transfer-Encoding: base64' || utl_tcp.crlf );
utl_smtp.write_data( p_conn, utl_tcp.crlf );
-- Loop through the blob
-- chuck it up into 57-byte pieces
-- and base64 encode it and write it into the mail buffer
l_len := dbms_lob.getlength(p_FileData);

-- force reinit on this may change
l_buff_size := 57 ;
l_idx := 1;

while l_idx < l_len loop
dbms_lob.read( p_FileData , l_buff_size, l_idx, l_raw );

utl_smtp.write_raw_data( p_conn, utl_encode.base64_encode(l_raw) );

utl_smtp.write_data( p_conn, utl_tcp.crlf );

l_idx := l_idx + l_buff_size;
end loop;
END StreamAttachmentToConn;

我使用它向单个电子邮件添加多个附件。对我来说就像一个冠军。

一件事, p_boundary 作为

l_boundary raw(32) := sys_guid();



我看到您已经有了一个 l_boundary,这就是您应该使用的。

这是基于 http://christopherbeck.wordpress.com/category/plsql/http://www.oracle-base.com/articles/misc/EmailFromOraclePLSQL.php#attachment
.

然后在您的代码中,只需传入您的 smtp 连接、l_boundary(即 RAW sys_guid 或您正在使用的任何内容、文件名(它将出现在电子邮件附件中)和 BLOB。

*编辑-->附加信息*

我们的假设是相同的:

--> assume v_offset starts with 1 --> v_buffer_size assume 57



但是 我注意到你必须遵循一个命令才能让它工作(特别是,把附件放在 body 之后的 END 旁边!!!
  • 连接逻辑
  • 添加所有收件人
  • 标题逻辑:“FROM”,主题
  • 正文逻辑(正文等)
  • 附件
  • 然后在附件关闭电子邮件后(这是我在附件之后的具体内容:

  • utl_smtp.write_data( l_conn, utl_tcp.crlf );

    -- Close Email
    utl_smtp.write_data( l_conn, '--' || l_boundary || '--' || utl_tcp.crlf );
    utl_smtp.write_data( l_conn, utl_tcp.crlf || '.' || utl_tcp.crlf );
    utl_smtp.close_data( l_conn );
    utl_smtp.quit( l_conn );

    关于oracle - PL/SQL 发送带附件的电子邮件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7753457/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com