当前位置: 首页 > 工具软件 > W3Perl > 使用案例 >

Perl中调用路径接口(返回值为json)发送邮件

莫英卓
2023-12-01

1.在controllers目录下写一个接口类
interfacemethod.php

function getjsondata()
{
    if($_SERVER['REMOTE_ADDR'] == '127.0.0.1')
    {
        $url = $_SERVER['REQUEST_URI'];//获取传来的路径
        $id = intval(substr($url,35));//截取方法获取id
        $sql = 'select id,taskname,url,username,userid from t_user where operator =? ;';
        $tasks = $this->db->query($sql,array($id))->result();
        $data = array();
        foreach($tasks as $task)
        {
            array_push($data,array('id'=>$task->id,'taskname'=>$task->name,'url'=>$task->url));

        }
        $bigdata['data'] = $data;
        echo json_encode($bigdata);
    }
}

2.Perl中调用接口
sendmail.pl

#!/usr/bin/perl
use lib '/usr/email'
use ning_mysql; //数据库
use Sendmail; //发送邮件
use strict; //定义变量
use Encode; 
use MIME::Base64; //邮件主题让其不出现中文乱码
use warnings; //警告

//调用json需要的
use LWP::Simple;
use URI::Escape;
use JSON;
use LWP::UserAgent;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
#use utf8; 此处不能使用这个,若是用了json传来的值的显示会是乱码

sub sendmailcontent
{
    my $mailheader = <<HTML_HEAD;
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<html>
<meta charset="UTF-8">
<meta http-equiv="Content-Type" contect="text/html;charset=utf-8">
<head><title>DNS检测报告</title>
<TABLE border=0 cellSpacing=0 cellPadding=0 width="100%" align=center>
<TBODY>
<TR>
<TD style="PADDING-BOTTOM: 40px; BACKGROUND-COLOR: #f2f2f2; PADDING-LEFT: 20px; PADDING-RIGHT: 20px; PADDING-TOP: 40px">
<TABLE style="MARGIN: 0px auto" border=0 cellSpacing=0 cellPadding=0 width=660 align=center>
<TBODY>
<TR>
<TD align=left>
<DIV style="MARGIN-BOTTOM: 0.4em"></DIV>
<DIV style="BORDER-BOTTOM: #d5d5d5 1px solid; BORDER-LEFT: #d5d5d5 1px solid; BACKGROUND-COLOR: #fff; FONT-FAMILY: 微软雅黑, 宋体; FONT-SIZE: 14px; BORDER-TOP: #d5d5d5 1px solid; BORDER-RIGHT: #d5d5d5 1px solid">
<DIV style="PADDING-BOTTOM: 1em; BACKGROUND-COLOR: #0099cc; PADDING-LEFT: 1.5em; PADDING-RIGHT: 1.5em; COLOR: #fff; PADDING-TOP: 1em">
<DIV style="FONT-SIZE: 36px">
<H3 align=center><FONT size=6>添加任务报告</FONT></H3></DIV></DIV>
<DIV style="PADDING-BOTTOM: 1.5em; LINE-HEIGHT: 1.5; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 1.5em">
<DIV style="PADDING-BOTTOM: 0px; PADDING-LEFT: 1.5em; PADDING-RIGHT: 1.5em; PADDING-TOP: 0px">
HTML_HEAD

    connection_db();
    my %result;
    my $resultcount;
    my $sql = 'select * from t_user where DATE_ADD(inserttime,INTERVAL  days  SECOND)<now();';
    if(($resultcount = &ning_mysql::mysql_execute($sql,\%result)) < 0)
    {
        print 'Error:SQL:'.$sql.'执行失败\n';
        &ning_mysql::mysql_close;
        exit 1;

    }
for(my $i = 0; $i < $resultcount ; $i++)
{
my $basic_info;
my $cur_time=`date`;
    $basic_info=<<HTML_BASIC_INFO;
<DIV style="MARGIN-BOTTOM: 1em; FONT-WEIGHT: bold"> 亲爱的 【<A href="mailto:$result{$i}{username}">$result{$i}{username}</A>】:</DIV>
<DIV style="MARGIN-BOTTOM: 0.5em">您好!欢迎使用,</DIV>
<h3>【基本信息】</h3>
<DIV style="MARGIN-BOTTOM: 0.5em">检测的站点:<A href="$result{$i}{url}" target=_blank>$result{$i}{url}</A>; <BR>检测结束时间:$cur_time;</DIV>
<DIV style="MARGIN-BOTTOM: 0.5em">
HTML_BASIC_INFO 

#调用接口后取json返回值

my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;    

my dataurl = 'http://127.0.01/interfacemethod/getjsondata?id=$result{$i}{userid}';
my dataresponse = $ua->get($dataurl);
my availible;
my $avalible_info;

if($dataresponse->is_success)  
{
    my $data_info = $dataresponse->decoded_content;
    my $json = new JSON();
    my $json_obj = $json->decode($data_info);
    #循环json取值
    foreach my $errordata (@{$json_obj->{"errordata"}})
    {

        my $taskname= $errordata->{"taskname"};
        my $url= $errordata->{"url"};
        my $username = $errordata->{"username"};


$avalible=<<HTML_VUL_SUM_BEGIN;
HTML_VUL_SUM_BEGIN

                    $avalible_info.="<tr>\r\n";
                    $avalible_info.="<td><b>".$taskname."</b></td>\r\n";
                    $avalible_info.="<td><b>".$url."</b></td>\r\n";
                    $avalible_info.="<td><b>".$username."</b></td>\r\n";
                    $avalible_info.="</tr>\r\n";
    }
}
$avalible .=<<HTML_VUL_SUM_BEGIN;
<h3>【今日任务监控】</h3>
<br /><br />
<table id="t_stats"  border="2" align="center" cellspacing="2" cellpadding="2"> 
<tr> 
<th>任务名称</th><th>URL</th><th>用户</th>
</tr>
HTML_VUL_SUM_BEGIN
# $avalible.=encode("utf8",decode("utf8",$avalible_info));;
$avalible.=encode("utf8",$avalible_info);;#页面显示编码

$avalible.=<<HTML_VUL_SUM_END;
</table>
<br /><br />
HTML_VUL_SUM_END
my $mailbody=$mailheader;
$mailbody .=$basic_info;
$mailbody .=$avalible;
$mailbody .=<<HTML_VUL_INFO_BEGIN;
<TABLE style="LINE-HEIGHT: 1.2; MARGIN: 0px auto; WIDTH: 650px; COLOR: #999; FONT-SIZE: 12px">
<TBODY>
<TR>
<TD>
<DIV style="MARGIN-BOTTOM: 0.5em">此为系统邮件,请勿直接回复。</DIV>
<TD style="TEXT-ALIGN: right"></TD></TR></TBODY></TABLE></DIV></DIV></DIV></DIV>
<DIV style="TEXT-ALIGN: center; FONT-FAMILY: 微软雅黑, 宋体; COLOR: #999; FONT-SIZE: 12px; PADDING-TOP: 0.5em"> 2015 </DIV></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
HTML_VUL_INFO_BEGIN
        $mailbody .="</body></html>";
        my $alarmcontext = "检测任务详情";
         send_mail($alarmcontext,2,$result{$i}{url},$result{$i}{username},$result{$i}{email},$mailbody);

#更新发送邮件最后时间
        $sql="update  t_user set inserttime=now() where id=$result{$i}{id};";
        if( &ning_mysql::mysql_execute($sql, undef) < 0)
            {
                print "ERROR:SQL:".$sql."执行失败\n";
                &ning_mysql::mysql_close;
                exit 1;
            }
}

}
sub send_mail
{
    my $alarmcontext=$_[0];
    my $type=$_[1];
    my $taskurl=$_[2];
    my $username=$_[3];
    my $email=$_[4];
    my $mailbody= $_[5];
    my $emailsubject="=?UTF-8?B?".encode_base64($alarmcontext)."?=";#邮件主题的中文乱码解决方式

    #从文件读取邮件信息
    my %mail_conf = ();
    my $DBCONF;
    #sendmail.conf存储的是发送者的邮箱名和密码

    #下面是取出sendmail.conf存储的信息 
    open($DBCONF, '<sendmail.conf') or die "can't open the sendmail configure file in sendmail.pm\n";
    my $emailsender;
    while(my $line = <$DBCONF>)
    {
        chomp $line;
        (my $name, my $info) = (split /:/, $line)[0,1];
        $mail_conf{$name} = $info;
        $mail_conf{$name} =~ s/\s//g;


    }
    close $DBCONF;

    $emailsender=$mail_conf{username};#邮件发送者
    my @array;
    @array=split(";",$email);#邮件接受者

    for (my $j = 0; $j <=$#array; $j++)
    {       
        print $array[$j],"\n";
        Sendmail::sendmail($emailsender,$array[$j],$emailsubject,\$mailbody);

    }
}
sub connection_db
{
    my $DBCONF;
    #存储数据库信息的文件
    use constant DB_CONF_FILE=>'/usr/db.conf';
    my %db_conf = ();
    #从文件读取数据库信息
    open($DBCONF, DB_CONF_FILE) or die "can't open the database configure file in modifycheck.pl\n";
    while(my $line = <$DBCONF>)
    {
        chomp $line;
        (my $name, my $info) = (split /:/,$line)[0,1];
        $db_conf{$name} = $info;
        $db_conf{$name} = ~s/\s//g;
    }
    close $DBCONF;
    &ning_mysql::set_mysql_var($db_conf{dbname}, $db_conf{user}, $db_conf{pass}, $db_conf{host}, undef, $db_conf{port});
    &ning_mysql::mysql_conn;
    my $sql= "SET NAMES 'UTF8'";
    if( &ning_mysql::mysql_execute($sql, undef) < 0)
    {
        print "ERROR:SQL:".$sql."执行失败\n";
        &ning_mysql::mysql_close;
        exit 1;
    }
}
sendmailcontent();

3.需要的配置文件
sendmail.conf

serverip:smtp.qq.com
username:zhangsan@qq.com
password:zhangsan123

db.conf

host:localhost
port:3306
pass:
dbname:databasename
 类似资料: